1
0

Job.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. info.LimitFlags = 0x2000; // JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
  20. JobObjectExtendedLimitInformation extendedInfo = new JobObjectExtendedLimitInformation();
  21. extendedInfo.BasicLimitInformation = info;
  22. int length = Marshal.SizeOf(typeof(JobObjectExtendedLimitInformation));
  23. IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
  24. Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
  25. if (UnsafeNativeMethods.SetInformationJobObject(_handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length))
  26. {
  27. _logger.WriteLine("Job set to kill all processes");
  28. }
  29. else
  30. {
  31. _logger.WriteLine("Cannot set job to kill all processes ({0})", Logger.LastWin32ErrorMessage());
  32. }
  33. }
  34. }
  35. ~Job()
  36. {
  37. DoDispose();
  38. }
  39. public void Dispose()
  40. {
  41. DoDispose();
  42. GC.SuppressFinalize(this);
  43. }
  44. private void DoDispose()
  45. {
  46. Close();
  47. }
  48. public void Close()
  49. {
  50. _logger.WriteLine("Closing job");
  51. UnsafeNativeMethods.CloseHandle(_handle);
  52. _handle = IntPtr.Zero;
  53. }
  54. private IntPtr _handle;
  55. private Logger _logger;
  56. }
  57. }