device-emulator1源代码阅读之判断image格式

代码如下:
bool Load_BIN_NB0_File(const wchar_t *RomImageFile)
{
 static const char Signature[] = "B000FF\n";
 HANDLE hFile;
 HANDLE hMapping;
 unsigned __int8 *RomImage;
 DWORD FileSize;
 hFile = CreateFile(RomImageFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
 if (hFile == INVALID_HANDLE_VALUE) {
  ShowDialog(ID_MESSAGE_UNABLE_TO_OPEN, RomImageFile);
  return false;
 }
   
 DWORD FileSizeHigh;
 FileSize = GetFileSize(hFile, &FileSizeHigh);
 if((FileSize == 0xFFFFFFFF) && (GetLastError() != NO_ERROR )) {
  ShowDialog(ID_MESSAGE_INVALID_ROM_IMAGE);
  return false;
 }
 if(FileSize == 0 || FileSizeHigh != 0) {
  ShowDialog(ID_MESSAGE_INVALID_ROM_IMAGE);
  return false;
 }
 hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
 CloseHandle(hFile);
 if (hMapping == INVALID_HANDLE_VALUE) {
  ShowDialog(ID_MESSAGE_INTERNAL_ERROR);
  return false;
 }
 RomImage = (unsigned __int8*)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
 CloseHandle(hMapping);
 if (!RomImage) {
  ShowDialog(ID_MESSAGE_INTERNAL_ERROR);
  return false;
 }
 unsigned __int8 SigLocal[8];
 if ( !safe_copy( (void *)&SigLocal[0], RomImage, ARRAY_SIZE(SigLocal)) ||
    sizeof(SigLocal) < sizeof(Signature) ||
    FileSize < sizeof(SigLocal))
 {
  return false;
 }
 if (memcmp(SigLocal, Signature, sizeof(Signature)-1) == 0) {
  // BIN file
  // starts with B000FF
  return LoadBINFile(RomImage,FileSize);
 } else if((*((int *)&SigLocal[0]) & 0xea000000) == 0xea000000){
  // NB0 file
  // assumption: always starts with a branch instruction 0xeaXXXXXX
  return LoadNB0File(RomImage, FileSize);
 }
 ShowDialog(ID_MESSAGE_INVALID_ROM_IMAGE_TYPE);
 return false;
}

    根据image文件名来创建映射文件,并获取image文件的大小。接下来主要的工作就是获取image文件前8bytes来判断该image文件是bin还是nb0文件格式。由于两种文件格式的不同,所以要以不同的方式来加载。如果image文件是以B000FF开头的就是bin格式,如果是以0xea000000开头就是nb0格式的。

你可能感兴趣的:(image,格式,WinCE,emulator,休闲)