2

我正在尝试将内存映射文件用作:

hFile = ::CreateFile(State.Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
                                 0, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, 0);//open the file

if(hFile !=INVALID_HANDLE_VALUE){
hMap= ::CreateFileMapping(hFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0);//create Mem mapping for the file in virtual memory
if( hMap!=NULL){
base = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);//load the mapped file into the RAM
//start to compare some bytes (values) from mspaint.exe file in Win7
if( *((BYTE *)base + 0x1C3DF0)== 0x05 )
i++; 
if( *((BYTE *)base + 0x25250C)== 0x21 )
i++;
if( *((BYTE *)base + 0x25272A)== 0x97 )
i++;

if(i==3){
// the file is malicious
}

一旦文件大小达到千兆字节,该MapViewOfFile功能将停止工作,应用程序将崩溃!使用有什么限制MapViewOfFile吗?有什么建议吗?

4

3 回答 3

4

您需要检查返回值!崩溃的另一个原因可以在 MSDN 上的 MapViewOfFile 备注部分找到:

要防止出现 EXCEPTION_IN_PAGE_ERROR 异常,请使用结构化异常处理来保护写入或读取除页面文件之外的文件的内存映射视图的任何代码。

就其他限制而言;显然,视图必须适合您进程的虚拟内存空间,而 32 位进程通常总共只有 2gb。如果您正在处理千兆字节大小的文件,您需要映射较小的视图,而不是一次映射整个文件......

于 2011-11-06T07:11:28.313 回答
3

您的应用程序正在崩溃,因为您没有检查MapViewOfFile错误——如果失败,该函数将返回 0。

至于限制,该函数不能映射大于虚拟内存空间的最大连续空闲块的块。如果您的程序是 32 位的,那么您只有大约 2GB 的可用虚拟内存;最大的连续空闲块会更小,因为您的程序二进制文件、DLL、主线程堆栈和堆将在内存空间的各个位置分配。

于 2011-11-06T07:07:19.263 回答
2

您试图一次将整个文件映射到内存中。您没有足够的虚拟内存来执行此操作。仅映射您实际需要的部分。这就是为什么 CreateFileMapping() 和 MapViewOfFile() 允许您指定映射的大小和偏移量。我使用 MMF 来访问多 GB 文件,您肯定必须将映射的大小保持在最低限度,只需将视图滑动到您需要的位置即可。

于 2011-11-06T07:13:03.003 回答