プロセスの列挙
このところしばらく、説明が長々しいのが続きましたので、今回はちょっと息抜きということで、簡単なハウツーものを取り上げました。
「プロセスの列挙」 の方法です。プロセスを列挙する簡単な方法は、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 に入れてくれているのが使いやすいですね。