程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 如何在NT下獲取進程的路徑

如何在NT下獲取進程的路徑

編輯:關於VC++

一:獲取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測試通過。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved