windows-nt/Source/XPSP1/NT/sdktools/bin2c/bin2c.c
2020-09-26 16:20:57 +08:00

379 lines
7.1 KiB
C

#include <windows.h>
#include <fcntl.h>
#include <io.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
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 <src file> <src file len> <region offset>\n",argv[0]);
printf(" <region length> <dst file> <var name>\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<major; i++) {
bw = fprintf(Out,
"%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",
bufptr[ 0],
bufptr[ 1],
bufptr[ 2],
bufptr[ 3],
bufptr[ 4],
bufptr[ 5],
bufptr[ 6],
bufptr[ 7],
bufptr[ 8],
bufptr[ 9],
bufptr[10],
bufptr[11],
bufptr[12],
bufptr[13],
bufptr[14],
bufptr[15]
);
if(bw <= 0) {
return(2);
}
if((i == major-1) && !minor) {
bw = fprintf(Out,"\n");
} else {
bw = fprintf(Out,",\n");
}
if(bw <= 0) {
return(2);
}
bufptr += 16;
}
if(minor) {
for(i=0; i<minor-1; i++) {
bw = fprintf(Out,"%u,",*bufptr++);
if(bw <= 0) {
return(2);
}
}
bw = fprintf(Out,"%u\n",*bufptr);
}
bw = fprintf(Out,"};\n");
if(bw <= 0) {
return(2);
}
return(0);
}
int
DumpAscii(
LPSTR FileNameIn,
LPSTR FileNameOut,
LPSTR VarName
)
{
HANDLE hFileIn;
HANDLE hFileOut;
HANDLE hMapIn;
HANDLE hMapOut;
LPVOID DataIn;
LPVOID DataOut;
LPSTR din;
LPSTR dout;
DWORD FileSize;
DWORD Bytes;
BOOL LineBegin = TRUE;
//
// open the input file
//
hFileIn = CreateFile(
FileNameIn,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hFileIn == INVALID_HANDLE_VALUE) {
return 1;
}
FileSize = GetFileSize( hFileIn, NULL );
hMapIn = CreateFileMapping(
hFileIn,
NULL,
PAGE_READONLY,
0,
0,
NULL
);
if (!hMapIn) {
return 1;
}
DataIn = (LPSTR) MapViewOfFile(
hMapIn,
FILE_MAP_READ,
0,
0,
0
);
if (!DataIn) {
return 1;
}
//
// open the output file
//
hFileOut = CreateFile(
FileNameOut,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
0,
NULL
);
if (hFileOut == INVALID_HANDLE_VALUE) {
return 1;
}
hMapOut = CreateFileMapping(
hFileOut,
NULL,
PAGE_READWRITE,
0,
FileSize * 2,
NULL
);
if (!hMapOut) {
return 1;
}
DataOut = (LPSTR) MapViewOfFile(
hMapOut,
FILE_MAP_WRITE,
0,
0,
0
);
if (!DataOut) {
return 1;
}
din = DataIn;
dout = DataOut;
sprintf( dout, "char %s[] =\r\n", VarName );
Bytes = strlen(dout);
dout += Bytes;
while( FileSize ) {
if (LineBegin) {
if (*din == ';') {
while (*din != '\n') {
FileSize -= 1;
din += 1;
}
FileSize -= 1;
din += 1;
continue;
}
*dout++ = '\"';
Bytes += 1;
LineBegin = FALSE;
}
FileSize -= 1;
if (*din == '\r') {
din += 1;
*dout++ = '\\';
*dout++ = 'r';
Bytes += 2;
continue;
}
if (*din == '\n') {
din += 1;
*dout++ = '\\';
*dout++ = 'n';
*dout++ = '\"';
*dout++ = '\r';
*dout++ = '\n';
Bytes += 5;
LineBegin = TRUE;
continue;
}
*dout++ = *din++;
Bytes += 1;
}
*dout++ = ';';
*dout++ = '\r';
*dout++ = '\n';
Bytes += 3;
UnmapViewOfFile( DataIn );
CloseHandle( hMapIn );
CloseHandle( hFileIn );
UnmapViewOfFile( DataOut );
CloseHandle( hMapOut );
SetFilePointer( hFileOut, Bytes, NULL, FILE_BEGIN );
SetEndOfFile( hFileOut );
CloseHandle( hFileOut );
return 0;
}