WIN32法式獲得父過程ID的辦法。本站提示廣大學習愛好者:(WIN32法式獲得父過程ID的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是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)
年夜功樂成,如許不管是父過程正常加入,照樣異常終止,子過程都能被加入。