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)

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

相关文章

  • OpenCV实现智能视频监控

    OpenCV实现智能视频监控

    这篇文章主要为大家详细介绍了OpenCV实现智能视频监控,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • C++实现LeetCode(40.组合之和之二)

    C++实现LeetCode(40.组合之和之二)

    这篇文章主要介绍了C++实现LeetCode(40.组合之和之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++使用递归方法求n阶勒让德多项式完整实例

    C++使用递归方法求n阶勒让德多项式完整实例

    这篇文章主要介绍了C++使用递归方法求n阶勒让德多项式,涉及C++递归算法与浮点数运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • 使用Clion刷LeetCode的方法

    使用Clion刷LeetCode的方法

    这篇文章主要介绍了使用Clion刷LeetCode的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 70行C语言代码实现贪吃蛇

    70行C语言代码实现贪吃蛇

    这篇文章主要为大家详细介绍了70行C语言代码实现贪吃蛇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 麻将游戏算法深入解析及实现代码

    麻将游戏算法深入解析及实现代码

    这篇文章主要介绍了麻将游戏算法深入解析及实现代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • C++命名空间域的实现示例

    C++命名空间域的实现示例

    命名空间域就是一个独立的空间外面不能直接调用该空间域只能用访问限定符指定访问该空间域,本文主要介绍了C++命名空间域的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C语言入门的一些基本资源推荐和程序语法概览

    C语言入门的一些基本资源推荐和程序语法概览

    这篇文章主要介绍了C语言入门的一些基本资源推荐和程序语法概览,C语言是很多现代高级编程语言的基础,需要的朋友可以参考下
    2015-12-12
  • 利用C语言实现HashTable

    利用C语言实现HashTable

    根据KEY从hashtable中获取接点,步骤是先根据KEY计算hash值,然后从hashtable中找到指定的接点或者接点链表
    2013-09-09
  • C++如何判断一个数是不是素数

    C++如何判断一个数是不是素数

    这篇文章主要介绍了C++如何判断一个数是不是素数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论