列舉 process 可用 tlhelp32.h 與 psapi.h,這裡先說明 tlhelp32.h。
tlhelp32.h
基本上不管是要列舉 process 還是 module、thread,步驟都一樣
A. 先用 CreateToolhelp32SnapShot 取得快照
B. 設定相關 struct 大小
C. 使用 xxxxx32First 取得第一個 process( module、thread) 。
D. 使用 xxxxx32Next 取得下一個 process(module、thread)。
程式碼
// ==================================
// filename: ListProcess.cpp
// compiler: vs2008
// author : EdisonX (Edison.Shih.)
// ref : MSDN
//
// **** all rights reserve ****
// ==================================
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
// ==================================
BOOL ListProcess();
// ==================================
// list all the process
BOOL ListProcess()
{
HANDLE hsnapprocess;
HANDLE hprocess;
PROCESSENTRY32 entry32;
DWORD Size;
// 1. 取得系統 process 之 snapshot
hsnapprocess = CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, // flag
0); // th32ProcessID
if(hsnapprocess==INVALID_HANDLE_VALUE){
printf("CreateToolhelp32Snapshot fail: %d\n",GetLastError());
return FALSE;
}
// 2. 設定 struct 大小
entry32.dwSize = sizeof(PROCESSENTRY32);
// 3. 確認正確取得第一個 process
if(!Process32First(hsnapprocess, &entry32)){
printf("Process32First fail.\n");
CloseHandle(hsnapprocess);
return FALSE;
}
// 4. 顯示 process 相關訊息
do{
printf("\n\n===============================\n");
printf("Name :%s\n", entry32.szExeFile);
printf("PID :%08x\n", entry32.th32ProcessID);
printf("parent ID:%08x\n", entry32.th32ParentProcessID);
printf("thread cnt:%u\n", entry32.cntThreads);
printf("base pri:%ld\n", entry32.pcPriClassBase);
}while(Process32Next(hsnapprocess, &entry32));
return TRUE;
}
// ==================================
int main()
{
ListProcess();
return 0;
}
[ 註一] PROCESSENTRY32 原型如下(實際上要注意的參數是 6 個)
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; // 此 struct 大小,故使用前設 sizeof(PROCESSENTRY32)
DWORD cntUsage; // 不使用,設成 0
DWORD th32ProcessID; // process ID
ULONG_PTR th32DefaultHeapID; // 不使用,設 0
DWORD th32ModuleID; // 不使用,設 0
DWORD cntThreads; // 此 process 所衍生出 thread 個數
DWORD th32ParentProcessID; // parent process ID
LONG pcPriClassBase; // thread 執行之 base priority
DWORD dwFlags; // 不使用,設 0
TCHAR szExeFile[MAX_PATH]; // 此 process 之執行檔
} PROCESSENTRY32, *PPROCESSENTRY32;
[ 註二] CreateToolhelp32Snapshot 原型如下
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
dwFlags
(1) TH32CS_SNAPALL - 包含指定下面的 2,3,4,5 參數
(2) TH32CS_SNAPHEAPLIST - 快照裡指定 process 之 heap list
(3) TH32CS_SNAPMODULE - 快照裡指定 process 之 module list
(4) TH32CS_SNAPPROCESS - 快照裡之 process list
(5) TH32CS_SNAPTHREAD - 快照裡之 thread list
(6) TH32CS_GETALLMODS - 快照裡所有 module
(7) TH32CS_SNAPNOHEAPS - 若要更有效率取得 heap 資訊時,使用此 flag 與 (4)
th32ProcessID
如果設 0 的話就是取得現在 process 之ID;只有當 dwFlags 是設 TH32CS_SNAPHEAPLIST 或 TH32CS_SNAPMODULE 時這個參數才會參考,否則將被忽略。
---------- 分隔線 ---------- 分隔線 ---------- 分隔線 ----------
以上的東西真的很多,不過倒是可以先跑跑程式碼出來玩玩就好,
其它有興趣或是有需要的話再去 try 就好。