WIN32程序獲取父進(jìn)程ID的方法
學(xué)過(guò)windows程序設(shè)計(jì)的人都知道,windows中的進(jìn)程是可以有父子關(guān)系的,擁有父子關(guān)系的進(jìn)程,一旦父進(jìn)程結(jié)束,子進(jìn)程有會(huì)隨之退出。但是如果進(jìn)程之間沒(méi)有父子關(guān)系,我們?nèi)绾巫屪舆M(jìn)程在父進(jìn)程退出是也同時(shí)跟著退出呢?方法有很多,本文介紹其中的一種利用父進(jìn)程ID的方案,實(shí)現(xiàn)的原理很簡(jiǎn)單:先獲取父進(jìn)程的ID,然后通過(guò)ID來(lái)獲取父進(jìn)程Handle,通過(guò)監(jiān)視父進(jìn)程的Handle來(lái)決定子進(jìn)程是否退出。所以,這里的關(guān)鍵就是如何獲取父進(jìn)程的ID。
為了獲取父進(jìn)程ID,這里需要用到一個(gè)微軟未公開(kāi)的API:
NTSTATUS WINAPI NtQueryInformationProcess( __in HANDLE ProcessHandle, __in PROCESSINFOCLASS ProcessInformationClass, __out PVOID ProcessInformation, __in ULONG ProcessInformationLength, __out_opt PULONG ReturnLength );
這個(gè)API位于Ntdll.dll里面,通過(guò)引用頭文件winternl.h來(lái)獲取相關(guān)的類(lèi)型定義。當(dāng)我們得到這個(gè)函數(shù)后,下一步就需要去了解各個(gè)函數(shù)參數(shù)的意義了,這里我們重點(diǎn)看一下第二個(gè)參數(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從哪里取。正所謂,天下沒(méi)有不透風(fēng)的墻,經(jīng)過(guò)無(wú)數(shù)高手的破解,實(shí)際上最后一個(gè)字段Reserved3就是Parent進(jìn)程的ID,只要我們將它轉(zhuǎn)換為一個(gè)DWORD值即可。
經(jīng)過(guò)在x86和x64的windows2003和windows20008平臺(tái)上的測(cè)試,的確是Parent進(jìn)程的ID。
既然知道了Parent進(jìn)程的ID出處,接下來(lái)就好辦了, 基本步驟如下:
1. 先獲取自己的進(jìn)程ID,GetCurrentProcessID()
2. 獲取進(jìn)程查詢句柄,調(diào)用OpenProcess()帶上PROCESS_QUERY_INFORMATION標(biāo)志
3. 調(diào)用NtQueryInformationProcess()來(lái)查詢進(jìn)程信息
4. 獲取父進(jìn)程句柄,還是調(diào)用OpenProcess()
5. 啟動(dòng)一個(gè)線程去等待父進(jìn)程退出,WaitForSingleObject(ParentHandle, INFINITE)
大功告成,這樣無(wú)論是父進(jìn)程正常退出,還是異常終止,子進(jìn)程都能被退出。
- java.lang.UnsatisfiedLinkError: %1 不是有效的Win32應(yīng)用程序錯(cuò)誤解決
- C語(yǔ)言+win32api寫(xiě)窗體應(yīng)用程序
- VC程序在Win32環(huán)境下動(dòng)態(tài)鏈接庫(kù)(DLL)編程原理
- 實(shí)例分析一個(gè)簡(jiǎn)單的Win32程序
- 木馬程序Trojan-Spy.Win32.Agent.cfu清除方法
- 終于明白了tc編譯的dos程序和vc編譯的win32控制臺(tái)程序的區(qū)別
- tc編譯的dos程序和vc編譯的win32控制臺(tái)程序的異同
- Win32 程序在啟動(dòng)時(shí)如何激活前一個(gè)啟動(dòng)程序的窗口
相關(guān)文章
C語(yǔ)言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇C語(yǔ)言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
關(guān)于C語(yǔ)言中弱符號(hào)與弱引用的實(shí)際應(yīng)用問(wèn)題
在編碼過(guò)程中,我們經(jīng)常遇到符號(hào)重定義的錯(cuò)誤問(wèn)題,本文通過(guò)實(shí)例代碼展示給大家介紹了C語(yǔ)言弱符號(hào)與弱引用的實(shí)際應(yīng)用問(wèn)題,一起看看吧2021-09-09
算法之排序算法的算法思想和使用場(chǎng)景總結(jié)
這篇文章主要介紹了算法之排序算法的算法思想和使用場(chǎng)景總結(jié),本文講解了插入排序、交換排序、選擇排序等幾大類(lèi)排序算法的特點(diǎn)、思想和使用場(chǎng)景,需要的朋友可以參考下2014-08-08
vscode遠(yuǎn)程連接服務(wù)器(免密登錄+遠(yuǎn)程開(kāi)發(fā))
vscode的遠(yuǎn)程連接功能十分方便,本文就來(lái)介紹一下vscode遠(yuǎn)程連接服務(wù)器,主要包括免密登錄和遠(yuǎn)程開(kāi)發(fā),感興趣的可以了解一下2024-07-07
C語(yǔ)言詳解如何實(shí)現(xiàn)堆及堆的結(jié)構(gòu)與接口
堆是計(jì)算機(jī)科學(xué)中一類(lèi)特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱(chēng),通常是一個(gè)可以被看做一棵完全二叉樹(shù)的數(shù)組對(duì)象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。本文將詳細(xì)介紹堆的結(jié)構(gòu)與接口,需要的可以參考一下2022-04-04
Opencv 視頻轉(zhuǎn)為圖像序列的實(shí)現(xiàn)
今天小編就為大家分享一篇Opencv 視頻轉(zhuǎn)為圖像序列的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池的示例代碼
所謂內(nèi)存池,顧名思義和線程池的設(shè)計(jì)原理是一樣的,為了減少頻繁申請(qǐng)釋放內(nèi)存而帶來(lái)的資源消耗,減少釋放內(nèi)存后產(chǎn)生的內(nèi)存碎片,下面我們就來(lái)看看如何使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池吧2024-02-02
詳解C++循環(huán)創(chuàng)建多級(jí)目錄及判斷目錄是否存在的方法
這篇文章主要介紹了C++循環(huán)創(chuàng)建多級(jí)目錄及判斷目錄是否存在的方法,文中代碼有一個(gè)針對(duì)各種系統(tǒng)進(jìn)行判斷來(lái)加載不同頭文件的方法,需要的朋友可以參考下2016-03-03

