プロセスの列挙

このところしばらく、説明が長々しいのが続きましたので、今回はちょっと息抜きということで、簡単なハウツーものを取り上げました。

プロセスの列挙」 の方法です。プロセスを列挙する簡単な方法は、Tool Help Library というのを使うと簡単です。Tool Help Library では、基本的にある瞬間のシステムのスナップショットをとり、その情報を取得できます。

プロセス一覧のスナップショットをとるには、CreateToolhelp32Snapshot API に TH32CS_SNAPPROCESS というフラグを渡すだけで OK です。そこで取得したハンドルを元に、Process32First, Process32Next を呼び出し、それぞれの呼び出しで PROCESSENTRY32 構造体のデータを取得します。

PROCESSENTRY32 は次の構造をしています。

typedef struct tagPROCESSENTRY32
{
    DWORD   dwSize;
    DWORD   cntUsage;
    DWORD   th32ProcessID;          // this process
    ULONG_PTR th32DefaultHeapID;
    DWORD   th32ModuleID;           // associated exe
    DWORD   cntThreads;
    DWORD   th32ParentProcessID;    // this process's parent process
    LONG    pcPriClassBase;         // Base priority of process's threads
    DWORD   dwFlags;
    CHAR    szExeFile[MAX_PATH];    // Path
} PROCESSENTRY32;

これは tlhelp32.h ヘッダーファイルに定義されています。th32ProcessID, cntTHreads そして szExeFile がそれぞれ、PID, (そのプロセス内の)スレッド数、Exe ファイル名をあらわします。

以下にサンプルコードを示します。

#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

int main(int argc, char* argv[]) {

    HANDLE     hProcessSnap = NULL;
    PROCESSENTRY32   pe32;
    BOOL    bRet = FALSE;
    ZeroMemory ( &pe32, sizeof (pe32) );

    hProcessSnap = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0);
    if ( INVALID_HANDLE_VALUE == hProcessSnap ) {
        printf ("CreateToolhelp32Snapshot failed with %u.\n", GetLastError() );
        return FALSE;
    }

    printf ("PID  Name             Number of threads\n");
    printf ("---------------------------------------\n");
    pe32.dwSize = sizeof ( PROCESSENTRY32 );
    bRet = Process32First ( hProcessSnap, &pe32 );
    if ( bRet ) {
        do {
            printf ("%4u %-16s %u \n", pe32.th32ProcessID, pe32.szExeFile, pe32.cntThreads ); 
        } while ( Process32Next ( hProcessSnap, &pe32 ) );
    }
 
    CloseHandle ( hProcessSnap );
    return TRUE;
}

これをビルドし、enumproc.exe という名前の EXE を作成して実行しますと、次の結果を得ました。

>enumproc.exe
PID  Name             Number of threads
---------------------------------------
   0 [System Process] 2
   4 System           102
 536 smss.exe         3
 584 csrss.exe        12
 660 winlogon.exe     18
 704 services.exe     14
 716 lsass.exe        21
... 
3460 cmd.exe          1
1040 WebMatrix.exe    4
2616 enumproc.exe     1

PID 0, 4 などのシステム系の PID もしっかり szExeFile に入れてくれているのが使いやすいですね。 

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説