Есть ли какие-либо ограничения для использования MapViewOfFile? - PullRequest
2 голосов
/ 06 ноября 2011

Я пытаюсь использовать отображенные в памяти файлы как:

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 ]

4 голосов
/ 06 ноября 2011

Вам необходимо проверить возвращаемое значение!Другая причина сбоя может быть найдена в разделе замечаний MapViewOfFile на MSDN:

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

Что касается других ограничений;очевидно, что представление должно вписываться в пространство виртуальной памяти вашего процесса, а 32-битный процесс обычно имеет всего 2 ГБ.Если вы работаете с файлами размером в гигабайт, вам нужно отобразить меньшие представления, а не весь файл сразу ...

3 голосов
/ 06 ноября 2011

Ваше приложение аварийно завершает работу, поскольку вы не проверяете MapViewOfFile на наличие ошибок - в случае сбоя функция возвращает 0.

Что касается ограничений, функция не может отобразить блок, размер которого превышаетсамый большой непрерывный свободный блок вашего пространства виртуальной памяти.Если ваша программа 32-битная, то у вас есть только около 2 ГБ доступной виртуальной памяти;самый большой непрерывный свободный блок будет меньше, так как двоичный файл вашей программы, библиотеки DLL, ваш стек основных потоков и ваша куча будут размещены в различных местах в пространстве памяти.

2 голосов
/ 06 ноября 2011

Вы пытаетесь отобразить весь файл в память за один раз. У вас недостаточно виртуальной памяти, чтобы сделать это. Карта только часть, которая вам действительно нужна. Вот почему CreateFileMapping () и MapViewOfFile () позволяют указывать размеры и смещения для отображения. Я использую MMF для доступа к файлам размером в несколько ГБ, вам определенно необходимо свести размер отображения к минимуму, просто сдвиньте представление туда, где вам это нужно.

...