WIN32程序获取父进程ID的方法

 更新时间:2014年08月07日 14:57:52   投稿:shichen2014  
这篇文章主要介绍了WIN32程序获取父进程ID的方法,在进行windows程序开发的时候有一定的实用价值,需要的朋友可以参考下

学过windows程序设计的人都知道,windows中的进程是可以有父子关系的,拥有父子关系的进程,一旦父进程结束,子进程有会随之退出。但是如果进程之间没有父子关系,我们如何让子进程在父进程退出是也同时跟着退出呢?方法有很多,本文介绍其中的一种利用父进程ID的方案,实现的原理很简单:先获取父进程的ID,然后通过ID来获取父进程Handle,通过监视父进程的Handle来决定子进程是否退出。所以,这里的关键就是如何获取父进程的ID。

为了获取父进程ID,这里需要用到一个微软未公开的API:

NTSTATUS WINAPI NtQueryInformationProcess(
 __in    HANDLE ProcessHandle,
 __in    PROCESSINFOCLASS ProcessInformationClass,
 __out   PVOID ProcessInformation,
 __in    ULONG ProcessInformationLength,
 __out_opt PULONG ReturnLength
);

这个API位于Ntdll.dll里面,通过引用头文件winternl.h来获取相关的类型定义。当我们得到这个函数后,下一步就需要去了解各个函数参数的意义了,这里我们重点看一下第二个参数 PROCESSINFOCLASS结构体的内容:

 typedef struct _PROCESS_BASIC_INFORMATION {
  PVOID Reserved1;
  PPEB PebBaseAddress;
  PVOID Reserved2[2];
  ULONG_PTR UniqueProcessId;
  PVOID Reserved3;
} PROCESS_BASIC_INFORMATION;

这是MSDN里给出的结构体定义。到目前为止,我们还是不知道Parent进程的ID从哪里取。正所谓,天下没有不透风的墙,经过无数高手的破解,实际上最后一个字段Reserved3就是Parent进程的ID,只要我们将它转换为一个DWORD值即可。

经过在x86和x64的windows2003和windows20008平台上的测试,的确是Parent进程的ID。

既然知道了Parent进程的ID出处,接下来就好办了, 基本步骤如下:

1. 先获取自己的进程ID,GetCurrentProcessID()

2. 获取进程查询句柄,调用OpenProcess()带上PROCESS_QUERY_INFORMATION标志

3. 调用NtQueryInformationProcess()来查询进程信息

4. 获取父进程句柄,还是调用OpenProcess()

5. 启动一个线程去等待父进程退出,WaitForSingleObject(ParentHandle, INFINITE)

大功告成,这样无论是父进程正常退出,还是异常终止,子进程都能被退出。

相关文章

  • C语言排序算法之选择排序(直接选择排序,堆排序)

    C语言排序算法之选择排序(直接选择排序,堆排序)

    这篇文章主要介绍了C语言排序算法之选择排序(直接选择排序,堆排序),堆排序使用堆来选数,效率高很多,更多相关内容需要的小伙伴可以参考一下
    2022-07-07
  • C++ 实现线程安全的频率限制器(推荐)

    C++ 实现线程安全的频率限制器(推荐)

    这篇文章主要介绍了在 C++ 中实现一个线程安全的频率限制器,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • C++实现简单单向链表

    C++实现简单单向链表

    这篇文章主要为大家详细介绍了C++实现简单单向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C++实现LeetCode(59.螺旋矩阵之二)

    C++实现LeetCode(59.螺旋矩阵之二)

    这篇文章主要介绍了C++实现LeetCode(59.螺旋矩阵之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言链表案例学习之通讯录的实现

    C语言链表案例学习之通讯录的实现

    为了将所学到的链表的知识进行巩固学习,做到学以致用,本文将利用链表制作一个简单的通讯录。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-10-10
  • 探究一下C语言生成随机数的奥秘

    探究一下C语言生成随机数的奥秘

    C语言中生成随机数是一项非常重要的功能,因为许多现代应用程序需要使用随机数。本文就来带大家一起探究一下C语言生成随机数的奥秘吧
    2023-03-03
  • C语言数据结构系列队列篇

    C语言数据结构系列队列篇

    本章我们将学习 "队列" ,首先介绍队列的概念和结构,然后我们将着重讲解栈的实现。我们从零开始写队列的接口,并从零开始步步解读。本章将继续巩固画思路草图的能力,只要思路草图画好了,就可以很轻松地将其转换成代码
    2022-02-02
  • C++ tuple元组的基本用法(总结)

    C++ tuple元组的基本用法(总结)

    这篇文章主要介绍了C++ tuple元组的基本用法(总结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C语言目标文件的详细讲解

    C语言目标文件的详细讲解

    最近正在阅读关于C语言的库,但是我还没有find关于目标文件的解释,这篇文章主要给大家介绍了C语言目标文件的详细讲解,文中介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • C++设计模式之组合模式

    C++设计模式之组合模式

    这篇文章主要介绍了C++设计模式之组合模式,本文讲解什么是组合模式、组合模式的优点、组合模式实例等内容,需要的朋友可以参考下
    2014-09-09

最新评论