Exemplo n.º 1
0
 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;
        }