/// <summary> /// Gets the parent process of specified process. /// </summary> /// <param name="id">The process id.</param> /// <returns>An instance of the Process class.</returns> public static Process GetParentProcess(this Process process) { if (process is null) { throw new ArgumentNullException(nameof(process)); } return(ProcessBasicInformation.GetParentProcess(process.Handle)); }
/// <summary> /// Gets the parent process of a specified process. /// </summary> /// <param name="handle">The process handle.</param> /// <returns>An instance of the Process class.</returns> internal static Process GetParentProcess(IntPtr handle) { var pbi = new ProcessBasicInformation(); var status = NtQueryInformationProcess(handle, 0, ref pbi, Marshal.SizeOf(pbi), out _); if (status != 0) { throw new Win32Exception(status); } try { return(Process.GetProcessById(pbi.InheritedFromUniqueProcessId.ToInt32())); } catch (ArgumentException) { return(null); } }
static extern int NtQueryInformationProcess(IntPtr processHandle, int processInformationClass, ref ProcessBasicInformation processInformation, int processInformationLength, out int returnLength);