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

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

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

(0)

相关推荐

  • 实例分析一个简单的Win32程序

    本文较为详细的分析了一个Win32程序的组成.结构.实现方法及运行原理,对于进行Windows程序设计有很好的借鉴参考价值.分享给大家供大家参考之用.具体分析如下: 一.Windows程序与普通C或C++程序的不同 学过C或C++等语言的人都知道,我们写的程序都一个入口,main函数,但是在Win32程序里,我们的入口函数又是什么呢?它是怎么样运行的,跟我们用C或C++写的控制台程序又有什么不同呢? 我们先说Win32程序跟我们控制台的程序的一个很重要的不同点,就是Win32程序是一个消息响应程

  • win32 api实现2048游戏示例

    自学的win32编程,写了一个win32 API版2048,自己摸索着写的,按上下左右箭头开始游戏 复制代码 代码如下: #include <windows.h>#include <stdlib.h>#include <stdio.h>#include <ctime>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//全局操作数组int arr[4][4] = { { 0, 0, 0, 0 }, {

  • 终于明白了tc编译的dos程序和vc编译的win32控制台程序的区别

    它们有着本质的区别:1:一个是16的DOS程序,一个是标准的32的Windows应用程序.前者依然受着64KB内存分段约束,后者无忧无虑地使用着4GB内存地址空间.它们本来就是运行在不同的操作系统上的.别把他们混淆.DOS程序可以运行在windows上是因为有NTVDM.而你把VC生成的控制台程序放到DOS下只会得到!?This program cannot be run in DOS mode.2:如果你是用标准库编写的话,代码应该没多大差异的.但执行时调用库方式却差天共地.前者通过API模拟

  • 一个win32窗口创建示例

    复制代码 代码如下: /*一个简单的win32窗口调用*/#include<Windows.h>#include<tchar.h> //声明窗口函数LRESULT CALLBACK WindowProc(HWND hwnd,       UINT uMsg,       WPARAM wParam,       LPARAM lparam       );int WINAPI WinMain(     HINSTANCE hInstance,     HINSTANCE hPrev

  • tc编译的dos程序和vc编译的win32控制台程序的异同

    它们有着本质的区别:1:一个是16的DOS程序,一个是标准的32的Windows应用程序.前者依然受着64KB内存分段约束,后者无忧无虑地使用着4GB内存地址空间.它们本来就是运行在不同的操作系统上的.别把他们混淆.DOS程序可以运行在windows上是因为有NTVDM.而你把VC生成的控制台程序放到DOS下只会得到!?This program cannot be run in DOS mode.2:如果你是用标准库编写的话,代码应该没多大差异的.但执行时调用库方式却差天共地.前者通过API模拟

  • win32使用openfilename浏览文件窗口示例

    代码如下: 复制代码 代码如下: OPENFILENAME ofn;WCHAR* szFile = new WCHAR[512];WCHAR* szFileTitle = new WCHAR[512];memset(&ofn, 0, sizeof(ofn));memset(szFile, 0, sizeof(WCHAR)*512);memset(szFileTitle, 0, sizeof(WCHAR)*512); ofn.lStructSize = sizeof(ofn);ofn.hwndOw

  • Win32应用程序(SDK)设计原理详解

    一般来说所谓的Win32应用程序开发,就是在C语言的层面上,直接使用Win32 API(Application Programming Interface:系统开放出来,给程序员使用的接口.)来开发Windows应用程序或者系统程序.虽然现在直接用Win32 API开发应用程序的人已经不多了,但是深入理解Windows系统程序设计原理,仍然是成为Windows开发高手的必经之路. 所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是相对应的.下面是进行直接的WIN32

  • win32 api实现简单的消息窗口示例

    复制代码 代码如下: #include<windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow){static TCHAR szAppName[]=TEXT("HelloWin");HWND hwnd;MSG msg;WNDCL

  • Win32 下病毒设计入门详细说明

    本文假定你对dos下的病毒和386PM有一定的了解. 1.感染任何一个病毒都需要有寄主,把病毒代码加入寄主程序中(伴侣病毒除外) 以下说明如何将病毒代码嵌入PE文件中,有关PE文件的结构请看以前的文章. PE文件的典型结构:MZ Header DOS STUB CODE PE HEADER OPTIONAL HEADER SECTION TABLE SECTION 1 SECTION 2 ... IMPORT TABLE EXPORT TABLE 和DOS的可执行文件类似,PE的代码映象分为几个

  • win32下进程间通信(共享内存)实例分析

    一.概述 很多情况下在Windows程序中,各个进程之间往往需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换. 进程间通讯(即:同机通讯)和数据交换有多种方式:消息.共享内存.匿名(命名)管道.邮槽.Windows套接字等多种技术."共享内存"(shared memory)可以定义为对一个以上的进程是可见的内存或存在于多个进程的虚拟地址空间.例如:如果两个进程使用相同的DLL,只把DLL的代码

随机推荐