• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > WIN32程序获取父进程ID的方法

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了win32主进程,win32应用程序下载,不是win32有效程序,exe不是win32有效程序,不是win32应用程序等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

学过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
);

</div>

这个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;

</div>

这是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)

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-28C++函数pyrUp和pyrDown来实现图像金字塔功能
  • 2017-05-28链接库动态链接库详细介绍
  • 2017-05-28随机加密程序的实现方法
  • 2017-05-28c语言中if 语句的作用范围示例代码
  • 2017-05-28C语言实现矩阵翻转(上下翻转、左右翻转)
  • 2017-05-28使用kendynet构建异步redis访问服务
  • 2017-05-28C++中this指针的用法及介绍
  • 2017-05-28深入解析C语言中的内存分配相关问题
  • 2017-05-28算法详解之分支限界法的具体实现
  • 2017-05-28简单举例说明C++中break和continue语句的用法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 简单总结C语言中的运算符优先级
    • 用C++实现strcpy(),返回一个char*类型的深入分析
    • vector,map,list,queue的区别详细解析
    • C语言数组入门之数组的声明与二维数组的模拟
    • 基于C程序启动代码的深入分析
    • C语言中 int main(int argc,char *argv[])的两个参数详解
    • 基于C语言实现的aes256加密算法示例
    • C++实现二叉树遍历序列的求解方法
    • c++ 虚函数与纯虚函数的区别(深入分析)
    • C语言中的链接编写教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有