通过GetProcessImageFileName函数获取进程路径

由于函数GetModuleFileName() 和 函数GetModuleFileNameEx()都是通过PEB头信息获取进程文件路径,所以它们只能工作于与调用进程相同位数的进程,比如:调用进程32位时,这两个函数只对32位进程有效,64位同理。所以在64位进程与32位进程并存的64位机器中,只能通过GetProcessImageFileName()函数获取进程的DOS文件路径,再通过与LogicalDriveStrings比对拼接出进程可执行文件的完整路径,方法如下:

#include <Psapi.h>

/* 功  能:获取指定进程所对应的可执行(EXE)文件全路径
 * 参  数:hProcess - 进程句柄。必须具有PROCESS_QUERY_INFORMATION 或者
                     PROCESS_QUERY_LIMITED_INFORMATION 权限
 *         sFilePath - 进程句柄hProcess所对应的可执行文件路径
 * 返回值:
 */
void GetProcessFilePath(IN HANDLE hProcess, OUT CString& sFilePath)
{
    sFilePath = _T("");
    TCHAR tsFileDosPath[MAX_PATH + 1];
    ZeroMemory(tsFileDosPath, sizeof(TCHAR)*(MAX_PATH + 1));
    if (0 == GetProcessImageFileName(hProcess, tsFileDosPath, MAX_PATH + 1))
    {
        return;
    }

    // 获取Logic Drive String长度
    UINT uiLen = GetLogicalDriveStrings(0, NULL);
    if (0 == uiLen)
    {
        return;
    }

    PTSTR pLogicDriveString = new TCHAR[uiLen + 1];
    ZeroMemory(pLogicDriveString, uiLen + 1);
    uiLen = GetLogicalDriveStrings(uiLen, pLogicDriveString);
    if (0 == uiLen)
    {
        delete[]pLogicDriveString;
        return;
    }

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

    do
    {
        szDrive[0] = *pLogicIndex;
        uiLen = QueryDosDevice(szDrive, pDosDriveName, MAX_PATH);
        if (0 == uiLen)
        {
            if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
            {
                break;
            }

            delete[]pDosDriveName;
            pDosDriveName = new TCHAR[uiLen + 1];
            uiLen = QueryDosDevice(szDrive, pDosDriveName, uiLen + 1);
            if (0 == uiLen)
            {
                break;
            }
        }

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

        while (*pLogicIndex++);
    } while (*pLogicIndex);

    delete[]pLogicDriveString;
    delete[]pDosDriveName;
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值