<.> Obtenez le processus parent dans le .NET, pas de p / invoque
Obtenir le processus parent dans .NET est une tâche courante qui peut être implémentée à l'aide d'appels de plate-forme (P / Invoke). Cependant, cet article présente une alternative qui n'a pas besoin d'utiliser P / Invoke.
Cette solution utilise la fonction NTQueryInformationProcess dans la bibliothèque NTDLL.DLL, mais elle n'interagit pas directement via P / Invoke, mais utilise la classe ParentalProcessutilities pour abstraction du processus.
Les classes ParentalProcessUtilities contiennent des méthodes statiques, telles que GetParentProcess, qui accepte une instance de la classe de procession qui indique les processus du processus parent.
<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>
NtQueryInformationProcess Fonction Pour récupérer les informations de base du processus spécifié, y compris l'ID du processus d'hérédité. En interrogeant ces informations et en les convertissant en instance de processus, cette solution permet de récupérer facilement le processus parent dans le code d'hébergement sans utiliser P / Invoke.
<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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!