Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2086932
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 22:13:04

一起学习
如何在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

* 

* 

* 本程序适用于:WinNT

* 代码在Win2000P SP4   VC6 SP5测试通过

*/



#include 

#include 

#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

      三:相关测试

  用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测试通过。

源码也可从我的个人主页下载。

下载本文示例代码


如何在NT下获取进程的路径如何在NT下获取进程的路径如何在NT下获取进程的路径如何在NT下获取进程的路径如何在NT下获取进程的路径如何在NT下获取进程的路径如何在NT下获取进程的路径如何在NT下获取进程的路径如何在NT下获取进程的路径如何在NT下获取进程的路径如何在NT下获取进程的路径如何在NT下获取进程的路径
阅读(285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~