#include #include #include #include #include #include #include #include int dump( char *buffer, unsigned buflen, FILE *Out, char *VarName ); int DumpAscii( LPSTR FileNameIn, LPSTR FileNameOut, LPSTR VarName ); // argv: // // 1 - in filename // 2 - required length // 3 - offset of region in question // 4 - length of region in question // 5 - out filename // 6 - name of variable int __cdecl main( int argc, char *argv[] ) { int In,rc; FILE *Out; void *buffer; unsigned ReqLen,RegStart,RegLen,FileLen; if (argc == 5 && (argv[1][0] == '-' || argv[1][0] == '/') && tolower(argv[1][1]) == 'a') { return DumpAscii( argv[2], argv[3], argv[4] ); } if(argc != 7) { printf("Usage: %s \n",argv[0]); printf(" \n"); return(2); } ReqLen = atoi(argv[2]); RegStart = atoi(argv[3]); RegLen = atoi(argv[4]); In = _open(argv[1],O_RDONLY | O_BINARY); if(In == -1) { printf("%s: Unable to open file %s\n",argv[0],argv[1]); return(2); } FileLen = _lseek(In,0,SEEK_END); if(RegStart > FileLen) { _close(In); printf("%s: Desired region is out of range\n",argv[0]); return(2); } if((unsigned)_lseek(In,RegStart,SEEK_SET) != RegStart) { _close(In); printf("%s: Unable to seek in file %s\n",argv[0],argv[1]); return(2); } if((buffer = malloc(RegLen)) == NULL) { _close(In); printf("%s: Out of memory\n",argv[0]); return(2); } memset(buffer, 0, RegLen); if((unsigned)_read(In,buffer,RegLen) > RegLen) { _close(In); printf("%s: Unable to read file %s\n",argv[0],argv[1]); return(2); } _close(In); Out = fopen(argv[5],"wb"); if(Out == NULL) { printf("%s: Unable to open file %s for writing\n",argv[0],argv[5]); free(buffer); return(2); } rc = dump(buffer,RegLen,Out,argv[6]); if(rc) { printf("%s: Unable to write file %s\n",argv[0],argv[5]); } fclose(Out); free(buffer); return(rc); } int dump( char *buffer, unsigned buflen, FILE *Out, char *VarName ) { unsigned major,minor; unsigned i; unsigned char *bufptr = buffer; int bw; char *DefName; DefName = malloc(strlen(VarName) + 1 + 5); if(DefName == NULL) { return(2); } strcpy(DefName,VarName); _strupr(DefName); strcat(DefName,"_SIZE"); bw = fprintf(Out,"#define %s %u\n\n\n",DefName,buflen); bw = fprintf(Out,"unsigned char %s[] = {\n",VarName); if(bw <= 0) { return(2); } major = buflen/16; minor = buflen%16; for(i=0; i