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

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

全モジュールの列挙

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

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++ ){
        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をリンクして下さい。

関連記事



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

コメントを投稿

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