[Win32] 获取进程完整路径
本博文由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] 获取进程完整路径相关推荐
- NT5/NT6上的获取进程全路径
前面说过使用一大堆函数获取全路径 PID->eprocess->KeStackAttachProcess->ZwQueryInformationProcess->Process ...
- Bash脚本获取自身完整路径的可靠方法
本文翻译自:Reliable way for a Bash script to get the full path to itself [duplicate] This question alread ...
- 获取进程全路径方法(支持xp、win7、win10系统)
获取进程全路径方法(支持xp.win7.win10系统) 获取进程的全路径的函数包括GetModuleFileNameEx.GetProcessImageFileName.QueryFullProce ...
- PHP获取URL完整路径及物理路径
2019独角兽企业重金招聘Python工程师标准>>> PHP的预定义变量$_SERVER是一个包含头部(headers),路径信息及脚本位置的数组,数组的实体由web服务器创建. ...
- 批处理查找html,批处理(bat)实现全盘搜索指定文件获取其完整路径方法大全,bat大全分享...
废话不多说,直接上代码,额,想用的话,自己保存成 [方案一]for /f + dir % [方案二]for /r(比 for /f + dir 效率高,但不会遍历隐藏文件) @echo off rem ...
- linux c 获取进程 可执行文件路径
目录 获取当前进程 可执行文件路径 获取指定id进程 可执行文件路径 获取当前进程 可执行文件路径 #include <stdio.h> #include <unistd.h> ...
- 易语言API获取进程程序路径
通过传递进程ID取指定进程的程序路径,成功返回程序路径,失败返回空,用到以下API: 1.CreateToolhelp32Snapshot 快照句柄 = CreateToolhelp32Snapsho ...
- WIN32获取进程当前目录
使用函数 GetCurrentDirectory #include <WINDOWS.H>int main(int argc, char* argv[]) { CHAR szDir[256 ...
- C++获取当前所有进程的完整路径
实现代码 #include <stdio.h> #include <windows.h> #include <tlhelp32.h> #include <st ...
最新文章
- 基于先验时间一致性车道线的IPM相机外参标定
- Java小工具:TimingTools
- [git]git忽略文件
- 利用putty的pscp命令执行Linux服务器命令
- C语言编程规范--代码注释
- 计算机组成原理第八章课后答案6,计算机组成原理 第八章 复习
- 搭载麒麟990 5G SoC 华为MatePad Pro 5G全球首发
- 蓝桥杯 ADV-162 算法提高 题目1 最大最小值
- linux 驱动编译静态,Linux驱动静态编译和动态编译方法详解
- 安卓Java开启usb热点_安卓手机通过USB共享PC的宽带网络上网
- 经典的java角色扮演,盘点2010年十大经典角色扮演类游戏合集
- 用C#实现汉字转化为拼音
- 1、ZigBee 开发教程之基础篇—ZigBee简介和学习方法
- java.sql.SQLException: The server time zone value ' й ʱ ' is unrecognized or represents more tha
- Virtual Table — RTTI — typeinfo dynamic_cast 模板编程 orocos OperationCaller 类的设计
- phyton计算每天进步的力量
- IOS开发之内购-AppStore
- 某开发机器人公司面试
- datawhale 8月学习——NLP之Transformers:编写BERT模型
- 黑猫带你学UFS协议第1篇:全网最全UFS协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)