Вызов VirtualProtect для сопоставленного файла - PullRequest
5 голосов
/ 18 марта 2011

Я использую функции CreateFileMapping и MapViewOfFile, чтобы отобразить файл в память.После определенного момента я вызываю VirtualProtect, чтобы изменить его защиту с режима «только чтение» на чтение и запись.Этот вызов завершается неудачно, и GetLastError выдает ERROR_INVALID_PARAMETER.

Вот упрощенная версия моего кода, демонстрирующая проблему.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main() {
    HANDLE fd, md;
    char *addr;
    DWORD old;
    BOOL ok;

    fd = CreateFile("filename", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    md = CreateFileMapping(fd, NULL, PAGE_READWRITE, 0, 100, NULL);
    addr = MapViewOfFile(md, FILE_MAP_READ, 0, 0, 100);
    ok = VirtualProtect(addr, 100, PAGE_READWRITE, &old);
    if (!ok) {
        // we fall into this if block
        DWORD err = GetLastError();
        // this outputs "error protecting: 87"
        printf("error protecting: %u\n", err);
        return 1;
    }
    UnmapViewOfFile(addr);
    CloseHandle(md);
    CloseHandle(fd);
    return 0;
}

Что я здесь делаю неправильно?Разрешено ли мне вызывать VirtualProtect для региона, содержащего сопоставленный файл?

Ответы [ 3 ]

5 голосов
/ 18 марта 2011

Начните с создания представления с помощью FILE_MAP_READ | FILE_MAP_WRITE и защитить с PAGE_READONLY. Теперь у вас нет проблем с тем, чтобы сделать это PAGE_READWRITE позже:

addr = MapViewOfFile(md, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 100);
ok = VirtualProtect(addr, 100, PAGE_READONLY, &old);
//...
ok = VirtualProtect(addr, 100, PAGE_READWRITE, &old);
3 голосов
/ 18 марта 2011

Что происходит в вашем коде, так это то, что VirtualProtectEx (вызванный вашим VirtualProtect) завершается с ошибкой STATUS_SECTION_PROTECTION (0xC000004E) - "Вид раздела указывает защиту, которая является несовместимо с защитой начального представления ", и, похоже, именно это вы и сделали, создав представление сечения с более строгой защитой (FILE_MAP_READ).

Эта тема, похоже, не документирована с достаточным количеством деталей, поэтому я думаю, что вам лучше просто следовать предложенному Гансом.

1 голос
/ 18 марта 2011

Согласно http://msdn.microsoft.com/en-us/library/aa366556(v=vs.85).aspx это должно быть законно. Согласно документации VirtualProtect, новые флаги должны быть совместимы с флагами «VirtualAlloc» - если этот переход к флагам «MapViewOfFile», я подозреваю, что вы можете усилить, но не ослабить защиту. Попробуйте сопоставить readwrite и изменить защиту на readonly.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...