Windows Heap管理是細粒度的記憶體管理方式。這樣做可以降低記憶體片段,提高記憶體的利用率。每個進程在啟動之初都會有一個預設的Heap,這個我們可以通過GetProcessHeap()返回Heap的控制代碼,其實這個控制代碼就是一款buffer。之後進行記憶體申請都是在這個上面進行的。具體的Heap的結構不怎麼瞭解,初步的heap管理在win 95系統設計揭秘中介紹。這裡就不詳述了。
這裡需要介紹一些API,這些API用於遍曆每個進程的Heap相關資訊。
_heapwalk()//c 中的本進程heap遍曆,這個地下調用的是HeapWalk
HeapWalk()//也是本進程的
GetProcessHeap();//得到本進程預設heap地址
GetProcessHeaps();//得到本進程所有的Heap地址
Heap32ListFirst();//得到指定進程的Heap 資訊
Heap32ListNext()
Heap32First()//得到每個heap stub 資訊,保護地址,大小。。。
Heap32Next()
Toolhelp32ReadProcessMemory()//讀取指定進程,指定記憶體
還有很多對Heap進行操作的API,這裡就不介紹了。
遍曆的方法和遍曆進程、模組的方法一樣。都是使用toolhelp的api。
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_PROCESS,0);<br />if(INVALD_HANDLE_VALUE == hProcess )<br />{<br /> ;<br />}<br />pe32.dwSize = sizeof(pe32)<br />if(!Process32First(hProcessSnap,&pe32))<br />{<br /> ;<br />}<br />do<br />{<br /> hProcessHeapSnap = CreateToolhelp32Snapshot(TH32_SNAPHEAPLIST,pe32.dwProcessID);<br /> if(INVALD_HANDLE_VALUE == hProcessHeapSnap)<br /> continue;<br /> if(Heap32ListFirst())<br /> {<br /> ;<br /> }<br /> do<br /> {<br /> //print heap list info<br /> if(Heap32First())<br /> {<br /> ;<br /> }<br /> do<br /> {<br /> //print heap info<br /> //here u can use ToolhelpReadProcessMemory or other api to read other process memory.</p><p> }while(Heap32Next());<br /> }while(Heap32ListNext());<br /> CloseHandle(hProcessHeapSnap);<br /> pe32.dwSize = sizeof(pe32);<br />}while(Process32Next(hProcessSnap,&pe32))<br />CloseHandle(hProcessSnap);
這裡簡單的寫了枚舉進程Heap的代碼。具體的還需要充實一下。