在Win32 API中,给定PID,如何确定磁盘上的可执行文件路径?

Ste*_*eod 1 winapi

在Win32中,我获得了某个运行进程的进程ID.现在,我想确定文件系统中进程可执行文件所在的路径.

例如.如果"tasklist"显示"image name"为"foobar.exe",PID为1234.可执行文件位于c:\ Program Files(x86)\ Acme Corp\foobar.exe

哪个Win32 API调用将接受PID 1234并给我路径"c:\ Program Files(x86)\ Acme Corp\foobar.exe"?

Mus*_*lik 6

您应该使用OpenProcess打开进程以获取进程句柄,然后使用句柄使用GetModuleFileNameEx API函数获取路径.

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, _PID_);
if (hProcess)
{
    TCHAR path[MAX_PATH];
    if (GetModuleFileNameEx(hProcess, NULL, path, sizeof(path)))
    {
        MessageBox(0, path, "The path", MB_ICONINFORMATION);
    }
    CloseHandle(hProcess);
}
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,使用"PROCESS_QUERY_INFORMATION | PROCESS_VM_READ"足以获取路径检索的进程句柄.如果失败,则使用PROCESS_ALL_ACCESS.

  • [`GetModuleFileNameEx()`文档](http://msdn.microsoft.com/en-us/library/windows/desktop/ms683198.aspx)声明:"检索远程进程的主可执行模块的名称,使用`GetProcessImageFileName`或`QueryFullProcessImageName`函数." 你应该使用它们,因为它们只需要`PROCESS_QUERY_LIMITED_INFORMATION`并且不需要`PROCESS_VM_READ`,因此它们在处理UAC,完整性权限等时更有可能成功. (2认同)