4
我使用C++在Windows上的Visual Studio 2012下枚舉頁內存範圍
我有開始和結束的內存地址和需要生成頁基地址的列表/兩個地址之間處理。我考慮過手動探測頁面的可能性,但認爲必須有更好的方法來枚舉它們。
這種方式是否存在?
聲明;最終的頁面句柄必須是基地址,以便當窗口頁面的大小添加到它們時,結果地址不會重疊到下一頁。首選的解決方案不是平臺特定的,並且可以與32位的WOW64兼容。
我使用C++在Windows上的Visual Studio 2012下枚舉頁內存範圍
我有開始和結束的內存地址和需要生成頁基地址的列表/兩個地址之間處理。我考慮過手動探測頁面的可能性,但認爲必須有更好的方法來枚舉它們。
這種方式是否存在?
聲明;最終的頁面句柄必須是基地址,以便當窗口頁面的大小添加到它們時,結果地址不會重疊到下一頁。首選的解決方案不是平臺特定的,並且可以與32位的WOW64兼容。
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;
}
完美!正是我需要的。 – kvanberendonck 2013-02-22 07:09:33