使用MapViewOfFile有任何限制吗?

时间:2011-11-06 06:57:54

标签: c++ winapi memory-leaks memory-mapped-files memory-mapping

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

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有任何限制吗?有什么建议吗?

3 个答案:

答案 0 :(得分:4)

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

  

要防止EXCEPTION_IN_PAGE_ERROR异常,请使用结构化   异常处理,以保护写入或读取的任何代码   内存映射视图,而不是页面文件。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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