一:獲取NT下進程路徑的方法
在Win9X系統中,利用ToolHelp API中的相關函數可以很方便得得到進程的名稱及其路徑。但這種方法在NT系統中就不能奏效了,szExeFile僅僅得到的是進程的名稱,並沒有包含進程的路徑。
如何在NT下獲取進程的路徑呢?(由於WIN9X系統不在我們討論的范圍之內,所以我們選用PSAPI中的相關函數進行說明,這僅僅適用於NT系統。)其實也很簡單——用OpenProcess()函數將進程打開後,再利用EnumProcessModules()函數枚舉該進程的模塊,最後利用GetModuleFileNameEx()函數就能取得該進程的路徑了。
下面的這段程序將枚舉NT系統中的進程,並將顯示每個進程的路徑。當然,這種方法對一些系統保護的進程而言或多或少會出現些問題,例如:smss.exe、winlogon.exe,csrss.exe等。如果誰有更好的方法請賜教,不勝感激。
二:具體實踐
//////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <windows.h>
#include "PSAPI.H"
#pragma comment( lib, "PSAPI.LIB" )
int main(void)
{
DWORD processid[1024],needed,processcount,i;
HANDLE hProcess;
HMODULE hModule;
char path[MAX_PATH] = "",temp[256];
printf("ShowProcessPath with [Process Status API]\n\n");
EnumProcesses(processid, sizeof(processid), &needed);
processcount=needed/sizeof(DWORD);
for (i=0;i<processcount;i++)
{
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
if (hProcess)
{
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
GetShortPathName(path,path,256);
itoa(processid[i],temp,10);
printf("%s --- %s\n",path,temp);
}
else
printf("Failed!!!\n");
}
CloseHandle(hProcess);
CloseHandle(hModule);
itoa(processcount,temp,10);
printf("\nProcess Count:%s\n\n",temp);
return 0;
}
三:相關測試
用ToolHelp API按上述方法也能達到獲取進程路徑的目的,但和PSAPI相比後者則更有優勢,詳見下表,測試環境為:Win2000P+SP4。
-----進程名--------PSAPI----THAPI---
| smss.exe | Y N |
csrss.exe N N
| winlogon.exe | Y N |
services.exe Y N
| lsass.exe | Y N |
svchost.exe Y N
| WinMgmt.exe | Y N |
Explorer.EXE Y Y
| mobsync.exe | Y Y |
conime.exe Y Y
------------------------------------
四:測試環境
以上代碼在Win2000P+SP4 + VC6+SP5測試通過。
本文配套源碼