我正在尝试使用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,该地址已被保留,因此无效。