在.NET中獲取父進程,無需P/Invoke
在.NET中獲取父進程是一個常見任務,可以使用平台調用(P/Invoke)方法實現。但是,本文介紹了一種替代方案,無需使用P/Invoke。
此方案利用ntdll.dll庫中的NtQueryInformationProcess函數,但它不直接通過P/Invoke與之交互,而是利用ParentProcessUtilities類來抽象該進程。
<code class="language-csharp">[StructLayout(LayoutKind.Sequential)] public struct ParentProcessUtilities { // 这些成员必须与PROCESS_BASIC_INFORMATION匹配 internal IntPtr Reserved1; internal IntPtr PebBaseAddress; internal IntPtr Reserved2_0; internal IntPtr Reserved2_1; internal IntPtr UniqueProcessId; internal IntPtr InheritedFromUniqueProcessId; }</code>
ParentProcessUtilities類包含靜態方法,例如GetParentProcess,它接受一個進程句柄並返回表示父進程的Process類的實例。
<code class="language-csharp">public static Process GetParentProcess(IntPtr handle) { ParentProcessUtilities pbi = new ParentProcessUtilities(); int returnLength; int status = NtQueryInformationProcess(handle, 0, ref pbi, Marshal.SizeOf(pbi), out returnLength); if (status != 0) throw new Win32Exception(status); try { return Process.GetProcessById(pbi.InheritedFromUniqueProcessId.ToInt32()); } catch (ArgumentException) { // 未找到 return null; } }</code>
NtQueryInformationProcess函數檢索指定進程的基本信息,包括繼承的進程ID。通過查詢此信息並將其轉換為Process實例,此方案允許在託管代碼中輕鬆檢索父進程,而無需使用P/Invoke。
以上是如何在不使用P/Invoke的情況下將父進程獲取.NET?的詳細內容。更多資訊請關注PHP中文網其他相關文章!