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

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

整理:Ackarlix
下载示例源代码

一:获取NT下进程路径的方法
  在Win9X系统中,利用ToolHelp API中的相关函数可以很方便得得到进程的名称及其路径。但这种方法在NT系统中就不能奏效了,szExeFile仅仅得到的是进程的名称,并没有包含进程的路径。
  如何在NT下获取进程的路径呢?(由于WIN9X系统不在我们讨论的范围之内,所以我们选用PSAPI中的相关函数进行说明,这仅仅适用于NT系统。)其实也很简单——OpenProcess()函数将进程打开后,再利用EnumProcessModules()函数枚举该进程的模块,最后利用GetModuleFileNameEx()函数就能取得该进程的路径了。
  下面的这段程序将枚举NT系统中的进程,并将显示每个进程的路径。当然,这种方法对一些系统保护的进程而言或多或少会出现些问题,例如:smss.exewinlogon.execsrss.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
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值