本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/47746621

上两篇中,我们讲到了ToolHelp API,Process API和提升Debug权限,这一篇中来说说如何获取进程的程序路径。

获取进程路径其实有很多方法。

方法1。使用ToolHelp API枚举模块,其中,Module32First得到一个MODULEENTRY32 结构,结构中有一个szExePath成员,这个成员代表这个进程第一个模块的路径,也就是进程的路径

(32位程序只能获取32位程序路径,64位程序可以获取32位和64位程序路径,但需要把TH32CS_SNAPMODULE换成TH32CS_SNAPMODULE32)

方法2。使用OpenProcess打开进程,需要具有PROCESS_QUERY_INFORMATION 和 PROCESS_VM_READ权限,然后用EnumProcessModules获取第一个模块的模块句柄,之后用GetModuleFileNameEx获取模块路径。

EnumProcessModules的模块句柄无需释放:Do not call CloseHandle on any of the handles returned by this function. The information comes from a snapshot, so there are no resources to be freed.

(32位程序只能获取32位程序路径,64位程序只能获取64位程序路径)

完整源码:

#define PSAPI_VERSION 1
#include <psapi.h>
#pragma comment(lib,"psapi.lib")
// 获取进程路径 参数1:进程ID 参数2:缓冲区指针,接收路径
void GetProcessPath(DWORD dwProcessID, LPCTSTR buffer)
{   TCHAR Filename[MAX_PATH];HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID);if (hProcess == NULL)return;HMODULE hModule;DWORD cbNeeded;if (EnumProcessModules(hProcess, &hModule, sizeof(hModule), &cbNeeded)){if (GetModuleFileNameEx(hProcess, hModule, Filename, MAX_PATH)){RtlMoveMemory((void*)buffer, Filename, sizeof(TCHAR)*MAX_PATH);}}CloseHandle(hProcess);
}

方法3。使用GetProcessImageFileName,可以在32位程序中获取32位和64位进程路径,这个可以在xp和以后系统中用,但是取得的进程路径是设备名路径,所以还需要遍历磁盘驱动器转换成我们需要的路径,比较麻烦。

方法4。使用QueryFullProcessImageName,可以在32位程序中获取32位和64位进程路径,同时这也是微软提供的32位程序获取64位进程路径的正确方法,缺点是只能在Vista以后的系统中用

BOOL WINAPI QueryFullProcessImageName(_In_    HANDLE hProcess,_In_    DWORD  dwFlags,_Out_   LPTSTR lpExeName,_Inout_ PDWORD lpdwSize
);

hProcess:进程句柄,需要具有PROCESS_QUERY_INFORMATION或者PROCESS_QUERY_LIMITED_INFORMATION权限

dwFlags:以下值

0:名称应使用 Win32 路径格式。

PROCESS_NAME_NATIVE:名称应使用原生系统路径格式

lpExeName:缓冲区指针,用于接收可执行映像的路径

lpdwSize:以字符为单位指定缓冲区大小的 lpExeName,不包括空终止字符的数

返回值:如果此函数成功,返回值不为零。如果函数失败,返回值为零。

不过感觉这个函数忒难用,,那么加上这个函数,GetModuleFileNameEx获取不了的就用QueryFullProcessImageName,那么GetProcessPath就成这样的了:

// 获取进程路径 参数1:进程ID 参数2:缓冲区指针,接收路径
void GetProcessPath(DWORD dwProcessID, LPCTSTR buffer)
{TCHAR Filename[MAX_PATH];HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID);if (hProcess == NULL)return;HMODULE hModule;DWORD cbNeeded;if (EnumProcessModules(hProcess, &hModule, sizeof(hModule), &cbNeeded)){if (GetModuleFileNameEx(hProcess, hModule, Filename, MAX_PATH)){RtlMoveMemory((void*)buffer, Filename, sizeof(TCHAR)*MAX_PATH);}}else{DWORD size = MAX_PATH;if (QueryFullProcessImageName(hProcess, 0, Filename, &size)){RtlMoveMemory((void*)buffer, Filename, sizeof(TCHAR)*MAX_PATH);}}CloseHandle(hProcess);
}

这样绝大部分进程都可以获取路径了,有几个系统进程(比如services.exe)进程即使以Debug也无法打开获取句柄,因此无法获取路径



[Win32] 获取进程完整路径相关推荐

  1. NT5/NT6上的获取进程全路径

    前面说过使用一大堆函数获取全路径 PID->eprocess->KeStackAttachProcess->ZwQueryInformationProcess->Process ...

  2. Bash脚本获取自身完整路径的可靠方法

    本文翻译自:Reliable way for a Bash script to get the full path to itself [duplicate] This question alread ...

  3. 获取进程全路径方法(支持xp、win7、win10系统)

    获取进程全路径方法(支持xp.win7.win10系统) 获取进程的全路径的函数包括GetModuleFileNameEx.GetProcessImageFileName.QueryFullProce ...

  4. PHP获取URL完整路径及物理路径

    2019独角兽企业重金招聘Python工程师标准>>> PHP的预定义变量$_SERVER是一个包含头部(headers),路径信息及脚本位置的数组,数组的实体由web服务器创建. ...

  5. 批处理查找html,批处理(bat)实现全盘搜索指定文件获取其完整路径方法大全,bat大全分享...

    废话不多说,直接上代码,额,想用的话,自己保存成 [方案一]for /f + dir % [方案二]for /r(比 for /f + dir 效率高,但不会遍历隐藏文件) @echo off rem ...

  6. linux c 获取进程 可执行文件路径

    目录 获取当前进程 可执行文件路径 获取指定id进程 可执行文件路径 获取当前进程 可执行文件路径 #include <stdio.h> #include <unistd.h> ...

  7. 易语言API获取进程程序路径

    通过传递进程ID取指定进程的程序路径,成功返回程序路径,失败返回空,用到以下API: 1.CreateToolhelp32Snapshot 快照句柄 = CreateToolhelp32Snapsho ...

  8. WIN32获取进程当前目录

    使用函数 GetCurrentDirectory #include <WINDOWS.H>int main(int argc, char* argv[]) { CHAR szDir[256 ...

  9. C++获取当前所有进程的完整路径

    实现代码 #include <stdio.h> #include <windows.h> #include <tlhelp32.h> #include <st ...

最新文章

  1. 基于先验时间一致性车道线的IPM相机外参标定
  2. Java小工具:TimingTools
  3. [git]git忽略文件
  4. 利用putty的pscp命令执行Linux服务器命令
  5. C语言编程规范--代码注释
  6. 计算机组成原理第八章课后答案6,计算机组成原理 第八章 复习
  7. 搭载麒麟990 5G SoC 华为MatePad Pro 5G全球首发
  8. 蓝桥杯 ADV-162 算法提高 题目1 最大最小值
  9. linux 驱动编译静态,Linux驱动静态编译和动态编译方法详解
  10. 安卓Java开启usb热点_安卓手机通过USB共享PC的宽带网络上网
  11. 经典的java角色扮演,盘点2010年十大经典角色扮演类游戏合集
  12. 用C#实现汉字转化为拼音
  13. 1、ZigBee 开发教程之基础篇—ZigBee简介和学习方法
  14. java.sql.SQLException: The server time zone value ' й ׼ʱ ' is unrecognized or represents more tha
  15. Virtual Table — RTTI — typeinfo dynamic_cast 模板编程 orocos OperationCaller 类的设计
  16. phyton计算每天进步的力量
  17. IOS开发之内购-AppStore
  18. 某开发机器人公司面试
  19. datawhale 8月学习——NLP之Transformers:编写BERT模型
  20. 黑猫带你学UFS协议第1篇:全网最全UFS协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

热门文章

  1. 安卓日志:拍照、文件读取的问题
  2. SqlServer2017 AlwaysOn 读写分离 无域控
  3. Android Things 开发入门
  4. DNS欺骗与钓鱼网站
  5. 进程三态与五态是什么?
  6. 各种数学平均数之间的关系
  7. C51蜂鸣器演奏两只老虎
  8. JavaScript 杨辉三角 杨辉三角 II
  9. ps 画中间透明的边框图形
  10. jquery插件手风琴效果