WindowsAPI详解——获得进程可执行文件路径的几种方法

转载 2014年03月20日 15:47:02

WindowsAPI详解——获得进程可执行文件路径的几种方法

 

第一种方法:想获得进程可执行文件的路径最常用的方法是通过GetModuleFileNameEx函数获得可执行文件的模块路径这个函数从Windows NT 4.0开始到现在的Vista系统都能使用,向后兼容性比较好。


第二种方法是GetProcessImageFileName函数,这个函数在Windows XP及其以后的系统中都能使用,使用此函数返回的路径不是通常的系统盘符,如"C:\...",而是驱动层的表示方式"\Device\HarddiskVolume1\...",所以使用起来不是很方便。


第三种方法是使用Windows Vista新增的函数QueryFullProcessImageName,由于是Vista新增的,所以兼容性不好。

 

下面来看看这三个函数的原型:

DWORD GetModuleFileNameEx(HANDLEhProcess,HMODULE hModule,LPTSTR lpFilename,DWORD nSize)

     hProcess是目标进程的句柄、hModule是目标模块的句柄(当此参数为NULL时函数返回的是进程可执行文件的路径)、lpFilename是存放路径的字符串缓冲区、nSize表示缓冲区的大小。函数调用失败将返回0。注:进程的句柄须有PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限。

 

DWORD GetProcessImageFileName(HANDLEhProcess,LPTSTR lpImageFileName,DWORD nSize)

      hProcess是目标进程的句柄、lpImageFileName是存放路径的字符串缓冲区、nSize表示缓冲区的大小。函数失败将返回0。注:进程句柄需要有PROCESS_QUERY_INFORMATION的权限。

 

BOOL QueryFullProcessImageName(HANDLEhProcess,DWORD dwFlags,LPTSTR lpExeName,PDWORD lpdwSize)

     hProcess是目标进程的句柄、dwFlags一般设为0(表示返回的路径是Win32的路径格式,如"C:\...",如将其设为PROCESS_NAME_NATIVE将返回"\Device\HarddiskVolume1\..."这样的格式路径)、lpExeName是存放路径的字符串缓冲区、lpdwSize表示缓冲区的大小。函数失败将返回FALSE。注:调用此函数的句柄须有PROCESS_QUERY_INFORMATION或这是PROCESS_QUERY_LIMITED_INFORMATION的权限,并且只能在Vista或更高版本的系统中使用。

 

     调用GetModuleFileNameEx和GetProcessImageFileName需要包含Psapi.h头文件,并链接到Psapi.lib

 

这几个函数的调用方法都很简单,下面我给出GetModuleFileNameEx的使用例子:

#include <Psapi.h>

#pragma comment (lib,"Psapi.lib")

...

HANDLEh_Process=OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE,ProcessID);

wchar_t path[MAX_PATH+1];

if(!GetModuleFileNameEx(h_Process,NULL,path,MAX_PATH+1))

   return false;

...

 

获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName

  想获得进程可执行文件的路径通常有三个方法:一: 调用GetModuleFileNameEx函数获得可执行文件的模块路径这个函数从Windows NT 4.0开始到现在的Vista系统都能使用,向后...

GetModuleFileName 64位问题

利用GetModuleFileName在32位机器上开发的程序,在64位机器上运行的时候,GetModuleFileName和GetModuleFileNameEX获取信息失败。...

GetModuleFileNameEx遍历获取64bit程序路径失败的一种解决方法(Win7-64-bit)

根据官方的说法: For the best results use the following table to convert paths. Windows 2000 = GetModuleFi...

windows核心编程-获取进程当前目录

一:代码#include #include int _tmain() { TCHAR szPath[MAX_PATH]; GetCurrentDirectory(MAX_PATH,szPath);...

Windows驱动获得当前进程全路径的方法

方法: 通过ZwQueryInformationProcess函数查询ImageFileName 支持的系统:XP以上操作系统 具体方法如下: BOOL  GetProce...
  • trents
  • trents
  • 2012年02月20日 14:59
  • 1712

[Win32] 获取进程完整路径

上两篇中,我们讲到了ToolHelp API,Process API和提升Debug权限,这一篇中来说说如何获取进程的程序路径。 获取进程路径其实有很多方法。 方法1。使用ToolHelp API枚举...

在Windows上获取进程的可执行文件路径

在Windows上根据进程PID获取其可执行文件的路径,是一个常见的问题。通常我们采用广为人知的API——GetModuleFileNameEx。此函数兼容性极佳,最低支持版本为Windows2000...
  • mkdym
  • mkdym
  • 2013年03月21日 19:33
  • 2472

获取进程全路径

BOOL GetProcPath( __in BOOL bCurrentProc, __in ULONG ulPid, __inout LPTSTR lpProcPath, __in ULO...

VC下通过进程ID获取进程镜像文件路径的方法及其存在的缺陷

工作中经常会遇到通过进程ID获取进程镜像文件或者其他模块的路径的需求。(转载请指明出处)网上关于方案大致存在两种方案:         1 OpenProcess->GetModuleFileName...

获取进程全路径

先获取进程PID,通过PID获取eprocess结构后调用KeStackAttachProcess附加到该结构上,然后调用ZwQueryInformationProcess查询进程ProcessIma...
  • zyorz
  • zyorz
  • 2017年04月19日 18:25
  • 307
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WindowsAPI详解——获得进程可执行文件路径的几种方法
举报原因:
原因补充:

(最多只允许输入30个字)