通过进程ID获取执行文件路径

来源:互联网 发布:洛阳商通网络 编辑:程序博客网 时间:2024/05/15 07:46
// Process.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <windows.h>

BOOL GetProcessPath(UINT uProcessID, LPSTR szProcessName, DWORD dwSize)
{

typedef BOOL (__stdcall *EnumProcessModules_TYPE) (
  HANDLE hProcess,
  HMODULE* lphModule,
  DWORD cb,
  LPDWORD lpcbNeeded
);

EnumProcessModules_TYPE _EnumProcessModules = NULL;


HMODULE *pMods = NULL;
DWORD cbNeedSize = 0;

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, uProcessID);

if (hProcess == NULL) {
return FALSE;
}


HMODULE hPsapi = LoadLibrary("psapi.dll");

if (hPsapi == NULL) {
CloseHandle(hProcess);
return FALSE;
}

_EnumProcessModules = (EnumProcessModules_TYPE)GetProcAddress(hPsapi, "EnumProcessModules");

if (_EnumProcessModules == NULL) {
CloseHandle(hProcess);
FreeLibrary(hPsapi);
return FALSE;
}

if (!_EnumProcessModules(hProcess, pMods, 0, &cbNeedSize)) {
CloseHandle(hProcess);
FreeLibrary(hPsapi);
return FALSE;
}

pMods = (HMODULE*)LocalAlloc(LPTR, cbNeedSize);
if (!_EnumProcessModules(hProcess, pMods, 0, &cbNeedSize)) {
CloseHandle(hProcess);
FreeLibrary(hPsapi);
LocalFree(pMods);
return FALSE;
}


typedef DWORD (__stdcall *GetModuleFileNameEx_TYPE) (
  HANDLE hProcess,
  HMODULE hModule,
  LPTSTR lpFilename,
  DWORD nSize
);

GetModuleFileNameEx_TYPE _GetModuleFileNameEx;

_GetModuleFileNameEx = (GetModuleFileNameEx_TYPE)GetProcAddress(hPsapi, "GetModuleFileNameExA");

if (_GetModuleFileNameEx == NULL) {
LocalFree(pMods);
CloseHandle(hProcess);
FreeLibrary(hPsapi);
return FALSE;
}


if (!_GetModuleFileNameEx(hProcess, pMods[0], szProcessName, dwSize)) {
LocalFree(pMods);
CloseHandle(hProcess);
FreeLibrary(hPsapi);
return FALSE;
}

LocalFree(pMods);
CloseHandle(hProcess);
FreeLibrary(hPsapi);

return TRUE;
}


int main(int argc, char* argv[])
{
CHAR szProcessName[MAX_PATH];
GetProcessPath(0x1fc, szProcessName, MAX_PATH);

return 0;
}