GetProcessImageFileName (psapi)
Last changed: -

Retrieves the name of the executable file for the specified process.

C# Signature:

static extern uint GetProcessImageFileName(
    IntPtr hProcess,
    [Out] StringBuilder lpImageFileName,
    [In] [MarshalAs(UnmanagedType.U4)] int nSize

VB Signature:

Declare Function GetProcessImageFileName Lib "psapi.dll"
<DllImport("psapi.dll")> _
Public Shared Function GetProcessImageFileName(
    ByVal hProcess As IntPtr,
    <Out> lpImageFileName As StringBuilder,
    <[In]> <MarshalAs(UnmanagedType.U4)> uSize As Integer
) As UInteger
End Function

User-Defined Types:


Alternative Managed API:

Do you know one? Please contribute it!


From MSDN: The GetProcessImageFileName function returns the path in device form, rather than drive letters. For example, the file name C:\Winnt\System32\Ctype.nls would look as follows in device form:


This can be used in place of the GetModuleFileName call, which doesn't work on processes that haven't been loaded by the current one.

Tips & Tricks:

I found this to be more comprehensive than GetModuleFileNameEx. Didnt need to enumerate windows or modules

Sample Code:

Purpose of program is finding the executable under the mouse cursor..a Point

uint pid = 0;
StringBuilder fileName = new StringBuilder(2000);

/** get the handle for point under cursor **/
IntPtr hWnd = WindowFromPoint(pt);

/** Need to get the process ID from handle under cursor **/
GetWindowThreadProcessId(hWnd, out pid);

/** Hook into process **/
IntPtr pic = OpenProcess(NativeMethods.ProcessAccessFlags.All, true, (int)pid);

/** This gets the filename of the process image. Path is in device format **/
GetProcessImageFileName(pic, fileName, 2000);