public static extern bool Process32Next(IntPtr hSnapshot, ref NativeStructs.PROCESSENTRY32 lppe);
bool IsDescendantOfHost(int rpProcessID) { var rHostProcessID = Process.GetCurrentProcess().Id; var rSnapshot = NativeMethods.Kernel32.CreateToolhelp32Snapshot(NativeEnums.TH32CS.TH32CS_SNAPPROCESS, 0); var rEntry = new NativeStructs.PROCESSENTRY32() { dwSize = Marshal.SizeOf(typeof(NativeStructs.PROCESSENTRY32)) }; var rMap = new Dictionary<int, int>(32); if (NativeMethods.Kernel32.Process32First(rSnapshot, ref rEntry)) do { rMap.Add(rEntry.th32ProcessID, rEntry.th32ParentProcessID); } while (NativeMethods.Kernel32.Process32Next(rSnapshot, ref rEntry)); NativeMethods.Kernel32.CloseHandle(rSnapshot); do { var rProcessID = rpProcessID; if (rProcessID == 0 || !rMap.TryGetValue(rProcessID, out rpProcessID)) return false; rMap.Remove(rProcessID); } while (rpProcessID != rHostProcessID); return true; }