VirtualQuery
ほとんどあなたの唯一のオプションです。かなり効率的です。
この関数は、リージョン内の最初のページの属性を判別し、ページの範囲全体をスキャンするか、属性のセットが一致しないページが検出されるまで、後続のページをスキャンします。
したがって、関心のある範囲の先頭で呼び出すことから始めれば、ページの単一のチャンクが返されます。次の呼び出しはそのチャンクの直後に開始され、次の呼び出しはその後に続きます。
MEMORY_BASIC_INFORMATION
以下は、構造体の配列を生成する完全にテストされていない関数です。
int EnumVirtualAllocations(const void* ptr, size_t length, MEMORY_BASIC_INFORMATION* info, int size)
{
const void* end = (const void*)((const char*)ptr + length);
int index = 0;
while (index < size && ptr < end &&
VirtualQuery(ptr, &info[index], sizeof(*info)) == sizeof(*info))
{
MEMORY_BASIC_INFORMATION* i = &info[index];
if (i->State != MEM_FREE) index++;
ptr = (const void*)((const char*)(i->BaseAddress) + i->RegionSize);
}
return index;
}