Je ne vois pas pourquoi vous ne voulez pas p/invoquer. Si vous regardez System.Diagnostics dans Reflector, vous verrez qu'il utilise p/invoke en interne. Quoi qu'il en soit, la classe Process et non permet de récupérer un PID parent d'un processus. Au lieu de cela:
La définition struct:
[StructLayout(LayoutKind.Sequential)]
struct PROCESS_BASIC_INFORMATION
{
public int ExitStatus;
public int PebBaseAddress;
public int AffinityMask;
public int BasePriority;
public int UniqueProcessId;
public int InheritedFromUniqueProcessId;
}
La fonction d'importation (simplifiée):
[DllImport("ntdll.dll")]
static extern int NtQueryInformationProcess(
IntPtr ProcessHandle,
int ProcessInformationClass,
out PROCESS_BASIC_INFORMATION ProcessInformation,
int ProcessInformationLength,
out int ReturnLength
);
Le code:
Process p = Process.GetProcessById(1234);
PROCESS_BASIC_INFORMATION pbi;
int size;
NtQueryInformationProcess(p.Handle, 0, out pbi, Marshal.SizeOf(typeof(PROCESS_BASIC_INFORMATION)), out size);
// pbi.InheritedFromUniqueProcessId now contains the process' parent PID
Vous devez insérer ces usings à en haut de votre fichier:
using System.Runtime.InteropServices;
using System.Diagnostics;
Si vous voulez énumérer des processus, il serait préférable d'utiliser NtQuerySystemInformation - bien que ce code soit un peu long à publier ici.