#define _LARGEFILE_SOURCE #define _FILE_OFFSET_BITS 64 #include #include #include #include typedef long long LARGE_INTEGER; typedef char BYTE ; LARGE_INTEGER GetLargeInteger(FILE *fp) { register LARGE_INTEGER li; li = (LARGE_INTEGER) (fgetc(fp) & 0xFF); li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x08) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x10) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x18) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x20) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x28) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x30) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x38) ; return(li); } LARGE_INTEGER GetLargeInteger7(FILE *fp) { register LARGE_INTEGER li; li = (LARGE_INTEGER) (fgetc(fp) & 0xFF); li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x08) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x10) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x18) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x20) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x28) ; li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x30) ; // li |= ((LARGE_INTEGER) (fgetc(fp) & 0xFF) << 0x38) ; return(li); } // Thanks to the chntpw project // see: http://pogostick.net/~pnh/ntpasswd/ static char *w2a(void *string, int len) { int i, k; char *cstring; int out_len = 0; for(i = 0; i < len; i += 2) { // unsigned v = ((unsigned char *)string)[i] + ((unsigned char *)string)[i+1] * 256u; unsigned v = ((unsigned char *)string)[i] + ((unsigned char *)string)[i+1] * 512u; if (v < 256) out_len += 1; else if(v < 0x800) out_len += 2; else out_len += 3; } cstring = (char *) malloc(out_len+1); if (!cstring) { printf("FATAL! ex_next: malloc() failed! Out of memory?\n"); abort(); } for(i = 0, k = 0; i < len; i += 2) { unsigned v = ((unsigned char *)string)[i] + ((unsigned char *)string)[i+1] * 512u; if (v < 256) cstring[k++] = v; else if(v < 0x800) { cstring[k++] = 0xc0 | (v >> 6); cstring[k++] = 0x80 | (v & 0x3f); } else { cstring[k++] = 0xe0 | (v >> 12); cstring[k++] = 0x80 | ((v >> 6) & 0x3f); cstring[k++] = 0x80 | (v & 0x3f); } } cstring[out_len] = '\0'; return cstring; } int ReadXMLInfo(FILE *fp) { LARGE_INTEGER pos=72; fsetpos(fp,(fpos_t *)&pos); LARGE_INTEGER mysize=GetLargeInteger7(fp); pos=80; fsetpos(fp,(fpos_t *)&pos); LARGE_INTEGER lioffset=GetLargeInteger(fp); fsetpos(fp,(fpos_t *)&lioffset); BYTE *buf=malloc(sizeof(BYTE) * mysize); LARGE_INTEGER ilen=fread(buf,mysize,sizeof(BYTE),fp); BYTE *xmlnoheader=(BYTE *)malloc(sizeof(BYTE) * (mysize -2)); memcpy(xmlnoheader,&(buf[2]),mysize-2); char *xmlstring=strdup(w2a(xmlnoheader,mysize-2)); printf("%s",xmlstring); return 0; } int main(int argc, char **argv) { FILE *fp; if (argc != 2) { printf("Usage: wimxmlinfo \n"); exit(0); } // Open input file for reading fp = fopen(argv[1],"r"); if (fp == NULL) { printf("Error opening file\n"); exit(3); } ReadXMLInfo(fp); if( fclose( fp )) printf("Input File close error.\n"); exit(0); }