列舉 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 就好。

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()