DWORD GetModuleFileNameEx( HANDLE hProcess, HMODULE hModule, LPTSTR FileName, DWORD FileNameSize);
GetModuleFileNameとの違いは、他のプロセスに対して行うことが可能かどうかと言う点である。
引数の意味は以下の通り。
hProcess | (IN) | 情報の取得元のプロセスのハンドル。 |
hModule | (IN) | 情報の取得元のモジュールのハンドル。 |
FileName | (OUT) | 取得結果のフルパス名。 |
FileNameSize | (IN) | FileNameのサイズ。 |
戻り値は、FileNameに設定されたフルパス名のサイズである。関数の実行に失敗した場合、0が返される。
/* 現在起動している全てのプロセス中の全てのモジュールのファイル名を表示 */ void DispAllModules() { DWORD ProcessIDs[1000]; DWORD ProcessNum; HMODULE Modules[1000]; DWORD ModuleNum; char FileName[1000]; DWORD RetSize; DWORD i, j; HANDLE hProcess; BOOL bResult; /* プロセスの一覧と数を取得 */ EnumProcesses(ProcessIDs, sizeof(ProcessIDs), &RetSize); ProcessNum = RetSize / sizeof(DWORD); for(i=0; i<ProcessNum; i++) { printf("プロセスID: %x\n", ProcessIDs[i]); hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessIDs[i]); if(hProcess == NULL) { printf("\tオープン失敗.\n"); } else { /* プロセス中のモジュールの一覧を取得 */ bResult = EnumProcessModules(hProcess, Modules, sizeof(Modules), &RetSize); if(bResult) { ModuleNum = RetSize / sizeof(HMODULE); /* 各モジュールのファイル名を表示 */ for(j=0; j<ModuleNum; j++) { GetModuleFileNameEx(hProcess, Modules[j], FileName, 1000); printf("\t%s\n", FileName); } } else { printf("\tモジュール一覧の取得に失敗.\n"); } CloseHandle(hProcess); } } }