获取父进程名称(Windows)

Nei*_*her 3 c windows winapi process

我试图在Windows控制台应用程序(C/C++)中获取父进程的名称(完整路径).它看起来应该有效,但它失败了,我看不出我做错了什么.它成功获取父PID,但未获取名称.任何更正将不胜感激.

#include <Windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <Psapi.h>

DWORD getParentPID(DWORD pid)
{
    HANDLE h = NULL;
    PROCESSENTRY32 pe = { 0 };
    DWORD ppid = 0;
    pe.dwSize = sizeof(PROCESSENTRY32);
    h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if( Process32First(h, &pe)) 
    {
        do 
        {
            if (pe.th32ProcessID == pid) 
            {
                ppid = pe.th32ParentProcessID;
                break;
            }
        } while( Process32Next(h, &pe));
    }
    CloseHandle(h);
    return (ppid);
}

int getProcessName(DWORD pid, PUCHAR fname, DWORD sz)
{
    HANDLE h = NULL;
    int e = 0;
    h = OpenProcess
    (
        PROCESS_QUERY_INFORMATION,
        FALSE,
        pid
    );
    if (h) 
    {
        if (GetModuleFileNameEx(h, NULL, fname, sz) == 0)
            e = GetLastError();
        CloseHandle(h);
    }
    else
    {
        e = GetLastError();
    }
    return (e);
}

int main(int argc, char *argv[]) 
{
    DWORD pid, ppid;
    int e;
    char fname[MAX_PATH] = {0};
    pid = GetCurrentProcessId();
    ppid = getParentPID(pid);
    e = getProcessName(ppid, fname, MAX_PATH);
    printf("PPID=%d Err=%d EXE={%s}\n", ppid, e, fname);
}
Run Code Online (Sandbox Code Playgroud)

附加信息:OpenProcess返回5(ERROR_ACCESS_DENIED).如果我按照建议添加PROCESS_VM_READ,则返回299(ERROR_PARTIAL_COPY).我可以打开当前进程,但不能打开父进程.

sb9*_*sb9 5

OpenProcess使用附加PROCESS_VM_READ标志调用它应该可以工作:

h = OpenProcess
    (
    PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
    FALSE,
    pid
    );
Run Code Online (Sandbox Code Playgroud)

另请查看 Mekap 提到的可能重复项

  • 看一下 [GetModuleFileNameEx](https://msdn.microsoft.com/en-us/library/windows/desktop/ms683198(v=vs.85).aspx) MSDN 文档中的注释:在 64 位系统上如果 32 位进程请求有关 64 位进程的信息,函数将返回“ERROR_PARTIAL_COPY”。在这种情况下,您应该使用“QueryProcessFullImageName()”(Vista 及更高版本)或“GetProcessImageFileName()”(XP 及更高版本)。 (3认同)

pet*_*rdn 5

在Windows Vista +上,您可以使用QueryFullProcessImageName而不是GetModuleFileNameEx.OpenProcess然后只需要使用较少特权的PROCESS_QUERY_LIMITED_INFORMATION标志来调用.