如何在NT下获取进程的路径

 
如何在NT下获取进程的路径

整理:Ackarlix
下载示例源代码

一:获取 NT 下进程路径的方法
  在 Win9X 系统中,利用 ToolHelp API 中的相关函数可以很方便得得到进程的名称及其路径。但这种方法在 NT 系统中就不能奏效了, szExeFile 仅仅得到的是进程的名称,并没有包含进程的路径。
  如何在 NT 下获取进程的路径呢?(由于 WIN9X 系统不在我们讨论的范围之内,所以我们选用 PSAPI 中的相关函数进行说明,这仅仅适用于 NT 系统。)其实也很简单 —— OpenProcess() 函数将进程打开后,再利用 EnumProcessModules() 函数枚举该进程的模块,最后利用 GetModuleFileNameEx() 函数就能取得该进程的路径了。
  下面的这段程序将枚举 NT 系统中的进程,并将显示每个进程的路径。当然,这种方法对一些系统保护的进程而言或多或少会出现些问题,例如: smss.exe winlogon.exe csrss.exe 等。如果谁有更好的方法请赐教,不胜感激。
二:具体实践
//////////////////////////////////////////////////////////////////////////////////
 
/*
* ShowProcessPath_PSAPI
* 版权所有 (C) 2004 赵春生
* 2004.08.08
* http://timw.yeah.net
* http://timw.126.com
* 本程序适用于:WinNT
* 代码在Win2000P+SP4 + VC6+SP5测试通过
*/
 
#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 测试通过。

源码也可从我的个人主页下载。
http://timw.yeah.net
http://timw.126.com
 
 

你可能感兴趣的:(c,api,测试,query,Path)