VirtualAlloc を使用してメモリ ブロックを予約およびコミットし、そのブロックを拡張しようとしています。残念ながら、要求されたアドレス範囲が空いていると VirtualQuery が言っているにもかかわらず、エラー ERROR_INVALID_ADDRESS で NULL を返しています。これが私のコードです:
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
これは、MEM_FREE 状態にある 0xd1000 から始まる 0xff の使用可能なページがあることを意味すると解釈します。では、0xd1000 でページをコミットしようとすると失敗するのはなぜですか?
Windows 7 を実行していますが、これは 64 ビット ビルドです。
VirtualAlloc に関する StackOverflow の投稿をいくつか読みましたが、これらはすべて、このコードがドキュメントの理解と同じように機能することを暗示しているようです。