如何在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