以下对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中缺少这些要求。有人能证实吗?
答案 0 :(得分:3)
VirtualAlloc
要求其最后一个参数为memory protection constant。
内存保护常量均不为0,因此0不是有效值。这是您看到的ERROR_INVALID_PARAMETER
错误。因此,您必须至少选择一个给定的常量。一种选择是使用PAGE_NOACCESS
。
我承认,这在文档中并不是很清楚,但是一般情况下,您不能假设0
始终是任何标志参数的有效值;你总是需要检查你可以给出的值。如果0
是可接受的值,那么它将被列出或明确提及。