我试图使用VirtualAlloc来保留和提交一块内存,然后再次扩展该块.不幸的是,它返回NULL并返回错误ERROR_INVALID_ADDRESS,尽管VirtualQuery说请求的地址范围是空闲的.这是我的代码:
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);
Run Code Online (Sandbox Code Playgroud)
第一个分配返回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
Run Code Online (Sandbox Code Playgroud)
我认为这意味着有0xff可用页面从0xd1000开始处于MEM_FREE状态.那么为什么我尝试在0xd1000提交页面失败?
我正在运行Windows 7,这是一个64位版本.
我已经阅读了几篇关于VirtualAlloc的StackOverflow帖子,但它们似乎都暗示这段代码应该像我对文档的理解一样工作.