我正在尝试使用 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 的调用会在“信息”中产生以下数据:
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
我解释这意味着有 0xff 可用页面从 0xd1000 开始处于 MEM_FREE 状态。那么为什么我在 0xd1000 提交页面的尝试失败了?
我正在运行 Windows 7,这是一个 64 位版本。
我已经阅读了几篇关于 VirtualAlloc 的 StackOverflow 帖子,但它们似乎都暗示这段代码应该像我对文档的理解一样工作。