当前位置:  编程技术>c/c++/嵌入式

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

    来源: 互联网  发布时间:2014-10-26

    本文导语:  学过windows程序设计的人都知道,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)

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


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • win2000+jbuilder6+oracle817编出的程序,在win2000下执行很好,在win98下却访问不了oracle数据库
  • 图形方式使用鼠标的dos程序,在Win98下可以正常显示鼠标光标,而Win2000下不行,有办法吗
  • mingw dev stdio(for win) or vc6 在win 下做gtk程序,怎么配置?
  • 请问,我要装LINUX,但我没有在LINUX下所有机器的驱动程序怎么办?全都是WIN9X和WIN2000的.
  • 请问用jb7编写的程序是否可以超平台,即在win下写的程序是否可以在linux下运行?
  • 如何在Jbuilder中生成win32可执行程序.
  • tc编译的dos程序和vc编译的win32控制台程序的异同
  • gtk for win 和 gtk for linux 下的程序问题?
  • 为什么我的applet程序修改了不起作用(win2k),浏览器总是显示前一次装入的程序?
  • 在win2000下开发的程序在linux下面运行的中文问题
  • 用Jbuilder 做的JAVA程序能编译成Exe 文件在Win98 下运行吗?
  • 有没有win下面的shell仿真程序
  • 如何快速将一win32多线程(c++)程序移植到sco/aix下?
  • [难]求SMC 9432系列网卡在Win2000下的驱动程序
  • 在linux上运行win的程序?可以这样吗?
  • 高手指教:怎样在LINUX下运行WIN98程序?
  • 如何在Win32平台下编写Linux上的程序
  • 在WIN2000SERVER怎样运行基于J2EE的JAVA程序?急急…………………!!!!!!!!!!!!!!!!!
  • redhat7.3下原来没安装TELNET组件,怎么安装?类似WIN里的添加删除程序
  • 怎么在rh9下用程序访问win下的sqlserver?
  • win7, win8安装docker需要了解的概念
  • 我系统安装了win2000,win98,linux,现在登录时只能进入win98和linux,无法进入win2000
  • win7,win8安装Docker具体过程
  • 有那位在win2000和win98上都装过tomcat,为什么我在win2000可以很容易装上,在win98就装不上,有什么区别?
  • win7,win8安装docker的依赖条件
  • 我在双系统win98@win2000下重装win98应该备份哪几个文件?
  • win7/Windows7系统下载地址搜集整理
  • 先装win me 再装redhat 9.0 再在win me 下装win xp ,linux 不见了.怎么恢复linux啊?
  • 怎样重装win7系统?win7重装系统步骤详细图文介绍
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • Win7 64位下mysql 下载、安装与配置图文教程


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3