WIN32程序獲取父進程ID的方法
學過windows程序設計的人都知道,windows中的進程是可以有父子關系的,擁有父子關系的進程,一旦父進程結(jié)束,子進程有會隨之退出。但是如果進程之間沒有父子關系,我們?nèi)绾巫屪舆M程在父進程退出是也同時跟著退出呢?方法有很多,本文介紹其中的一種利用父進程ID的方案,實現(xiàn)的原理很簡單:先獲取父進程的ID,然后通過ID來獲取父進程Handle,通過監(jiān)視父進程的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來獲取相關的類型定義。當我們得到這個函數(shù)后,下一步就需要去了解各個函數(shù)參數(shù)的意義了,這里我們重點看一下第二個參數(shù) PROCESSINFOCLASS結(jié)構體的內(nèi)容:
typedef struct _PROCESS_BASIC_INFORMATION { PVOID Reserved1; PPEB PebBaseAddress; PVOID Reserved2[2]; ULONG_PTR UniqueProcessId; PVOID Reserved3; } PROCESS_BASIC_INFORMATION;
這是MSDN里給出的結(jié)構體定義。到目前為止,我們還是不知道Parent進程的ID從哪里取。正所謂,天下沒有不透風的墻,經(jīng)過無數(shù)高手的破解,實際上最后一個字段Reserved3就是Parent進程的ID,只要我們將它轉(zhuǎn)換為一個DWORD值即可。
經(jīng)過在x86和x64的windows2003和windows20008平臺上的測試,的確是Parent進程的ID。
既然知道了Parent進程的ID出處,接下來就好辦了, 基本步驟如下:
1. 先獲取自己的進程ID,GetCurrentProcessID()
2. 獲取進程查詢句柄,調(diào)用OpenProcess()帶上PROCESS_QUERY_INFORMATION標志
3. 調(diào)用NtQueryInformationProcess()來查詢進程信息
4. 獲取父進程句柄,還是調(diào)用OpenProcess()
5. 啟動一個線程去等待父進程退出,WaitForSingleObject(ParentHandle, INFINITE)
大功告成,這樣無論是父進程正常退出,還是異常終止,子進程都能被退出。
上一篇:VC++操作SQLite簡單實例
欄 目:C語言
本文標題:WIN32程序獲取父進程ID的方法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3536.html
您可能感興趣的文章
- 01-10使用OpenGL實現(xiàn)3D立體顯示的程序代碼
- 01-10基于C程序啟動代碼的深入分析
- 01-10Linux C 獲取進程退出值的實現(xiàn)代碼
- 01-10解析Linux下的時間函數(shù):設置以及獲取時間的方法
- 01-10DHCP:解析開發(fā)板上動態(tài)獲取ip的2種實現(xiàn)方法詳解
- 01-10基于linux下獲取時間函數(shù)的詳解
- 01-10linux c 獲取本機公網(wǎng)IP的實現(xiàn)方法
- 01-10用c 獲取文件MD5值的實現(xiàn)方法
- 01-10探討:程序在內(nèi)存中的分配(常量,局部變量,全局變量,程序代碼)問
- 01-10用C++實現(xiàn)隊列的程序代碼


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10C#中split用法實例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什