使用MapViewOfFile有什么限制吗?

Is there any limitation for using MapViewOfFile?

本文关键字:什么 MapViewOfFile 使用      更新时间:2023-10-16

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

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
}

一旦文件大小为gb, MapViewOfFile功能停止工作,应用程序将崩溃!使用MapViewOfFile有什么限制吗?任何建议吗?

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

要防止EXCEPTION_IN_PAGE_ERROR异常,请使用structured对象中写入或读取的任何代码的异常处理非页面文件的文件的内存映射视图。

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

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

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

您正在尝试一次将整个文件映射到内存中。您没有足够的虚拟内存来执行此操作。只标出你真正需要的那部分。这就是为什么CreateFileMapping()和MapViewOfFile()允许你指定映射的大小和偏移量。我使用mmf来访问多gb的文件,您必须将映射的大小保持在最小,只需在需要的地方滑动视图。