#include #include #include #include #include "lzx.h" #include "wim.h" BYTE *InitHash(DWORD myint) { unsigned char *mystr=(unsigned char *) &myint; BYTE *result=(BYTE *)malloc(sizeof(BYTE)*20); int i=0; int j=0; for(j=0;j<5;j++) { for(i=0;i<4;i++) { result[i+j*4]=mystr[i]; } } return result; } int main(int argc, char **argv) { FILE *fp; size_t result; if (argc != 4) { printf("ERROR: found %d arguments\n",argc); printf("Usage: updatewim \n"); exit(0); } FILE *actionfile; actionfile=fopen(argv[3],"rb"); if (actionfile == NULL) { printf("ERROR: Can not open action file %s\n",argv[3]); exit(4); } CHAR *action, *arg1, *arg2; // Open input file for reading fp = fopen(argv[1],"rb"); if (fp == NULL) { printf("Error opening input file %s\n",argv[1]); exit(3); } LARGE_INTEGER numoffsets=0; WIM_HEADER Header; ReadWimHeader(fp,&Header); FILE_RESOURCE_HEADER *frh=ReadLookupTable(fp,Header.OffsetTable.Offset,Header.OffsetTable.Size,&numoffsets); BYTE *xml=ReadXML(fp,Header.XmlData.Offset,Header.XmlData.Size); BOOT_META_DATA bmd = ReadBootMetaDataTable(fp,Header.BootMetaData); // PrintBootMetaData(bmd); fseek(actionfile,0,SEEK_SET); DWORD addindex=0; while(fscanf(actionfile,"%as %as %as\r\n",&action,&arg1,&arg2) == 3) { if(!strcmp(action,"rename")) { printf("Renaming file %s to %s\n",arg1,arg2); RenameFile2(bmd.DirEntry,arg1,arg2); } if(!strcmp(action,"add")) { printf("Adding file %s to %s\n",arg1,arg2); BYTE *newhash=InitHash(addindex+1); DIRENTRY *thenewfile=CreateFile(arg1,arg2,newhash); AddFile2(bmd.DirEntry,thenewfile,arg2); addindex++; } if(!strcmp(action,"mkdir")) { printf("Adding dir %s to %s\n",arg1,arg2); BYTE *newhash=InitHash(0); DIRENTRY *thenewdir=CreateDirectory(arg1,arg2,newhash); AddDir(bmd.DirEntry,thenewdir,arg2); } } // PrintBootMetaData(bmd); FILE_RESOURCE_HEADER **newfrhs=malloc(sizeof(FILE_RESOURCE_HEADER *) * addindex + 1); printf("Opening output file\n"); // Open output file for writing FILE *newwim=fopen(argv[2],"wb+"); if (newwim == NULL) { printf("ERROR, Could not open output file %s\n",argv[2]); exit(1); } WriteWimHeader(newwim,&Header); printf("Copying resources\n"); CopyFileResources(fp,newwim,frh,numoffsets); fseek(actionfile,0,SEEK_SET); addindex=0; while(fscanf(actionfile,"%as %as %as\r\n",&action,&arg1,&arg2) == 3) { if(!strcmp(action,"add")) { printf("Adding file resource for %s\n",arg1); newfrhs[addindex]=AddFileResource(arg1,newwim); memcpy(newfrhs[addindex]->Hash,InitHash(addindex+1),20); addindex++; } } printf("Writing metadata\n"); Header.BootMetaData=WriteBootMetaData(newwim,bmd); printf("Writing lookup table\n"); Header.OffsetTable=WriteLookupTable(newwim,frh,numoffsets); printf("Writing additional lookup table\n"); fseek(actionfile,0,SEEK_SET); addindex=0; while(fscanf(actionfile,"%as %as %as\r\n",&action,&arg1,&arg2) == 3) { if(!strcmp(action,"add")) { printf("Writing lookup table entry for %s\n",arg1); WriteLookupTable(newwim,newfrhs[addindex],1); Header.OffsetTable.Size+=50; Header.OffsetTable.OriginalSize+=50; addindex++; } } printf("Writing XML\n"); Header.XmlData=WriteXML(newwim,xml,Header.XmlData.Size); Header.Integrity=WriteIntegrity(newwim); printf("Writing new header\n"); WriteWimHeader(newwim,&Header); if( fclose( fp )) printf("Input File close error.\n"); if( fclose( newwim )) printf("Output File close error.\n"); if( fclose( actionfile )) printf("Action File close error.\n"); exit(0); }