|
|
- using System;
- using System.Diagnostics;
- using System.Runtime.InteropServices;
-
- namespace Ameliorated.ConsoleUtils
- {
- public static class ParentProcess
- {
- private static readonly uint TH32CS_SNAPPROCESS = 2;
-
- public static string ProcessName = Get().ProcessName;
-
- public static Process Get()
- {
- try
- {
- var iParentPid = 0;
- var iCurrentPid = Process.GetCurrentProcess().Id;
-
- var oHnd = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
-
- if (oHnd == IntPtr.Zero)
- return null;
-
- var oProcInfo = new PROCESSENTRY32();
-
- oProcInfo.dwSize =
- (uint)Marshal.SizeOf(typeof(PROCESSENTRY32));
-
- if (Process32First(oHnd, ref oProcInfo) == false)
- return null;
-
- do
- {
- if (iCurrentPid == oProcInfo.th32ProcessID)
- iParentPid = (int)oProcInfo.th32ParentProcessID;
- } while (iParentPid == 0 && Process32Next(oHnd, ref oProcInfo));
-
- if (iParentPid > 0)
- return Process.GetProcessById(iParentPid);
- return null;
- } catch (Exception e)
- {
- return null;
- }
- }
-
- [DllImport("kernel32.dll", SetLastError = true)]
- private static extern IntPtr CreateToolhelp32Snapshot(uint dwFlags, uint th32ProcessID);
-
- [DllImport("kernel32.dll")]
- private static extern bool Process32First(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);
-
- [DllImport("kernel32.dll")]
- private static extern bool Process32Next(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);
-
- [StructLayout(LayoutKind.Sequential)]
- public struct PROCESSENTRY32
- {
- public uint dwSize;
- public uint cntUsage;
- public uint th32ProcessID;
- public IntPtr th32DefaultHeapID;
- public uint th32ModuleID;
- public uint cntThreads;
- public uint th32ParentProcessID;
- public int pcPriClassBase;
- public uint dwFlags;
-
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
- public string szExeFile;
- }
- }
- }
|