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