Вызов VirtualProtect для сопоставленного файла

Я использую функции 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 в области, содержащей сопоставленный файл?

5
задан Evan Shaw 18 March 2011 в 00:49
поделиться