获得指定 PID 的进程可执行文件全路径

#ifndef __PSLIB_H__
#define __PSLIB_H__
DWORD WINAPI GetProcessName(DWORD dwProcessId, LPTSTR pszName, DWORD nSize, BOOL bFullPath);
#endif // __PSLIB_H__

实现为:

#include <windows.h>
#include <tlhelp32.h>
#include <psapi.h>

// For _tcsrchr()
#include <stdlib.h>
#include <tchar.h>

#include "pslib.h"

// For Windows 9x series
typedef HANDLE (WINAPI * fnCreateToolhelp32Snapshot)(DWORD dwFlags, DWORD th32ProcessID);
typedef BOOL (WINAPI * fnProcess32First)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
typedef BOOL (WINAPI * fnProcess32Next)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
typedef BOOL (WINAPI * fnThread32First)(HANDLE hSnapshot, LPTHREADENTRY32 lpte);
typedef BOOL (WINAPI * fnThread32Next)(HANDLE hSnapshot, LPTHREADENTRY32 lpte);

// For Windows NT series
typedef BOOL (WINAPI * fnEnumProcessModules)(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded);
typedef DWORD (WINAPI * fnGetModuleBaseName)(HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
typedef DWORD (WINAPI * fnGetModuleFileNameEx)(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize);

#define DECL_PFUNC(f)   static fn##f my##f = NULL
DECL_PFUNC(CreateToolhelp32Snapshot);
DECL_PFUNC(Process32First);
DECL_PFUNC(Process32Next);
// DECL_PFUNC(Thread32First);
// DECL_PFUNC(Thread32Next);
DECL_PFUNC(EnumProcessModules);
DECL_PFUNC(GetModuleBaseName);
DECL_PFUNC(GetModuleFileNameEx);
#undef DECL_PFUNC

#ifdef UNICODE
#define TAIL_CHAR   TEXT("W")
#else
#define TAIL_CHAR   TEXT("A")
#endif // !UNICODE

static void GetSnapshotFunctions()
{
    HINSTANCE hKernel32 = GetModuleHandle(TEXT("Kernel32.dll"));
#define GET_KERNEL_FUNCTION(f)  if(my##f == NULL) my##f = (fn##f)GetProcAddress(hKernel32, #f)
    GET_KERNEL_FUNCTION(CreateToolhelp32Snapshot);
    GET_KERNEL_FUNCTION(Process32First);
    GET_KERNEL_FUNCTION(Process32Next);
//  GET_KERNEL_FUNCTION(Thread32First);
//  GET_KERNEL_FUNCTION(Thread32Next);
#undef GET_KERNEL_FUNCTION
}

static void GetPsapiFunctions()
{
    HINSTANCE hPsapi = GetModuleHandle(TEXT("psapi.dll"));
    if(hPsapi == NULL)
        hPsapi = LoadLibrary(TEXT("psapi.dll"));
#define GET_PSAPI_FUNCTION(f)   if(my##f == NULL) my##f = (fn##f)GetProcAddress(hPsapi, #f)
#define GET_PSAPI_FUNCTION_T(f) if(my##f == NULL) my##f = (fn##f)GetProcAddress(hPsapi, #f ##TAIL_CHAR)
    GET_PSAPI_FUNCTION(EnumProcessModules);
    GET_PSAPI_FUNCTION_T(GetModuleBaseName);
    GET_PSAPI_FUNCTION_T(GetModuleFileNameEx);
#undef GET_KERNEL_FUNCTION
#undef GET_KERNEL_FUNCTION_T
}

DWORD WINAPI GetProcessName(DWORD dwProcessId, LPTSTR pszName, DWORD nSize, BOOL bFullPath)
{
    BOOL bWindows9x = (HIWORD(GetVersion()) & 0x8000);
    if(bWindows9x)
    {
        GetSnapshotFunctions();

        // Take a snapshot of all processes in the system.
        HANDLE hProcessSnap = myCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if(hProcessSnap == INVALID_HANDLE_VALUE)
            return 0;

        DWORD dwRet = 0;
        // Retrieve information
        PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
        if(myProcess32First(hProcessSnap, &pe32))
        {
            do
            {
                if(pe32.th32ProcessID == dwProcessId)
                {
                    LPTSTR pszExeFile = pe32.szExeFile;
                    if(!bFullPath)
                    {
                        pszExeFile = _tcsrchr(pe32.szExeFile, _T('//'));
                        if(pszExeFile)
                            pszExeFile++;
                    }

                    lstrcpyn(pszName, pszExeFile, nSize);
                    dwRet = lstrlen(pszName) + 1;
                    break;
                }
            } while(myProcess32Next(hProcessSnap, &pe32));
        }

        CloseHandle(hProcessSnap);     // Must clean up the snapshot object!
        return dwRet;
    }
    else
    {
        GetPsapiFunctions();

        // Get a handle to the process.
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);

        // Get the process name.
        if(hProcess == NULL)
            return 0;

        HMODULE hMod;
        DWORD cb;

        BOOL bRet = myEnumProcessModules(hProcess, &hMod, sizeof(hMod), &cb);
        if(bRet)
        {
            if(bFullPath)
                cb = myGetModuleFileNameEx(hProcess, hMod, pszName, nSize);
            else
                cb = myGetModuleBaseName(hProcess, hMod, pszName, nSize);
        }

        CloseHandle(hProcess);

        return bRet ? cb : 0;
    }
}
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值