Maison > développement back-end > C++ > Comment obtenir le processus parent dans .NET sans utiliser P / Invoke?

Comment obtenir le processus parent dans .NET sans utiliser P / Invoke?

Linda Hamilton
Libérer: 2025-01-28 05:12:10
original
383 Les gens l'ont consulté

How to Get the Parent Process in .NET Without Using P/Invoke?

<.> 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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal