雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

WIN32程序獲取父進(jìn)程ID的方法

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點(diǎn)擊:

學(xué)過windows程序設(shè)計(jì)的人都知道,windows中的進(jìn)程是可以有父子關(guān)系的,擁有父子關(guān)系的進(jìn)程,一旦父進(jìn)程結(jié)束,子進(jìn)程有會隨之退出。但是如果進(jìn)程之間沒有父子關(guān)系,我們?nèi)绾巫屪舆M(jìn)程在父進(jìn)程退出是也同時跟著退出呢?方法有很多,本文介紹其中的一種利用父進(jìn)程ID的方案,實(shí)現(xiàn)的原理很簡單:先獲取父進(jìn)程的ID,然后通過ID來獲取父進(jìn)程Handle,通過監(jiān)視父進(jìn)程的Handle來決定子進(jìn)程是否退出。所以,這里的關(guān)鍵就是如何獲取父進(jìn)程的ID。

為了獲取父進(jìn)程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來獲取相關(guān)的類型定義。當(dāng)我們得到這個函數(shù)后,下一步就需要去了解各個函數(shù)參數(shù)的意義了,這里我們重點(diǎn)看一下第二個參數(shù) PROCESSINFOCLASS結(jié)構(gòu)體的內(nèi)容:

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

這是MSDN里給出的結(jié)構(gòu)體定義。到目前為止,我們還是不知道Parent進(jìn)程的ID從哪里取。正所謂,天下沒有不透風(fēng)的墻,經(jīng)過無數(shù)高手的破解,實(shí)際上最后一個字段Reserved3就是Parent進(jìn)程的ID,只要我們將它轉(zhuǎn)換為一個DWORD值即可。

經(jīng)過在x86和x64的windows2003和windows20008平臺上的測試,的確是Parent進(jìn)程的ID。

既然知道了Parent進(jìn)程的ID出處,接下來就好辦了, 基本步驟如下:

1. 先獲取自己的進(jìn)程ID,GetCurrentProcessID()

2. 獲取進(jìn)程查詢句柄,調(diào)用OpenProcess()帶上PROCESS_QUERY_INFORMATION標(biāo)志

3. 調(diào)用NtQueryInformationProcess()來查詢進(jìn)程信息

4. 獲取父進(jìn)程句柄,還是調(diào)用OpenProcess()

5. 啟動一個線程去等待父進(jìn)程退出,WaitForSingleObject(ParentHandle, INFINITE)

大功告成,這樣無論是父進(jìn)程正常退出,還是異常終止,子進(jìn)程都能被退出。

上一篇:VC++操作SQLite簡單實(shí)例

欄    目:C語言

下一篇:VC++實(shí)現(xiàn)選擇排序算法簡單示例

本文標(biāo)題:WIN32程序獲取父進(jìn)程ID的方法

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3536.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有