VC获取父进程PID

// tt.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>  
#include <stdio.h>  

typedef enum enumSYSTEM_INFORMATION_CLASS  
{  
    SystemBasicInformation,  
    SystemProcessorInformation,  
    SystemPerformanceInformation,  
    SystemTimeOfDayInformation,  
}SYSTEM_INFORMATION_CLASS;  

typedef struct tagPROCESS_BASIC_INFORMATION  
{  
    DWORD ExitStatus;  
    DWORD PebBaseAddress;  
    DWORD AffinityMask;  
    DWORD BasePriority;  
    ULONG UniqueProcessId;  
    ULONG InheritedFromUniqueProcessId;  
}PROCESS_BASIC_INFORMATION;  

typedef LONG (WINAPI *PNTQUERYINFORMATIONPROCESS)(HANDLE,UINT,PVOID,ULONG,PULONG);  
PNTQUERYINFORMATIONPROCESS  NtQueryInformationProcess = NULL;  

#define PRINT_LINE  printf("---------------------------------------------\n")  

int GetParentProcessID(DWORD dwId)  
{  
    LONG                      status;  
    DWORD                     dwParentPID = 0;  
    HANDLE                    hProcess;  
    PROCESS_BASIC_INFORMATION pbi;  

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwId);  
    if(!hProcess)  
        return -1;  

    status = NtQueryInformationProcess(hProcess,SystemBasicInformation,(PVOID)&pbi,sizeof(PROCESS_BASIC_INFORMATION),NULL);  
    if(!status)  
        dwParentPID = pbi.InheritedFromUniqueProcessId;  

    CloseHandle (hProcess);  
    return dwParentPID;  
}  


int _tmain(int argc, _TCHAR* argv[])
{
    NtQueryInformationProcess = (PNTQUERYINFORMATIONPROCESS)GetProcAddress(GetModuleHandle("ntdll"),"NtQueryInformationProcess");  
    if (!NtQueryInformationProcess)  
        return -1;  

    int nID   = GetCurrentProcessId();  
    int nTemp = 0;  

    PRINT_LINE;  
    nTemp = GetParentProcessID(nID);  
    if(nTemp == -1)  
    {  
        printf(" 获取失败!\n");  
        return -1;  
    }  

    printf("进程:%lu ---->>>>>父进程PID为:%lu\n",nID,nTemp);  
    while (true)  
    {  
        nID = GetParentProcessID(nTemp);  
        if(nID == -1)  
            break;  

        printf("进程:%lu ---->>>>>父进程PID为:%lu\n",nTemp,nID);  
        nTemp = nID;  
    }  

    PRINT_LINE;  
    getchar();  
                                         
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值