Job.cs 2.1 KB

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