3

VirtualFreeのmsdnドキュメントで

BOOL WINAPI VirtualFree(
  _In_  LPVOID lpAddress,
  _In_  SIZE_T dwSize,
  _In_  DWORD dwFreeType
);

dwSize [in]解放されるメモリ領域のサイズ(バイト単位)。

dwFreeTypeパラメーターがMEM_RELEASEの場合、このパラメーターは0(ゼロ)でなければなりません。この関数は、VirtualAllocへの最初の割り当て呼び出しで予約されている領域全体を解放します。

システムは、アドレスを介してリージョンサイズ全体を取得できるようです

私の質問は:どうすればそれを行うことができますか(アドレスを介してリージョン全体のサイズを取得するため)

PS:VirtualQueryAPIはそれを行うことができません

void* p = VirtualAlloc(null, static_cast<SIZE_T>(_K * 128), MEM_RESERVE, PAGE_NOACCESS);
p = VirtualAlloc(p, _K * 64, MEM_COMMIT, PAGE_READWRITE);
MEMORY_BASIC_INFORMATION im;
VirtualQuery(p, &im, sizeof(im));

im.RegionSizeはMEM_COMMITのサイズであり、VirtualAllocを最初に呼び出したときのリージョンサイズ全体ではありません。

4

2 に答える 2

4

MEMORY_BASIC_INFORMATION

AllocationBaseVirtualAlloc関数によって割り当てられたページ範囲のベースアドレスへのポインタ。BaseAddressメンバーが指すページは、この割り当て範囲内に含まれています。

エッジから外れるまでクエリを続けます。

void* p = VirtualAlloc(NULL, static_cast<SIZE_T>(_K * 128), MEM_RESERVE, PAGE_NOACCESS);
void* p2 = VirtualAlloc(p, _K * 64, MEM_COMMIT, PAGE_READWRITE);
MEMORY_BASIC_INFORMATION im;
VirtualQuery(p2, &im, sizeof(im));
while (im.AllocationBase == p)
{
    p2 = (unsigned char *)p2 + im.RegionSize;
    VirtualQuery(p2, &im, sizeof(im));
}
于 2013-02-25T11:10:45.553 に答える
0

それはあなたがあなた自身を追跡しなければならない情報です。

アドレス空間を予約することはまさにそれを行います-それはアドレスを予約します。たまたま互いに隣接している2つのチャンクを予約してから、両方の予約済みスペースに1つのブロックをコミットできるため、そのスペースの大きさの概念はありません。

于 2013-02-25T11:06:29.310 に答える