using System; using System.Diagnostics; using System.Runtime.InteropServices; namespace TGServerService { /// /// Helpers to ing and a . Lightly massaged code from https://stackoverflow.com/a/13109774. Documentation linked from MSDN on 20/10/2017 /// static class ProcessExtension { /// /// https://msdn.microsoft.com/en-us/library/windows/desktop/ms686769(v=vs.85).aspx /// enum ThreadAccess : int { SUSPEND_RESUME = (0x0002), } /// /// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684335(v=vs.85).aspx /// [DllImport("kernel32.dll")] static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId); /// /// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx /// [DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr hObject); /// /// https://msdn.microsoft.com/en-us/library/windows/desktop/ms686345(v=vs.85).aspx /// [DllImport("kernel32.dll")] static extern uint SuspendThread(IntPtr hThread); /// /// https://msdn.microsoft.com/en-us/library/windows/desktop/ms685086(v=vs.85).aspx /// [DllImport("kernel32.dll")] static extern int ResumeThread(IntPtr hThread); /// /// Suspends all threads for a running /// /// The to suspend public static void Suspend(this Process process) { foreach (ProcessThread thread in process.Threads) { var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id); if (pOpenThread == IntPtr.Zero) continue; SuspendThread(pOpenThread); CloseHandle(pOpenThread); } } /// /// Resumes all threads for a running /// /// The to suspend public static void Resume(this Process process) { foreach (ProcessThread thread in process.Threads) { var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id); if (pOpenThread == IntPtr.Zero) continue; ResumeThread(pOpenThread); CloseHandle(pOpenThread); } } } }