看流星社区

 找回密码
 注册账号
查看: 2665|回复: 1

通过GetProcessImageFileName函数获取进程路径

[复制链接]

该用户从未签到

发表于 2016-6-29 17:03:17 | 显示全部楼层 |阅读模式

由于函数GetModuleFileName() 和 函数GetModuleFileNameEx()都是通过PEB头信息获取进程文件路径,所以它们只能工作于与调用进程相同位数的进程,比如:调用进程32位时,这两个函数只对32位进程有效,64位同理。

所以在64位进程与32位进程并存的64位机器中,只能通过GetProcessImageFileName()函数获取进程的DOS文件路径,再通过与LogicalDriveStrings比对拼接出进程可执行文件的完整路径,方法如下:


  1. #include <Psapi.h>

  2. /* 功  能:获取指定进程所对应的可执行(EXE)文件全路径
  3. * 参  数:hProcess - 进程句柄。必须具有PROCESS_QUERY_INFORMATION 或者 PROCESS_QUERY_LIMITED_INFORMATION 权限
  4. * sFilePath - 进程句柄hProcess所对应的可执行文件路径
  5. * 返回值:
  6. */

  7. void GetProcessFilePath(IN HANDLE hProcess, OUT CString& sFilePath)
  8. {
  9.     sFilePath = _T("");
  10.     TCHAR tsFileDosPath[MAX_PATH + 1];
  11.     ZeroMemory(tsFileDosPath, sizeof(TCHAR)*(MAX_PATH + 1));
  12.     if (0 == GetProcessImageFileName(hProcess, tsFileDosPath, MAX_PATH + 1))
  13.     {
  14.         return;
  15.     }

  16.     // 获取Logic Drive String长度
  17.     UINT uiLen = GetLogicalDriveStrings(0, NULL);
  18.     if (0 == uiLen)
  19.     {
  20.         return;
  21.     }

  22.     PTSTR pLogicDriveString = new TCHAR[uiLen + 1];
  23.     ZeroMemory(pLogicDriveString, uiLen + 1);
  24.     uiLen = GetLogicalDriveStrings(uiLen, pLogicDriveString);
  25.     if (0 == uiLen)
  26.     {
  27.         delete[]pLogicDriveString;
  28.         return;
  29.     }

  30.     TCHAR szDrive[3] = TEXT(" :");
  31.     PTSTR pDosDriveName = new TCHAR[MAX_PATH];
  32.     PTSTR pLogicIndex = pLogicDriveString;

  33.     do
  34.     {
  35.         szDrive[0] = *pLogicIndex;
  36.         uiLen = QueryDosDevice(szDrive, pDosDriveName, MAX_PATH);
  37.         if (0 == uiLen)
  38.         {
  39.             if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
  40.             {
  41.                 break;
  42.             }

  43.             delete[]pDosDriveName;
  44.             pDosDriveName = new TCHAR[uiLen + 1];
  45.             uiLen = QueryDosDevice(szDrive, pDosDriveName, uiLen + 1);
  46.             if (0 == uiLen)
  47.             {
  48.                 break;
  49.             }
  50.         }

  51.         uiLen = _tcslen(pDosDriveName);
  52.         if (0 == _tcsnicmp(tsFileDosPath, pDosDriveName, uiLen))
  53.         {
  54.             sFilePath.Format(_T("%s%s"), szDrive, tsFileDosPath + uiLen);
  55.             break;
  56.         }

  57.         while (*pLogicIndex++);
  58.     } while (*pLogicIndex);

  59.     delete[]pLogicDriveString;
  60.     delete[]pDosDriveName;
  61. }
复制代码

点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 16:42

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表