为什么当flAllocationType = MEM_RESERVE时,VirtualAlloc()需要flProtect = PAGE_NOACCESS?

时间:2015-11-08 13:41:43

标签: windows winapi memory-management

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

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

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

  

禁用对已提交页面的所有访问权限。试图   读取,写入或执行提交的区域会产生一个   访问违规。

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

似乎 flProtect 等于PAGE_NOACCESS的要求,当 flAllocationTime = MEM_RESERVE时,MS docs中缺少这些要求。有人能证实吗?

1 个答案:

答案 0 :(得分:3)

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

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