当前位置: 首页 > news >正文

VC++获取指定进程的路径-支持32位和64位

项目中 需要获取指定进程的运行路径,使用GetModuleFileNameEx无法使用32位程序获取64位程序的路径,GetProcessImageFileName可以获取32位和64位程序的进程全路径,

但GetProcessImageFileName获取的路径都是包含设备名的路径,因此我们还要转换成一下.

BOOL GetProcessFullPath(DWORD dwPID, TCHAR* pszFullPath)
 {
   
         TCHAR        szImagePath[MAX_PATH] = {_T("0")};
         HANDLE        hProcess = NULL;

         if(!pszFullPath)
             return FALSE;

         pszFullPath[0] = '\0';
         hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);
         if(!hProcess)
             return FALSE;

         if(!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH))
         {
             CloseHandle(hProcess);
             return FALSE;
         }

         if(!DosPathToNtPath(szImagePath, pszFullPath))
         {
             CloseHandle(hProcess);
             return FALSE;
         }

         CloseHandle(hProcess);

         return TRUE;

 }

 BOOL DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath)
 {
         TCHAR        szDriveStr[500] = {_T("0")};
         TCHAR        szDrive[3] = {};
         TCHAR        szDevName[100] = {};
         INT                cchDevName;
         INT                i;

         //检查参数
         if(!pszDosPath || !pszNtPath )
             return FALSE;

         //获取本地磁盘字符串
         if(GetLogicalDriveStrings(sizeof(szDriveStr), szDriveStr))
         {
             for(i = 0; szDriveStr[i]; i += 4)
             {
                 if(!lstrcmpi(&(szDriveStr[i]), _T("A:\\")) || !lstrcmpi(&(szDriveStr[i]), _T("B:\\")))
                     continue;

                 szDrive[0] = szDriveStr[i];
                 szDrive[1] = szDriveStr[i + 1];
                 szDrive[2] = '\0';
                 if(!QueryDosDevice(szDrive, szDevName, 100))//查询 Dos 设备名
                     return FALSE;

                 cchDevName = lstrlen(szDevName);
                 if(_tcsnicmp(pszDosPath, szDevName, cchDevName) == 0)//命中
                 {
                     lstrcpy(pszNtPath, szDrive);//复制驱动器
                     lstrcat(pszNtPath, pszDosPath + cchDevName);//复制路径

                     return TRUE;
                 }            
             }
         }

         lstrcpy(pszNtPath, pszDosPath);

         return FALSE;
    
 }

int test()
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hSnapshot)
    {
        return NULL;
    }
    PROCESSENTRY32 pe ={0};
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    BOOL fOk;
    for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
    {
        TCHAR szProcessName[MAX_PATH] = {0};
        GetProcessFullPath(pe.th32ProcessID, szProcessName);
    }
    return 0;
}


http://www.mrgr.cn/news/66775.html

相关文章:

  • 【CSS】标准怪异盒模型
  • 智慧水肥一体化:道品科技现代农业的智能管理模式
  • Logstash 安装与部署(无坑版)
  • Zabbix低权限SQL注入至RCE+权限绕过
  • Qt项目实战:红绿灯小程序
  • 如何在 React 前端使用 Input 输入框的样式上传一个 Excel 文件,并读取文件内容转成 json 数据格式(对象数组)
  • 解决Android Studio 控制台中文乱码
  • R语言生物群落(生态)数据统计分析与绘图丨tidyverse数据清洗、多元统计分析、随机森林、回归及混合效应模型、结构方程模型等
  • 饱和限幅器MATLAB和CODESYS平台下的实现
  • Node.js简介以及安装部署 (基础介绍 一)
  • 【硬件相关】网络配置说明(IPv4 vs IPv6)
  • 自动数据分析实操代码(免费领取)
  • 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
  • TextIn ParseX文档解析SDK工具新增Java版本
  • 【最新资讯】乘云数字 荣获中国信通院“稳定性保障实验室理事单位证书”!
  • (C++回溯算法)微信小程序“开局托儿所”游戏
  • mysql 安装 windows
  • 第三百一十二节 Java线程教程 - Java多线程
  • AI 写作(一):开启创作新纪元(1/10)
  • Sourcetree 配置第三方比较工具
  • AI Prompt如何帮你提升论文中的逻辑推理部分?
  • 深⼊理解指针(1)
  • 02- 模块化编程-006 ADC0808数码显示对比
  • 【VScode】调试
  • 号码品牌认证:有效提升企业外呼接通率
  • 腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时