【问题标题】:Is there any limitation for using MapViewOfFile?使用 MapViewOfFile 有什么限制吗?
【发布时间】:2011-11-06 06:57:54
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-10
          • 1970-01-01
          • 2015-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-30
          相关资源
          最近更新 更多