6

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 の投稿をいくつか読みましたが、これらはすべて、このコードがドキュメントの理解と同じように機能することを暗示しているようです。

4

2 に答える 2