首页
社区
课程
招聘
[原创]《如何在NT下获取进程的路径》
发表于: 2005-9-11 11:09 11014

[原创]《如何在NT下获取进程的路径》

2005-9-11 11:09
11014

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

一:获取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

20:09 2004-08-08

http://timw_web.home4u.china.com/myzhuowen/propath/showprocesspath.zip


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持,呵呵。
2005-9-11 11:56
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看到网上流传的从Longhorn操作系统中剥离出来的任务管理器的新特性后,一直在想,怎么编程实现。呵呵,这下就对了
2005-9-11 11:58
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
4
GOOD
2005-9-12 16:05
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
Good job!
2005-10-22 12:19
0
雪    币: 207
活跃值: (43)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
楼主的办法还有缺陷,最彻底的办法是用PsGetCurrentProcess函函数得到当前进程的句柄,他是一个指向_EPROCESS结构的指针,再利用该结构中的*PEB(0x1B0)和ImageFileName(0x1FC)两成员就可以得到完整的路径了。示意图为:
_EPROCESS->PEB->ProcessParamwters(进程路径)->ImageFile(进程名称)
2005-10-22 17:12
0
雪    币: 216
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
收藏!!!!!
2005-10-22 23:22
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
从Longhorn操作系统中剥离出来的任务管理器我根本就不想用。
2005-10-23 23:00
0
雪    币: 431
活跃值: (457)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
9
最初由 johnzhou 发布
楼主的办法还有缺陷,最彻底的办法是用PsGetCurrentProcess函函数得到当前进程的句柄,他是一个指向_EPROCESS结构的指针,再利用该结构中的*PEB(0x1B0)和ImageFileName(0x1FC)两成员就可以得到完整的路径了。示意图为:
_EPROCESS->PEB->ProcessParamwters(进程路径)->ImageFile(进程名称)


超谢!
2005-10-25 11:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
如果是CRT下面自己写的程序,那根本用不着这么烦琐。。
去直接读取_pgmptr指向内容就是了
2005-10-26 15:45
0
游客
登录 | 注册 方可回帖
返回
//