Job.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace WinSCP
  4. {
  5. internal class Job : IDisposable
  6. {
  7. public Job()
  8. {
  9. _handle = UnsafeNativeMethods.CreateJobObject(IntPtr.Zero, null);
  10. JobObjectBasicLimitInformation info = new JobObjectBasicLimitInformation();
  11. info.LimitFlags = 0x2000;
  12. JobObjectExtendedLimitInformation extendedInfo = new JobObjectExtendedLimitInformation();
  13. extendedInfo.BasicLimitInformation = info;
  14. int length = Marshal.SizeOf(typeof(JobObjectExtendedLimitInformation));
  15. IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
  16. Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
  17. UnsafeNativeMethods.SetInformationJobObject(_handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length);
  18. }
  19. ~Job()
  20. {
  21. DoDispose();
  22. }
  23. public void Dispose()
  24. {
  25. DoDispose();
  26. GC.SuppressFinalize(this);
  27. }
  28. private void DoDispose()
  29. {
  30. Close();
  31. }
  32. public void Close()
  33. {
  34. UnsafeNativeMethods.CloseHandle(_handle);
  35. _handle = IntPtr.Zero;
  36. }
  37. public bool AddProcess(IntPtr handle)
  38. {
  39. return UnsafeNativeMethods.AssignProcessToJobObject(_handle, handle);
  40. }
  41. private IntPtr _handle;
  42. }
  43. }