Job.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace WinSCP
  4. {
  5. internal class Job : IDisposable
  6. {
  7. public Job(Logger logger, string name)
  8. {
  9. _logger = logger;
  10. _handle = UnsafeNativeMethods.CreateJobObject(IntPtr.Zero, name);
  11. if (_handle == IntPtr.Zero)
  12. {
  13. _logger.WriteLine("Cannot create job ({0})", Logger.LastWin32ErrorMessage());
  14. }
  15. else
  16. {
  17. _logger.WriteLine("Job created");
  18. JobObjectBasicLimitInformation info = new JobObjectBasicLimitInformation
  19. {
  20. LimitFlags = 0x2000 // JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
  21. };
  22. JobObjectExtendedLimitInformation extendedInfo = new JobObjectExtendedLimitInformation
  23. {
  24. BasicLimitInformation = info
  25. };
  26. int length = Marshal.SizeOf(typeof(JobObjectExtendedLimitInformation));
  27. IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
  28. Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
  29. if (UnsafeNativeMethods.SetInformationJobObject(_handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length))
  30. {
  31. _logger.WriteLine("Job set to kill all processes");
  32. }
  33. else
  34. {
  35. _logger.WriteLine("Cannot set job to kill all processes ({0})", Logger.LastWin32ErrorMessage());
  36. }
  37. }
  38. }
  39. ~Job()
  40. {
  41. DoDispose();
  42. }
  43. public void Dispose()
  44. {
  45. DoDispose();
  46. GC.SuppressFinalize(this);
  47. }
  48. private void DoDispose()
  49. {
  50. Close();
  51. }
  52. public void Close()
  53. {
  54. _logger.WriteLine("Closing job");
  55. UnsafeNativeMethods.CloseHandle(_handle);
  56. _handle = IntPtr.Zero;
  57. }
  58. private IntPtr _handle;
  59. private readonly Logger _logger;
  60. }
  61. }