Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Windows - How to get process path from its PID

Tags:

c++

windows

How can I retrieve a process's fully-qualified path from its PID using C++ on Windows?

like image 565
Shante Avatar asked Dec 19 '09 15:12

Shante


People also ask

How do I find the PID path?

We can get the PID of a process with the help of the ps command. Let's start an editor process and get its PID using the ps command: $ gedit test.

What is PID windows?

In computing, the process identifier (a.k.a. process ID or PID) is a number used by most operating system kernels—such as those of Unix, macOS and Windows—to uniquely identify an active process.


2 Answers

Call OpenProcess to get a handle to the process associated with your PID. Once you have a handle to the process, call GetModuleFileNameEx to get its fully-qualified path. Don't forget to call CloseHandle when you're finished using the process handle.

Here's a sample program that performs the required calls (replace 1234 with your PID):

#include <windows.h>
#include <psapi.h> // For access to GetModuleFileNameEx
#include <tchar.h>

#include <iostream>

using namespace std;

#ifdef _UNICODE
  #define tcout wcout
  #define tcerr wcerr
#else
  #define tcout cout
  #define tcerr cerr
#endif

int _tmain(int argc, TCHAR * argv[])
{
  HANDLE processHandle = NULL;
  TCHAR filename[MAX_PATH];

  processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, 1234);
  if (processHandle != NULL) {
    if (GetModuleFileNameEx(processHandle, NULL, filename, MAX_PATH) == 0) {
      tcerr << "Failed to get module filename." << endl;
    } else {
      tcout << "Module filename is: " << filename << endl;
    }
    CloseHandle(processHandle);
  } else {
    tcerr << "Failed to open process." << endl;
  }

  return 0;
}
like image 154
Emerick Rogul Avatar answered Oct 20 '22 11:10

Emerick Rogul


Some notes to Emerick Rogul's solution:

Don't forget to add 'psapi.lib' to linker (additional dependencies).

I also changed PROCESS_ALL_ACCESS to PROCESS_QUERY_INFORMATION | PROCESS_VM_READ because I got:

Failed to open process.

If it's compiled as a 32 bit application it will fail to get the name of 64 bit processes ("Failed to get module filename.")

like image 39
Steven Spark Avatar answered Oct 20 '22 11:10

Steven Spark