【问题标题】:Why does VirtualAlloc() require flProtect = PAGE_NOACCESS when flAllocationType = MEM_RESERVE?为什么当 flAllocationType = MEM_RESERVE 时 VirtualAlloc() 需要 flProtect = PAGE_NOACCESS?
【发布时间】:2015-11-08 13:41:43
【问题描述】:

以下对 VirtualAlloc() 的调用在 x64 上返回错误 ERROR_INVALID_PARAMETER

LPVOID lp = VirtualAlloc(NULL, 0x10000000000, MEM_RESERVE, 0);

也就是说,我必须使用PAGE_NOACCESS 作为VirtualAlloc 的最后一个参数。但是当我查看PAGE_NOACCESShere的定义时,我发现:

禁用对页面已提交区域的所有访问。一种尝试 读取、写入或执行已提交的区域会导致 访问冲突。

这与在进程虚拟地址空间中保留一系列地址无关。

flAllocationTime = MEM_RESERVE 时,flProtect 等于 PAGE_NOACCESS 的要求似乎在 MS 文档中完全缺失。有人可以证实这一点吗?

【问题讨论】:

    标签: windows winapi memory-management


    【解决方案1】:

    VirtualAlloc 的最后一个参数需要memory protection constant。 没有一个内存保护常数为 0,因此 0 不是有效值。这是您看到的 ERROR_INVALID_PARAMETER 错误。因此,您必须至少选择一个给定的常数。一种选择是使用PAGE_NOACCESS

    我承认,这在文档中不是很清楚,但一般事实是,您不能假设 0 始终是任何标志参数的有效值;你总是需要检查你被允许给出的值。如果0 是一个可接受的值,那么它会被列为或明确提及。

    【讨论】:

    • 这个参数的文档很糟糕。它明确告诉您该列表中的所有值都允许使用MEM_COMMIT,这暗示着它们不被允许。它告诉您飞地允许哪些值。它没有说明MEM_RESERVE 可以使用哪些值。
    • 是的,完全不清楚。唯一的提示来自VirtualAlloc explanationMEM_RESET“当您指定 MEM_RESET 时,VirtualAlloc 函数会忽略 flProtect 的值。但是,您仍然必须将 flProtect 设置为有效的保护值,例如 PAGE_NOACCESS。” 。如果MEM_RESERVE 是否也忽略flProtect,则根本没有说,但它确实暗示该函数需要flProtect 的非零值,即使在未使用时也是如此。文档可能需要一些改进。
    猜你喜欢
    • 2014-11-19
    • 2013-07-05
    • 2015-10-18
    • 2016-10-02
    • 1970-01-01
    • 2021-03-16
    • 2021-01-20
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多