獲取運行中的句柄
?
1.從窗口句柄中獲取進程句柄
要對進程進行某種操作,就必須首先知道該進程的句柄或者進程ID
對于自己創建的子進程來說CreateProcess函數返回了子進程句柄和進程的ID
但是如果如果要對系統中運行的某個進程進行操作,那么首先獲取他們的句柄才行
?
如果知道某個進程的ID
那么可以通過GetWindowThreadProcessID hWnd,lpdwProcessID
該函數可以從一個窗口句柄中獲取創建該窗口的進程的進程ID
hWnd指明一個窗口句柄--可以通過FIndWindow來獲得這個窗口句柄
lpdwProcessID指向一個雙字節的變量,函數在這里返回創建窗口進程的ID
函數的返回值是目標進程中創建該窗口的線程的線程ID
?
得到進程ID后,就可以通過OpenProcess函數來獲取該進程的句柄了
OpenProcess dwDesiredAccess,bInheritHandle,dwProcessID
dwDesireAccess 指定需要對該進程進行的操作,要對目標進程進行某種操作
一般來說,除了系統進程以外,可以對其他函數進行任何操作,操作碼可以取以下取值的組合
PROCESS_ALL_ACCESS? 等于下面全部操作的組合
PROCESS_CREATE_THREAD 允許創建遠程線程
PROCESS_DUP_HANDLE 允許進程句柄被復制
PROCESS_QUERY_INFORMATION 允許使用GetExitCodeProcess查詢進程退出碼和使用GetPriorityClass函數查詢進程的優先級
PROCESS_SET_INFORMATION? 允許使用SetPriorityClass函數設置進程優先級
PROCESS_VM_OPERATION 允許使用WriteProcessMemory 和 VirtualProtectEx函數修改進程的地址空間
PROCESS_VM_READ 允許對進程空間進行讀操作
PROCESS_WRITE 允許對進程地址空間進行寫操作
?
bInheritHandle 指明返回的進程句柄是否可以被當前進程的子進程繼承,如果參數指定為TRUE,則進程句柄可以被繼承
dwProcessID指明目標進程的ID
如果函數成功執行,返回的是被打開的進程句柄,如果函數執行失敗則返回NULL.一般打開失敗的原因是由于權限不夠引起的,當完成對目標進程的操作之后,必須使用CloseHandle將獲得的句柄關閉
?
2.從快照函數獲取進程句柄
(1)
使用GetWindowThreadProcessID獲取進程的先決條件是必須創建了窗口,對于在后臺運行的沒有窗口的進程該如何處理呢?
這就可以通過枚舉系統中運行的進程來解決了,這個功能可以由CreateToolHelp32Snapshot函數來實現
CreateToolHelp32Snapshot dwFlags,th32ProcessID
dwFlags 用來指定快照中需要返回的對象,本函數不僅可以獲取進程列表,也可以用來獲取線程和模塊等對象的列表,參數可以指定的值是:
TH32CS_SNAPHEAPLIST 對指定進程中的堆進行枚舉
TH32CS_SNAPMODULE 對指定進程中的模塊進行枚舉
TH32CS_SNAPPROCESS 對系統范圍中的進程進行枚舉
TH32CS_SNAPTHREAD 對系統范圍中的線程進行枚舉
th32ProcessID參數用來指定一個進程ID? 對于TH32CS_SNAPPROCESS 和TH32CS_SNAPTHREAD這個參數可以為0
因為后2者是對系統范圍內的枚舉
?
如果函數執行成功返回一個快照句柄,否則返回-1
?
(2)從快照句柄中獲取進程參數使用Process32First和Process32Next函數
Process32Next函數循環獲取快照句柄中的進程信息,當不在有剩余信息時,函數返回FALSE
Process32First和Process32Next的第一參數指向一個快照句柄,第2個參數指向一個PROCESSENTRY32結構
Process32Next hSnapshot,lpProcessEntry32
結構定義如下
<span style="font-family:Microsoft YaHei;font-size:13px;">typedef struct tagPROCESSENTRY32
{
DWORD dwSize; 結構的長度
DWORD cntUsage; 進程的引用計數
DWORD th32ProcessID; 進程ID
ULONG_PTR th32DefaultHeapID; 進程默認堆的ID
DWORD th32ModuleID; 進程模塊的ID
DWORD cntThreads; 被進程創建的線程數
DWORD th32ParentProcessID; 進程的父進程ID
LONG pcPriClassBase; 被進程創建的線程的基本優先級
DWORD dwFlags; 內部使用
TCHAR szExeFile[MAX_PATH]; 進程對應的可執行文件名稱
} PROCESSENTRY32,
*PPROCESSENTRY32;</span>
在返回所有進程信息之后,需要使用CloseHandle將快照句柄關閉
在結構體中返回的進程ID(th32ProcessID)和可執行的文件名(szExeFile)是我們最關心的
這樣我們就可以通過OpenProcess來對進程進行各種操作了
?
另外在ListBox能夠為每一項自定義一個32位的自定義數據
LB_SETITEMDATA? 和 LB_GETITEMDATA可以設置和獲取自定義數據
正好可以把th32ProcessID設置進去......