2011-11-06 59 views
2

我試圖使用內存映射文件爲:使用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 
} 

一旦文件大小是千兆字節的MapViewOfFile功能停止工作,並申請將被崩潰!使用MapViewOfFile有什麼限制嗎?任何建議?

回答

4

您需要檢查返回值!另一個原因崩潰可以在MapViewOfFile中找到的言論在MSDN節:

爲了防範EXCEPTION_IN_PAGE_ERROR例外,使用結構化 異常處理,以保護寫入或讀取的 內存映射視圖中的任何代碼除頁面文件以外的文件。

就其他限制而言;顯然這個視圖必須適合你的進程的虛擬內存空間,而一個32位的進程通常總共只有2GB。如果您正在處理千兆字節大小的文件,則需要映射較小的視圖,而不是同時映射整個文件...

3

您的應用程序崩潰,因爲您沒有檢查MapViewOfFile是否有錯誤 - 如果失敗,函數返回0。

至於限制,函數不能映射大於虛擬內存空間的最大連續空閒塊的塊。如果你的程序是32位的,那麼你只有大約2GB的可用虛擬內存;最大的連續空閒塊將會更小,因爲程序二進制文件,DLL,主線程堆棧和堆將分配到整個內存空間的各個位置。

2

您試圖一次將整個文件映射到內存中。你沒有足夠的虛擬內存來做到這一點。只映射你實際需要的部分。這就是爲什麼CreateFileMapping()和MapViewOfFile()允許您爲映射指定大小和偏移量的原因。我使用MMF來訪問多GB文件,您必須將映射的大小保持在最小,只需將視圖滑到需要的位置即可。