⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 viewbin.c

📁 查看Windows CE操作系统镜像文件.bin格式文件的源代码
💻 C
字号:
#include <stdio.h> 
#include <stdlib.h> 


#define BIN_SYNC 'B' 
#define ERR_OPENFILE  1 
#define ERR_READFILE  2 
#define ERR_FILETYPE  3 
#define ERR_ALLOCMEM  4 
#define ERR_NOERR   5 
#ifdef N1 

typedef struct _BIN_IMAGE_HEADER{ 
unsigned char sync[7]; 
unsigned long addr; 
unsigned long length; 
}BIN_IMAGE_HEADER; 

typedef struct _BIN_SECTION{ 
unsigned long addr; 
unsigned long length; 
unsigned long checksum; 
}BIN_SECTION; 

void operating_error(FILE* fp_err, int code) 
{ 
switch(code){ 
default: 
fprintf(fp_err,"Unknown error has occurred.\n"); 
break; 
case ERR_OPENFILE: 
fprintf(fp_err,"Open file error.\n"); 
  break; 
case ERR_READFILE: 
fprintf(fp_err,"Read file error.\n"); 
break; 
case ERR_FILETYPE: 
fprintf(fp_err,"wrong input file type.\n"); 
break; 
case ERR_ALLOCMEM: 
fprintf(fp_err,"allocate memory error.\n"); 
break; 
case ERR_NOERR: 
fprintf(fp_err,"no error.\n"); 
break; 
} 

} 

void usage(FILE* fp_err) 
{ 
  
 fprintf(fp_err,"expbin.exe <infile> [outfile] [errfile]\n"); 
 fprintf(fp_err,"Notes:\n"); 
 fprintf(fp_err,"\tinfile : input file for parsing\n"); 
 fprintf(fp_err,"\toutfile: output file for saving results.\n"); 
 fprintf(fp_err,"\terrfile: error file for handling error message.\n"); 
 fprintf(fp_err,"\tCopyright by Carl.Ge 2006,May 8 in China.\n"); 

} 

int main(int argc, char** argv) 
{ 
FILE            *fp_out         = stdout,  
                *fp_in          = stdin,  
                *fp_err         = stderr;       
unsigned char   *section_buffer = 0; 
BIN_IMAGE_HEADER image_header; 
BIN_SECTION      section_header; 
unsigned long    order = 0; 
int  is_legal = 0; 

switch(argc){ 
default: 
break; 
case 2: 
/* one file, it is for input */ 
is_legal = 1; 
fp_in = fopen(argv[1],"r"); 
break; 
case 3: 
/* two files, input and output */ 
is_legal = 1; 
fp_in  = fopen(argv[1],"r"); 
fp_out = fopen(argv[2],"w+"); 
break; 
case 4: 
/* three files, input, output and error*/ 
is_legal = 1; 
fp_in  = fopen(argv[1],"r+b"); 
fp_out = fopen(argv[2],"w+"); 
fp_err = fopen(argv[3],"w+"); 
break; 
} 

if(!is_legal){ 
usage(fp_err); 
return -1; 
} 

if((!fp_in ) || (!fp_out) || (!fp_err) ){ 
operating_error(fp_err,ERR_OPENFILE); 
return -1; 
} 

fread(&image_header, 8 + 7, 1, fp_in); 

fprintf(fp_out, "File Name    :%s\n" 
                "Image Address:%08X\n" 
                "Image Length :%08X\n", 
                argv[1], 
                image_header.addr, 
                image_header.length); 
                 
/* certify its header. */ 
if((unsigned char)image_header.sync[0] != BIN_SYNC){ 
operating_error(fp_err,ERR_FILETYPE); 
    fclose(fp_in); 
fclose(fp_out); 
fclose(fp_err); 
return -1; 
} 

while(!feof(fp_in)){ 

/* read each section. */ 
fread(&section_header, 12, 1, fp_in); 

fprintf(fp_out,"%d(s):\n" 
               "\tStart Address :%08X\n" 
               "\tSection Length:%08X\n" 
               "\tCheck sum     :%08X\n", 
               ++order, 
               section_header.addr, 
               section_header.length, 
               section_header.checksum); 
                
section_buffer = new unsigned char[section_header.length]; 

if(!section_buffer){ 
operating_error(fp_err,ERR_ALLOCMEM); 
   fclose(fp_in); 
fclose(fp_out); 
fclose(fp_err); 
return -1; 
} 

/* read context. */ 
fread(section_buffer, section_header.length, 1, fp_in); 

delete [] section_buffer; 
} 

fclose(fp_in); 
fclose(fp_out); 
fclose(fp_err); 

return 0; 
} 
#else 
typedef char CHAR; 
typedef unsigned char UCHAR; 
typedef unsigned long ULONG; 
typedef char* PCHAR; 
typedef unsigned long* PULONG; 
////////////////////////////////////////// 
// 
// BIN image and record headers 
// 
#pragma pack(1) 
typedef struct // Image header (one per BIN image) 
{ 
    CHAR SyncBytes[7]; 
    ULONG ImageAddr; 
    ULONG ImageLen; 
} IMAGEHDR, *PIMAGEHDR; 

#pragma pack(1) 
typedef struct // Record header (one per section in image) 
{ 
ULONG RecordAddr; 
    ULONG RecordLen; 
    ULONG RecordChksum; 
} RECORDHDR, *PRECORDHDR; 
void operating_error(FILE* fp_err, int code) 
{ 
switch(code){ 
default: 
fprintf(fp_err,"Unknown error has occurred.\n"); 
break; 
case ERR_OPENFILE: 
fprintf(fp_err,"Open file error.\n"); 
  break; 
case ERR_READFILE: 
fprintf(fp_err,"Read file error.\n"); 
break; 
case ERR_FILETYPE: 
fprintf(fp_err,"wrong input file type.\n"); 
break; 
case ERR_ALLOCMEM: 
fprintf(fp_err,"allocate memory error.\n"); 
break; 
case ERR_NOERR: 
fprintf(fp_err,"no error.\n"); 
break; 
} 

} 

void usage(FILE* fp_err) 
{ 
  
 fprintf(fp_err,"expbin.exe <infile> [outfile] [errfile]\n"); 
 fprintf(fp_err,"Notes:\n"); 
 fprintf(fp_err,"\tinfile : input file for parsing\n"); 
 fprintf(fp_err,"\toutfile: output file for saving results.\n"); 
 fprintf(fp_err,"\terrfile: error file for handling error message.\n"); 
 fprintf(fp_err,"\tCopyright by Carl.Ge 2006,May 8 in China.\n"); 

} 
// 
// Load a BIN file into memory and jump to the start address. 
// 
int LoadBINFile(PULONG pImageLoc, FILE* fp_in, FILE* fp_out, FILE* fp_err) 
{ 
    IMAGEHDR  ImageHdr; 
    RECORDHDR RecordHdr; 
PCHAR     cBuffer = 0; 

fseek(fp_in, 0, SEEK_SET); 
    // 
    // Check callers arguments 
    // 
    if (!pImageLoc) 
        return 0; 

*pImageLoc = 0; 


// 
    // Read the BIN file header 
    // 
    if(fread((PCHAR)&ImageHdr, 1, sizeof(IMAGEHDR), fp_in) != sizeof(IMAGEHDR)){ 
return 0; 
    } 
// 
    // Display image header 
// 
#if 1 
    fprintf(fp_out, "\r\nImage Header:\r\n"); 
fprintf(fp_out, "------------------------------------------------\r\n"); 
    fprintf(fp_out, "Sync Bytes ................. '%c%c%c%c%c%c'\r\n", ImageHdr.SyncBytes[0], ImageHdr.SyncBytes[1], ImageHdr.SyncBytes[2], ImageHdr.SyncBytes[3], ImageHdr.SyncBytes[4], ImageHdr.SyncBytes[5]); 
    fprintf(fp_out, "Image Address .............. 0x%08X\r\n", ImageHdr.ImageAddr); 
    fprintf(fp_out, "Image Length ............... 0x%08X\r\n", ImageHdr.ImageLen); 
#endif  // 0. 

    do 
    { 

        // 
        // Read the next BIN file record header 
        // 
if(fread((PCHAR)&RecordHdr, 1, sizeof(RECORDHDR), fp_in) != sizeof(RECORDHDR)){ 
*pImageLoc = RecordHdr.RecordLen; 
break; 
} 
// 
        // Last Header? 
// 
        if (RecordHdr.RecordAddr == 0 && RecordHdr.RecordChksum == 0) 
{ 
            // The last record header contains the image start address (in the length field). 
        // 
            *pImageLoc = RecordHdr.RecordLen; 
            break; 
} 
// 
        // Display Record Header 
// 
#if 1 
        fprintf(fp_out, "Record Header:\r\n"); 
        fprintf(fp_out, "------------------------------------------------\r\n"); 
        fprintf(fp_out, "Record Address ...................... 0x%08X\r\n", RecordHdr.RecordAddr); 
        fprintf(fp_out, "Record Length ....................... 0x%08X\r\n", RecordHdr.RecordLen); 
        fprintf(fp_out, "Record CheckSum ..................... 0x%08X\r\n", RecordHdr.RecordChksum); 
#endif  // 0. 


cBuffer = new char[RecordHdr.RecordLen]; 
if(!cBuffer) 
break; 
        // 
        // Read the entire record into RAM. 
        // 
fread((PCHAR)cBuffer, 1, RecordHdr.RecordLen, fp_in); 

delete [] cBuffer; 
    } 
    while(!feof(fp_in)); 

    return 1; 
} 

int main(int argc, char** argv) 
{ 
FILE            *fp_out         = stdout,  
                *fp_in          = stdin,  
                *fp_err         = stderr;       
unsigned long    start_addr = 0; 
int  is_legal = 0; 

switch(argc){ 
default: 
break; 
case 2: 
/* one file, it is for input */ 
is_legal = 1; 
fp_in = fopen(argv[1],"r"); 
break; 
case 3: 
/* two files, input and output */ 
is_legal = 1; 
fp_in  = fopen(argv[1],"r"); 
fp_out = fopen(argv[2],"w+"); 
break; 
case 4: 
/* three files, input, output and error*/ 
is_legal = 1; 
fp_in  = fopen(argv[1],"r+b"); 
fp_out = fopen(argv[2],"w+"); 
fp_err = fopen(argv[3],"w+"); 
break; 
} 

if(!is_legal){ 
usage(fp_err); 
return -1; 
} 

if((!fp_in ) || (!fp_out) || (!fp_err) ){ 
operating_error(fp_err,ERR_OPENFILE); 
return -1; 
} 

if(LoadBINFile(&start_addr,fp_in,fp_out,fp_err) == 1){ 
fprintf(fp_out, "Start address :0x%08X\n",start_addr); 
} 
else 
operating_error(fp_err,0); 

fclose(fp_in); 
fclose(fp_out); 
fclose(fp_err); 

return 0; 
} 
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -