在映射文件上调用 VirtualProtect

标签 c windows winapi

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

相关文章:

c - 计算算术数组下标表达式作为 C 中条件运算符的操作数的一部分

c - Rand() 不在 C 中生成随机变量

c - c中的声明与定义

c++ - 结构上溢出的整数加法

winapi - 如何找出应用程序消耗了多少地址空间并将其报告给用户?

c - 除了在头文件中声明的那些之外,程序是否需要来自 .so 共享库的其他符号?

python - 在混合调试中没有为 C++ 加载符号(来自 Python)

c++ - 用于矩阵堆栈的 openGL

c++ - 如何创建一个单选按钮并查看它是否被选中?

windows - 如何在 Windows 中检测何时连接了新硬件?