系統爲我們在內存中指定了一個關於進程、線程、堆和模塊等的當前狀態信息副本-----系統快照,我們可以通過CreateToolHelp32Snapshot函數來獲取系統快照的句柄,通過該句柄來獲取當前狀態信息。該函數如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
- dwFlags:該參數用於指定系統快照中包含的內容,其可以爲下面值之一:
TH32CS_INHERIT | 聲明快照句柄是可繼承的 |
TH32CS_SNAPALL | 在快照中包含系統中所有的線程和進程,堆,模塊 |
TH32CS_SNAPHEAPLIST | 在快照中包括在th32ProcessID中指定的所有堆 |
TH32CS_SNAPMODULE | 在快照中包括在th32ProcessID中指定的所有模塊 |
TH32CS_SNAPPROCESS | 在快照中包括所有的進程 |
TH32CS_SNAPTHREAD | 在快照中包括所有的線程 |
- th32ProcessID:該參數用於指定進程的ID。只有在dwFlags爲TH32CS_SNAPHEAPLIST或TH32CS_SNAPMODULE時纔有效。
操作完成後,我們可以運用CloseToolHelp32Snapshot函數來關閉系統快照句柄:
BOOL WINAPI CloseToolhelp32Snapshot(
HANDLE hSnapshot );
1.操作進程快照
1)Process32First函數
BOOL WINAPI Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe );
功能:獲取進程快照列表的第一個進程狀態信息。
參數:hSnapshot爲快照句柄;lppe參數爲指向PROCESSENTRY32結構體的指針,該結構體的形式如下:
typedef struct tagPROCESSENTRY32 {
DWORD dwSize;//該結構體的大小
DWORD cntUsage;//進程的引用計數
DWORD th32ProcessID; //進程的ID
DWORD th32DefaultHeapID; //進程的默認堆ID
DWORD th32ModuleID; //進程模塊ID
DWORD cntThreads; //次進程開啓的線程計數
DWORD th32ParentProcessID; //此進程的父進程ID
LONG pcPriClassBase; //線程的相對優先級
DWORD dwFlags; //保留字段
TCHAR szExeFile[MAX_PATH];//進程的全名
} PROCESSENTRY32;
typedef PROCESSENTRY32 * PPROCESSENTRY32;
注意:調用該函數必須制定dwSize的大小。
2)Process32Next函數
BOOL WINAPI Process32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe );
功能:該函數獲取進程快照列表中的下一個進程狀態信息,該函數返回TRUE,表示成功獲取;返回FLASE,表示失敗。
2.操作線程快照
1)Thread3First含糊
BOOL WINAPI Thread32First(
HANDLE hSnapshot,
LPTHREADENTRY32 lpte );
功能:獲取快照列表中的第一個線程的狀態信息。
參數:hSnapshot爲系統快照句柄;lpte爲一個指向THREADENTRY32結構體的指針,該結構的形式如下:
typedef struct tagTHREADENTRY32{
DWORD dwSize; //結構體的大小
DWORD cntUsage; //線程引用計數
DWORD th32ThreadID; //線程的ID
DWORD th32OwnerProcessID; //擁有該線程的進程ID
LONG tpBasePri; //線程的相對優先級,共7個值
LONG tpDeltaPri; //這個成員已經不再被使用,總是設置爲零。
DWORD dwFlags;//保留字段,沒使用,爲0.
} THREADENTRY32;
typedef THREADENTRY32 * PTHREADENTRY32;
2)Thread32Next函數
BOOL WINAPI Thread32Next(
HANDLE hSnapshot,
LPTHREADENTRY32 lpte );
功能:獲取快照列表中的下一個線程快照狀態信息。
3.操作堆快照
1)Heap32First函數
BOOL WINAPI Heap32First(
HANDLE hSnapshot,
LPHEAPENTRY32 lphe,
DWORD th32ProcessID,
DWORD th32HeapID );
該函數:獲取快照中響應的堆。
參數:
typedef struct tagHEAPENTRY32
{
DWORD dwSize;//結構體大小
HANDLE hHandle; //指向一個堆塊
DWORD dwAddress; //堆的拾起地址
DWORD dwBlockSize; //堆的大小
DWORD dwFlags; //保留
DWORD dwLockCount; //沒使用
DWORD dwResvd; //不再使用
DWORD th32ProcessID; //擁有該對的進程ID
DWORD th32HeapID; //該堆的標識符
} HEAPENTRY32;
typedef HEAPENTRY32 * PHEAPENTRY32;
typedef HEAPENTRY32 * LPHEAPENTRY32;
2)Heap32Next函數
BOOL WINAPI Heap32Next(
HANDLE hSnapshot,
LPHEAPENTRY32 lphe );
3)Heap32LitFirst函數
BOOL WINAPI Heap32ListFirst(
HANDLE hSnapshot,
LPHEAPLIST32 lphl );
參數:
typedef struct tagHEAPLIST32 {
DWORD dwSize;//結構體大小
DWORD th32ProcessID; //進程ID
DWORD th32HeapID; //堆棧標識符
DWORD dwFlags; //保留,爲0
} HEAPLIST32;
typedef HEAPLIST32 * PHEAPLIST32;
typedef HEAPLIST32 * LPHEAPLIST32;
4)Heap32ListNext函數
BOOL WINAPI Heap32ListNext(
HANDLE hSnapshot,
LPHEAPLIST32 lphl );
4.操作模塊快照
1)Module32First函數
BOOL WINAPI Module32First(
HANDLE hSnapshot,
LPMODULEENTRY32 lpme );
功能:從系統快照中獲取第一個模塊信息。
參數:lpme爲指向MODULEENTRY32結構體的指針,其形式如下:
typedef struct tagMODULEENTRY32 {
DWORD dwSize; //該結構體的大小
DWORD th32ModuleID; //進程上下文模塊標識符
DWORD th32ProcessID; //進程標識符
DWORD GlblcntUsage; //全局模塊引用計數
DWORD ProccntUsage; //所屬進程的模塊引用計數
BYTE *modBaseAddr; //所屬進程的基地址
DWORD modBaseSize; //
HMODULE hModule;//模塊的句柄
TCHAR szModule[MAX_MODULE_NAME32 + 1]; //模塊名
TCHAR szExePath[MAX_PATH]; //路徑
} MODULEENTRY32;
typedef MODULEENTRY32 * PMODULEENTRY32;
2)Module32Next函數
BOOL WINAPI Module32Next(
HANDLE hSnapshot,
LPMODULEENTRY32 lpme );
5.Toolhelp32ReadProcessMemory 函數獲得指定進程中指定內存區域的數據。
BOOL WINAPI Toolhelp32ReadProcessMemory(
DWORD th32ProcessID,//指定的進程的ID
LPCVOID lpBaseAddress, //指定進程的基地址
LPVOID lpBuffer, //緩衝區,用於保存數據
DWORD cbRead, //緩衝區的大小
LPDWORD lpNumberOfBytesRead //實際讀到的數據
);