代码如下:
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格式的。