gpt4 book ai didi

在映射文件上调用 VirtualProtect

转载 作者:可可西里 更新时间:2023-11-01 13:29:03 30 4
gpt4 key购买 nike

我正在使用 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?

最佳答案

首先使用 FILE_MAP_READ 创建 View | 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);

关于在映射文件上调用 VirtualProtect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5346913/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com