Windows NT 4.0 以降でプロセスの全モジュールを列挙するには次のようにします。(戻る)
- プロセスIDの列挙(EnumProcesses)
- プロセスIDからプロセス・ハンドルの取得(OpenProcess)
- プロセス・ハンドルからモジュールの列挙(EnumProcessModules)
- モジュール・ハンドルからフルパスの取得(GetModuleFileNameEx)
- プロセス・ハンドルを閉じる(CloseHandle)
プロトタイプ宣言
HANDLE OpenProcess( DWORD dwDesiredAccess, // アクセス方法のフラグ BOOL bInheritHandle, // ハンドルの継承オプション DWORD dwProcessId // プロセス識別子 ); BOOL CloseHandle( HANDLE hObject // オブジェクトのハンドル ); BOOL EnumProcesses( DWORD *lpidProcess, // プロセス識別子の配列 DWORD cb, // プロセス識別子の配列サイズ DWORD *cbNeeded // 返されたバイト数 ); BOOL EnumProcessModules( HANDLE hProcess, // プロセスのハンドル HMODULE *lphModule, // モジュールハンドルの配列 DWORD cb, // モジュールハンドルの配列サイズ LPDWORD lpcbNeeded // 返されたバイト数 ); DWORD GetModuleFileNameEx( HANDLE hProcess, // プロセスのハンドル HMODULE hModule, // モジュールのハンドル LPTSTR lpFilename, // バッファ領域 DWORD nSize // バッファ領域のサイズ );
サンプル
#include <stdio.h> #include <windows.h> #include <psapi.h> // Psapi.Lib // このファイルで使用する定数 #define OPEN_PROCESS (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ) // メイン関数 int main( void ) { DWORD ProcessID[ 1024 ]; DWORD dwSize; DWORD dwMax; DWORD dwNow; HANDLE hProcess; // プロセス識別子の取得 EnumProcesses( ProcessID, sizeof(ProcessID), &dwSize ); dwMax = (dwSize / sizeof(DWORD)); // プロセス識別子からモジュールを列挙 for ( dwNow = 0 ; dwNow < dwMax ; dwNow++ ){ printf( "プロセスID: %08X(%d/%d)\n", ProcessID[dwNow], (dwNow + 1), dwMax ); if ( (hProcess = OpenProcess(OPEN_PROCESS,FALSE,ProcessID[dwNow])) != NULL ){ TCHAR szFile[ 1024 ]; HMODULE Module[ 1024 ]; DWORD dwModule; DWORD dwIndex; // プロセスのモジュールハンドルを取得 if ( EnumProcessModules(hProcess,Module,sizeof(Module),&dwSize) ){ dwModule = (dwSize / sizeof(HMODULE)); // プロセスのモジュールハンドルを表示 for ( dwIndex = 0 ; dwIndex < dwModule ; dwIndex++ ){ GetModuleFileNameEx( hProcess, Module[dwIndex], szFile, sizeof(szFile) ); printf( "\t%3d: [%s]\n", (dwIndex + 1), szFile ); } } CloseHandle( hProcess ); } } return 0; }
- ヘッダファイルとしてpsapi.hをインクルードして下さい。
- インポートライブラリとしてPsapi.Libをリンクして下さい。
※コメント投稿者のブログIDはブログ作成者のみに通知されます