Има ли някакво ограничение за използване на 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? Някакво предложение?


person Aan    schedule 06.11.2011    source източник


Отговори (3)


Трябва да проверите върнатата стойност! Другата причина за срив може да бъде намерена в раздела за забележки на MapViewOfFile в MSDN:

За да се предпазите от изключения EXCEPTION_IN_PAGE_ERROR, използвайте структурирана обработка на изключения, за да защитите всеки код, който записва или чете от картографиран изглед на паметта на файл, различен от файла на страницата.

Що се отнася до други ограничения; ясно, че изгледът трябва да се побере в пространството на виртуалната памет на вашия процес и 32-битов процес обикновено има общо само 2gb. Ако работите с файлове с размер на гигабайт, трябва да картографирате по-малки изгледи, а не целия файл наведнъж...

person Anders    schedule 06.11.2011

Приложението ви се срива, защото не проверявате MapViewOfFile за грешки -- функцията връща 0, ако не успее.

Що се отнася до ограниченията, функцията не може да картографира блок, който е по-голям от най-големия непрекъснат свободен блок от пространството на вашата виртуална памет. Ако вашата програма е 32-битова, тогава имате само около 2GB налична виртуална памет; най-големият съседен свободен блок ще бъде по-малък, тъй като двоичният ви файл на програмата, DLL файловете, стекът на главните нишки и купчината ви ще бъдат разпределени на различни места в пространството на паметта.

person avakar    schedule 06.11.2011

Опитвате се да картографирате целия файл в паметта наведнъж. Нямате достатъчно виртуална памет, за да направите това. Картирайте само частта, от която действително се нуждаете. Ето защо CreateFileMapping() и MapViewOfFile() ви позволяват да зададете размери и отмествания за картографиране. Използвам MMF за достъп до многоGB файлове, определено трябва да запазите размера на картографирането до минимум, просто плъзнете изгледа наоколо, където ви трябва.

person Remy Lebeau    schedule 06.11.2011