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;
|
|
}
|
|
}
|
|
}
|