我正在尝试使用VirtualAlloc保留并提交一个内存块,然后再次扩展该内存块。不幸的是,尽管VirtualQuery表示请求的地址范围是空闲的,但它仍返回NULL并带有错误ERROR_INVALID_ADDRESS。这是我的代码:

void* allocation = VirtualAlloc(NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
void* desiredNextAllocation = (char*)allocation + 4096;
MEMORY_BASIC_INFORMATION info;
size_t memory_info = VirtualQuery(desiredNextAllocation, &info, sizeof(info));
void* extended = VirtualAlloc(desiredNextAllocation, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

第一个分配返回0x00000000000d0000。对VirtualQuery的调用会在“info”中产生以下数据:
    BaseAddress 0x00000000000d1000  void *
    AllocationBase  0x0000000000000000  void *
    AllocationProtect   0x00000000  unsigned long
    RegionSize  0x00000000000ff000  unsigned __int64
    State   0x00010000  unsigned long
    Protect 0x00000001  unsigned long
    Type    0x00000000  unsigned long

我将其解释为意味着从0xd1000开始有0xff个可用页面处于MEM_FREE状态。那么,为什么我在0xd1000提交页面的尝试失败了?

我正在运行Windows 7,这是一个64位版本。

我已经阅读了几篇有关VirtualAlloc的StackOverflow帖子,但它们似乎都暗示着该代码应该像我对文档的理解一样起作用。

最佳答案

documentation for VirtualAlloc:



在这种情况下,地址0xd1000会四舍五入为地址0xd0000,该地址已被保留,因此无效。

10-04 21:53