public static IEnumerable<Process> GetSelfAndAncestors(Process self)
{
var processIds = new HashSet<int>();
var process = self;
while (process != null)
{
yield return process;
if (processIds.Contains(process.Id))
{
// loop detected (parent id have been re-allocated to a child process!)
yield break;
}
processIds.Add(process.Id);
process = process.ParentProcess();
}
}