如何从 C 中的内存映射文件读取 bin 文件(FAT16 分区)?
How to read bin file (FAT16 partition) from a Memory Mapped File in C?
我在 .bin 文件中有一个非常小的 FAT16 分区。
我已经使用以下方法将其映射到内存中:CreateFile、CreateFileMapping 和 MapViewOfFile。
我想做的是读取文件的特定字节。
例如我想读取从 0x36 到 0x3A 的偏移量以检查这是否是 FAT16 分区:
这是我的代码,直到:
#include <Windows.h>
#include <stdio.h>
void CheckError (BOOL condition, LPCSTR message, UINT retcode);
int main(int argc, char *argv[])
{
HANDLE hFile;
HANDLE hMap;
char *pView;
DWORD TamArchivoLow, TamArchivoHigh;
//> open file
hFile =CreateFile (L"disk10mb.bin", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
CheckError(hFile == INVALID_HANDLE_VALUE,"ERROR opening the file", 1);
//> get file size.
TamArchivoLow = GetFileSize (hFile, &TamArchivoHigh);
//> Create the map
hMap = CreateFileMapping (hFile, NULL, PAGE_READWRITE, TamArchivoHigh, TamArchivoLow, NULL);
CheckError(NULL== hMap, "ERROR executing CreateFileMapping", 1);
//> Create the view
pView= (char *) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, TamArchivoLow);
CheckError(NULL==pView, "ERROR executing MapViewOfFile", 1);
// Access the file through pView
//////////////////////////////////////
//////////////////////////////////////
//>Free view and map
UnmapViewOfFile(pView);
CloseHandle(hMap);
CloseHandle(hFile);
return 0;
}
void CheckError (BOOL condition, LPCSTR message, UINT retcode)
{
if (condition)
{
printf ("%s\n", message);
ExitProcess (retcode);
}
}
pview[0x36]
会给你偏移量 0x36 处的字节,依此类推。要检查 FAT16 签名,您可以,例如:
if (pview[0x36] == 'F' && pview[0x37] == 'A' && pview[0x38] == 'T' &&
pview[0x39] == '1' && pview[0x3A] == '6') {
// ...
}
我在 .bin 文件中有一个非常小的 FAT16 分区。 我已经使用以下方法将其映射到内存中:CreateFile、CreateFileMapping 和 MapViewOfFile。
我想做的是读取文件的特定字节。
例如我想读取从 0x36 到 0x3A 的偏移量以检查这是否是 FAT16 分区:
这是我的代码,直到:
#include <Windows.h>
#include <stdio.h>
void CheckError (BOOL condition, LPCSTR message, UINT retcode);
int main(int argc, char *argv[])
{
HANDLE hFile;
HANDLE hMap;
char *pView;
DWORD TamArchivoLow, TamArchivoHigh;
//> open file
hFile =CreateFile (L"disk10mb.bin", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
CheckError(hFile == INVALID_HANDLE_VALUE,"ERROR opening the file", 1);
//> get file size.
TamArchivoLow = GetFileSize (hFile, &TamArchivoHigh);
//> Create the map
hMap = CreateFileMapping (hFile, NULL, PAGE_READWRITE, TamArchivoHigh, TamArchivoLow, NULL);
CheckError(NULL== hMap, "ERROR executing CreateFileMapping", 1);
//> Create the view
pView= (char *) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, TamArchivoLow);
CheckError(NULL==pView, "ERROR executing MapViewOfFile", 1);
// Access the file through pView
//////////////////////////////////////
//////////////////////////////////////
//>Free view and map
UnmapViewOfFile(pView);
CloseHandle(hMap);
CloseHandle(hFile);
return 0;
}
void CheckError (BOOL condition, LPCSTR message, UINT retcode)
{
if (condition)
{
printf ("%s\n", message);
ExitProcess (retcode);
}
}
pview[0x36]
会给你偏移量 0x36 处的字节,依此类推。要检查 FAT16 签名,您可以,例如:
if (pview[0x36] == 'F' && pview[0x37] == 'A' && pview[0x38] == 'T' &&
pview[0x39] == '1' && pview[0x3A] == '6') {
// ...
}