2013-02-22 100 views
4

我使用C++在Windows上的Visual Studio 2012下枚舉頁內存範圍

我有開始和結束的內存地址和需要生成頁基地址的列表/兩個地址之間處理。我考慮過手動探測頁面的可能性,但認爲必須有更好的方法來枚舉它們。

這種方式是否存在?

聲明;最終的頁面句柄必須是基地址,以便當窗口頁面的大小添加到它們時,結果地址不會重疊到下一頁。首選的解決方案不是平臺特定的,並且可以與32位的WOW64兼容。

回答

4

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; 
} 
+1

完美!正是我需要的。 – kvanberendonck 2013-02-22 07:09:33