Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取父进程名称(Windows)_C_Windows_Winapi_Process - Fatal编程技术网

C 获取父进程名称(Windows)

C 获取父进程名称(Windows),c,windows,winapi,process,C,Windows,Winapi,Process,我试图在Windows控制台应用程序(C/C++)中获取父进程的名称(完整路径)。看起来它应该会起作用,但它正在失败,我看不出我做错了什么。它正在成功获取父PID,但获取名称失败。如有任何更正,将不胜感激 #include <Windows.h> #include <stdio.h> #include <tlhelp32.h> #include <Psapi.h> DWORD getParentPID(DWORD pid) { HANDL

我试图在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);
}
#包括
#包括
#包括
#包括
DWORD getParentPID(DWORD pid)
{
句柄h=NULL;
PROCESSENTRY32 pe={0};
DWORD ppid=0;
pe.dwSize=sizeof(PROCESSENTRY32);
h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(进程32第一(h和pe))
{
做
{
if(pe.th32ProcessID==pid)
{
ppid=pe.th32ParentProcessID;
打破
}
}while(Process32Next(h,&pe));
}
闭合手柄(h);
返回(ppid);
}
int getProcessName(DWORD pid、PUCHAR fname、DWORD sz)
{
句柄h=NULL;
int e=0;
h=开放进程
(
处理查询信息,
假,,
pid
);
如果(h)
{
if(GetModuleFileNameEx(h,NULL,fname,sz)==0)
e=GetLastError();
闭合手柄(h);
}
其他的
{
e=GetLastError();
}
返回(e);
}
int main(int argc,char*argv[])
{
DWORD-pid,ppid;
INTE;
char fname[MAX_PATH]={0};
pid=GetCurrentProcessId();
ppid=getParentPID(pid);
e=getProcessName(ppid、fname、最大路径);
printf(“PPID=%d Err=%d EXE={%s}\n”,PPID,e,fname);
}

其他信息:
OpenProcess返回5(错误\u访问被拒绝)。如果我按照建议添加PROCESS\u VM\u READ,它将返回299(ERROR\u PARTIAL\u COPY)。我可以打开当前进程,但不能打开父进程。

使用附加的
process\u VM\u READ
标志调用
OpenProcess
,它应该可以工作:

h = OpenProcess
    (
    PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
    FALSE,
    pid
    );

另外,请查看Mekap在Windows Vista+上提到的可能重复项,您可以使用它来代替
GetModuleFileNameEx
OpenProcess
则只需使用权限较低的
PROCESS\u QUERY\u LIMITED\u INFORMATION
标志调用即可。

故障信息是否可能重复?调用OpenProcess(h的值是多少)或GetModuleFileNameEx(e的值是多少)?感谢您的回复-请参阅其他信息。@Mekap-这就是部分代码的来源。我可以得到当前进程的名称,但不能得到父进程的名称。谢谢您的建议。如果我包括进程\虚拟机\读取,我会从OpenProcess中得到错误299(错误\部分\复制)。否则会出现错误5。请查看MSDN文档中的注释:在64位系统上,如果32位进程请求有关64位进程的信息,此函数将返回
error\u PARTIAL\u COPY
。在这种情况下,您应该使用
QueryProcessFullImageName()
(Vista和更高版本)或
GetProcessImageFileName()
(XP和更高版本)。GetProcessImageFileName是票证。谢谢