プロセスのファイル名の列挙

プロセスのファイル名の列挙方法を以下にリストアップします。


#include <psapi.h>
#pragma comment( lib, "psapi.lib")
const DWORD MAX_PROCESSES = 4096;       // プロセスIDを格納する DWORD配列のサイズ
const DWORD MAX_MODULES = 4096;   // モジュールのハンドルを格納する HMODULE配列のサイズ
const DWORD MAX_MODULES_USED = 1;       // 表示するモジュール数を制限
void EnumProcessInfo()
{
  DWORD pids[MAX_PROCESSES];
  DWORD cbNeeded;
  // プロセスIDを列挙
  if(EnumProcesses(pids, MAX_PROCESSES, &cbNeeded))
  {
    DWORD nPids = cbNeeded/sizeof(DWORD);
    TRACE("%d processes found.\n", nPids);
    TRACE("%10s | %10s | %20s | %s", "Process ID", "Module", "File Name", "Path");
    for(DWORD i=0; i<nPids; i++)
    {
      // プロセスをオープン
      DWORD pid = pids[i];
      TRACE("%10d | ", pid);
      HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
      if(hProcess)
      {
        HMODULE hModules[MAX_MODULES];
        if(EnumProcessModules(hProcess, hModules, MAX_MODULES, &cbNeeded))
        {
          DWORD nMods = cbNeeded/sizeof(HMODULE);
          if(nMods < MAX_MODULES) // cbNeeded は、最大数を返す
          {
            // 表示するモジュール数を制限
            if(nMods > MAX_MODULES_USED) nMods = MAX_MODULES_USED;
            for(DWORD j=0; j<nMods; j++)
            {
              char fname[MAX_PATH+1];
              GetModuleFileNameEx(hProcess, hModules[j], fname, MAX_PATH);
              char szDrive[_MAX_PATH];  // D:
              char szDir[_MAX_PATH];    // \\folder1\\folder2\\ 
              char szFName[_MAX_PATH];  // filename
              char szExt[_MAX_PATH];    // .ext
              _tsplitpath(fname, szDrive, szDir, szFName, szExt);       // フルパスを分解
              TRACE("0x%08x | %16s%4s | %s%s\n", hModules[j]
                , szFName, szExt, szDrive, szDir);
            }
          }
          else
            TRACE("Failed to get module handles! "
              "Count of module is over %d(maximum size of this routine).\n"
              , MAX_MODULES);
          // EnumProcessModules によって取得されたHMODULEは解放の必要はない
        }
        else
          TRACE("Failed to get module handles!\n");
        // OpenProcess で開かれたHANDLEは必ず閉じること
        CloseHandle(hProcess);
      }
      else
        TRACE("Failed to get process handle!\n");
    }
  }
  else
    TRACE("Failed to get process ids! "
      "Call GetLastError() to get detail.\n");
}

[PR]
by isoq | 2005-02-16 19:39 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< 30×2+16+8=84ロシェ exblogの禁止語句 >>