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