這里的進程狀態信息函數主要分為兩類,一類是PS(PROCESS STATUS HELPER) API,另外一類是Th(TOOL HELP) API。
話說第一次遇到這個ToolHelp函數時我在看《windows核心編程》時遇到的。那時還僅僅是簡單的看了一下,並未深入。
Ps API 函數列表及其功能說明:MSDN地址連接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684894(v=vs.85).aspx
使用Ps API需要包含Psapi.h文件以及Psapi.lib
EmptyWorkingSet 從執行的工作集中盡可能的多刪除頁(page),內存優化工具就使用了這個軟件。
原型:BOOL WINAPI EmptyWorkingSet( _In_ HANDLE hProcess );
EnumDeviceDrivers 枚舉設備驅動
原型:BOOL WINAPI EnumDeviceDrivers( _Out_ LPVOID *lpImageBase, _In_ DWORD cb, _Out_ LPDWORD lpcbNeeded );
EnumPageFiles 枚舉頁文件
原型:BOOL WINAPI EnumPageFiles( _Out_ PENUM_PAGE_CALLBACK pCallbackRoutine, _In_ LPVOID lpContext );
EnumProcesses 枚舉進程
原型:BOOL WINAPI EnumProcesses( _Out_ DWORD *pProcessIds, _In_ DWORD cb, _Out_ DWORD *pBytesReturned );
EnumProcessModules 枚舉進程模塊
原型:BOOL WINAPI EnumProcessModules( _In_ HANDLE hProcess, _Out_ HMODULE *lphModule, _In_ DWORD cb, _Out_ LPDWORD lpcbNeeded );
GetDeviceDriverBaseName 獲取驅動的base name(我並不清楚base name是什么東西)
原型:DWORD WINAPI GetDeviceDriverBaseName( _In_ LPVOID ImageBase, _Out_ LPTSTR lpBaseName, _In_ DWORD nSize );
GetDeviceDriverFileName 這個是用來獲取驅動的文件名
原型:DWORD WINAPI GetDeviceDriverFileName( _In_ LPVOID ImageBase, _Out_ LPTSTR lpFilename, _In_ DWORD nSize );
GetMappedFileName 這個很函數檢測參數地址是不是在指定進程的地址空間的內存映射文件中,如果是,則返回內存映射文件名
原型:DWORD WINAPI GetMappedFileName( _In_ HANDLE hProcess, _In_ LPVOID lpv, _Out_ LPTSTR lpFilename, _In_ DWORD nSize );
GetModuleBaseName 獲取模塊的基址名稱
原型:DWORD WINAPI GetModuleBaseName( _In_ HANDLE hProcess, _In_opt_ HMODULE hModule, _Out_ LPTSTR lpBaseName, _In_ DWORD nSize );
GetModuleFileNameEx 獲取模塊文件名
原型:DWORD WINAPI GetModuleFileNameEx( _In_ HANDLE hProcess, _In_opt_ HMODULE hModule, _Out_ LPTSTR lpFilename, _In_ DWORD nSize );
GetModuleInformation 獲取模塊文件信息原型:
原型:BOOL WINAPI GetModuleInformation( _In_ HANDLE hProcess, _In_ HMODULE hModule, _Out_ LPMODULEINFO lpmodinfo, _In_ DWORD cb );
GetPerformanceInfo 返回一個包含性能信息的PERFORMANCE_INFORMATION 結構體
原型:BOOL WINAPI GetPerformanceInfo( _Out_ PPERFORMANCE_INFORMATION pPerformanceInformation, _In_ DWORD cb );
GetProcessimagefilename 獲取指定進程的可執行文件名
原型:DWORD WINAPI GetProcessImageFileName( _In_ HANDLE hProcess, _Out_ LPTSTR lpImageFileName, _In_ DWORD nSize );
GetProcessMemoryInfo 通過PROCESS_MEMORY_COUNTERS結構返回指定進程的內存使用信息
原型:BOOL WINAPI GetProcessMemoryInfo( _In_ HANDLE Process, _Out_ PPROCESS_MEMORY_COUNTERS ppsmemCounters, _In_ DWORD cb );
GetWsChanges 返回自 InitializeProcessForWsWatch 函數被調用后添加到工作集(WS:working set)的頁(pages)信息
原型:BOOL WINAPI GetWsChanges( _In_ HANDLE hProcess, _Out_ PPSAPI_WS_WATCH_INFORMATION lpWatchInfo, _In_ DWORD cb );
InitializeProcessForWsWatch 啟動對指定進程的ws監控
原型:BOOL WINAPI InitializeProcessForWsWatch( _In_ HANDLE hProcess );
QueryWorkingSet獲取指定進程位於虛擬地址空間的頁(pages)擴展信息
原型:BOOL WINAPI QueryWorkingSet( _In_ HANDLE hProcess, _Out_ PVOID pv, _In_ DWORD cb );
Ps API的相關結構信息:MSDN地址連接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684898(v=vs.85).aspx
ENUM_PAGE_FILE_INFORMATION
MODULEINFO
PERFORMANCE_INFORMATION
PROCESS_MEMORY_COUNTERS
PROCESS_MEMORY_COUNTERS_EX
PSAPI_WORKING_SET_BLOCK
PSAPI_WORKING_SET_EX_BLOCK
PSAPI_WORKING_SET_EX_INFORMATION
PSAPI_WORKING_SET_INFORMATION
PSAPI_WS_WATCH_INFORMATION
PSAPI_WS_WATCH_INFORMATION_EX
ToolHelp API 函數及其功能:MSDN地址連接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686832(v=vs.85).aspx
使用ToolHelp API需要包含TlHelp32.h文件
CreateToolhelp32Snapshot 獲取指定進程的快照,包含堆,模塊,線程
Heap32First 獲取指定進程的第一個堆塊的信息
Heap32ListFirst 獲取指定進程的第一個堆的信息
Heap32ListNext 獲取下一個指定進程的堆信息
Heap32Next 獲取進程分配的下一個堆塊的信息
Module32First 獲取指定進程的第一個模塊信息
Module32Next 獲取指定進程的下一個模塊信息
Process32First 獲取系統中第一個進程的信息
Process32Next 獲取系統中下一個進程的信息
Thread32First 獲取系統中的第一個線程信息,不論是哪一個進程的
Thread32Next 獲取系統中下一個線程的信息
Toolhelp32ReadProcessMemory 從指定進程的指定地址復制內存數據
ToolHelp API相關結構信息:MSDN地址連接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686844(v=vs.85).aspx
HEAPENTRY32
HEAPLIST32
MODULEENTRY32
PROCESSENTRY32
THREADENTRY32
ToolHelp函數中,其余函數的使用大多都需要CreateToolhelpSnapshot函數返回的句柄。
另外附一個前幾天在網上查到的通過進程句柄獲取窗口句柄的方法:
先調用一個函數,名為:GetTopWindo。最開始傳入參數為0,獲取到一個句柄(應該是explorer的句柄)。然后根據這個句柄調用GetWindowThreadProcessId函數,能獲取到創建這個窗口的線程ID,以及這個窗口所屬的進程ID。在這里獲取到線程ID后,需要做的是將此ID與當前ID進行比較。如果ID相同,就表明找到了窗口的句柄,返回即可。如果不同,那么就要繼續查找,這里使用函數:GetNextWindow( h , GW_HWNDNEXT);。里面的h參數為當前的窗口句柄。此函數的返回值為下一個窗口的句柄,即HWND。不過我也是今天才明確的知道,HWND句柄和HANDLE是不一樣的。
不過這里存在一個問題就是,對於一個多窗口的進程,會存在查找遺漏的問題。這個方法的原理還是很簡單的,思路就是進行窗口遍歷。