プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

全プロセスの列挙

2007年10月05日 08時33分34秒 | パフォーマンス関連

Windows NT 4.0 以降でプロセスのフルパス名を列挙するには次のようにします。(戻る)

  1. プロセスIDの列挙(EnumProcesses)
  2. プロセスIDからプロセス・ハンドルの取得(OpenProcess)
  3. プロセス・ハンドルからモジュールの列挙(EnumProcessModules)
  4. モジュール・ハンドルからフルパスの取得(GetModuleFileNameEx)
  5. プロセス・ハンドルを閉じる(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++ ){
        TCHAR   szFile[ 1024 ] = { 0 };
        HMODULE Module[ 1024 ] = { 0 };
        
        // プロセスのフルパス名を取得
        if ( (hProcess = OpenProcess(OPEN_PROCESS,FALSE,ProcessID[dwNow])) != NULL ){
            if ( EnumProcessModules(hProcess,Module,sizeof(Module),&dwSize) ){
                GetModuleFileNameEx( hProcess, Module[0], szFile, sizeof(szFile) );
            }
            CloseHandle( hProcess );
        }
        printf( "%3d: %08X [%s]\n", (dwNow + 1), ProcessID[dwNow], szFile );
    }
    return 0;
}
  • ヘッダファイルとしてpsapi.hをインクルードして下さい。
  • インポートライブラリとしてPsapi.Libをリンクして下さい。

関連記事



コメント (5)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« プロセスIDの列挙 | トップ | モジュールの列挙 »
最新の画像もっと見る

5 コメント

コメント日が  古い順  |   新しい順
Re:EnumProcesses 第2引数 (ブログ管理人)
2010-09-11 04:08:20
はい。
その通りです。

だから第2引数には sizeof(ProcessID) と記述してますよ。
また、読み込めたバイト数が第3引数にセットされます。
この第3引数の dwSize ÷ sizeof(DWORD) = 個数となります。

特に記述は間違ってないよね。
なぜ。
疑問符が付いているの?
確認なのか。
返信する
EnumProcesses 第2引数 (通りすがり)
2010-09-10 08:01:42
EnumProcesses第2引数はDWORD配列個数ではなく
DWORD配列で確定するBYTE領域サイズなのでは?
返信する
Unknown (hoho)
2008-03-14 12:43:44
なるほどそうでしたか。
わざわざコメントありがとうございました。
ブログを汚してしまってすいません。
不要であればコメントを消してください。
返信する
Re:なぜプロトタイプ宣言? (ブログ管理人)
2008-03-14 12:40:04
ソースはサンプル行より下です。
プロトタイプ宣言はAPI関数の引数を簡単に説明するために載せています。
コピー&ペーストして利用するときは #include <stdio.h> の行より下です。
あとHSP用に関数や構造体の内容を載せています。(定数までは載せていませんが…)
返信する
なぜプロトタイプ宣言? (hoho)
2008-03-14 09:58:01
#include <psapi.h>をしているんで、
プロトタイプ宣言はいらないのでは?
返信する

コメントを投稿

パフォーマンス関連」カテゴリの最新記事