aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.ServerApplication/Native/WindowsProcessManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.ServerApplication/Native/WindowsProcessManager.cs')
-rw-r--r--MediaBrowser.ServerApplication/Native/WindowsProcessManager.cs78
1 files changed, 78 insertions, 0 deletions
diff --git a/MediaBrowser.ServerApplication/Native/WindowsProcessManager.cs b/MediaBrowser.ServerApplication/Native/WindowsProcessManager.cs
new file mode 100644
index 000000000..f3497aef5
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Native/WindowsProcessManager.cs
@@ -0,0 +1,78 @@
+using MediaBrowser.Controller.Diagnostics;
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+namespace MediaBrowser.ServerApplication.Native
+{
+ public class WindowsProcessManager : IProcessManager
+ {
+ public void SuspendProcess(Process process)
+ {
+ process.Suspend();
+ }
+
+ public void ResumeProcess(Process process)
+ {
+ process.Resume();
+ }
+
+ public bool SupportsSuspension
+ {
+ get { return true; }
+ }
+ }
+
+ public static class ProcessExtension
+ {
+ [DllImport("kernel32.dll")]
+ static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
+ [DllImport("kernel32.dll")]
+ static extern uint SuspendThread(IntPtr hThread);
+ [DllImport("kernel32.dll")]
+ static extern int ResumeThread(IntPtr hThread);
+
+ 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)
+ {
+ break;
+ }
+ SuspendThread(pOpenThread);
+ }
+ }
+ 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)
+ {
+ break;
+ }
+ ResumeThread(pOpenThread);
+ }
+ }
+ public static void Print(this Process process)
+ {
+ Console.WriteLine("{0,8} {1}", process.Id, process.ProcessName);
+ }
+ }
+
+ [Flags]
+ public enum ThreadAccess : int
+ {
+ TERMINATE = (0x0001),
+ SUSPEND_RESUME = (0x0002),
+ GET_CONTEXT = (0x0008),
+ SET_CONTEXT = (0x0010),
+ SET_INFORMATION = (0x0020),
+ QUERY_INFORMATION = (0x0040),
+ SET_THREAD_TOKEN = (0x0080),
+ IMPERSONATE = (0x0100),
+ DIRECT_IMPERSONATION = (0x0200)
+ }
+}