WindowsProcessManager.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using MediaBrowser.Controller.Diagnostics;
  2. using System;
  3. using System.Diagnostics;
  4. using System.Runtime.InteropServices;
  5. namespace MediaBrowser.ServerApplication.Native
  6. {
  7. public class WindowsProcessManager : IProcessManager
  8. {
  9. public void SuspendProcess(Process process)
  10. {
  11. process.Suspend();
  12. }
  13. public void ResumeProcess(Process process)
  14. {
  15. process.Resume();
  16. }
  17. public bool SupportsSuspension
  18. {
  19. get { return true; }
  20. }
  21. }
  22. public static class ProcessExtension
  23. {
  24. [DllImport("kernel32.dll")]
  25. static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
  26. [DllImport("kernel32.dll")]
  27. static extern uint SuspendThread(IntPtr hThread);
  28. [DllImport("kernel32.dll")]
  29. static extern int ResumeThread(IntPtr hThread);
  30. [DllImport("kernel32.dll")]
  31. [return: MarshalAs(UnmanagedType.Bool)]
  32. public static extern bool CloseHandle(IntPtr hThread);
  33. public static void Suspend(this Process process)
  34. {
  35. foreach (ProcessThread thread in process.Threads)
  36. {
  37. var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id);
  38. if (pOpenThread == IntPtr.Zero)
  39. {
  40. break;
  41. }
  42. SuspendThread(pOpenThread);
  43. CloseHandle(pOpenThread);
  44. }
  45. }
  46. public static void Resume(this Process process)
  47. {
  48. foreach (ProcessThread thread in process.Threads)
  49. {
  50. var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id);
  51. if (pOpenThread == IntPtr.Zero)
  52. {
  53. break;
  54. }
  55. ResumeThread(pOpenThread);
  56. CloseHandle(pOpenThread);
  57. }
  58. }
  59. public static void Print(this Process process)
  60. {
  61. Console.WriteLine("{0,8} {1}", process.Id, process.ProcessName);
  62. }
  63. }
  64. [Flags]
  65. public enum ThreadAccess : int
  66. {
  67. TERMINATE = (0x0001),
  68. SUSPEND_RESUME = (0x0002),
  69. GET_CONTEXT = (0x0008),
  70. SET_CONTEXT = (0x0010),
  71. SET_INFORMATION = (0x0020),
  72. QUERY_INFORMATION = (0x0040),
  73. SET_THREAD_TOKEN = (0x0080),
  74. IMPERSONATE = (0x0100),
  75. DIRECT_IMPERSONATION = (0x0200)
  76. }
  77. }