使用MapViewOfFile有什么限制吗?
Is there any limitation for using MapViewOfFile?
我正在尝试使用内存映射文件:
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的文件,您必须将映射的大小保持在最小,只需在需要的地方滑动视图。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我应该使用什么来代替void作为变体中的替代类型之一
- 使用MapViewOfFile有什么限制吗?