| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- using System;
- using System.Runtime.InteropServices;
- namespace WinSCP
- {
- internal class Job : IDisposable
- {
- public Job()
- {
- _handle = UnsafeNativeMethods.CreateJobObject(IntPtr.Zero, null);
- JobObjectBasicLimitInformation info = new JobObjectBasicLimitInformation();
- info.LimitFlags = 0x2000;
- JobObjectExtendedLimitInformation extendedInfo = new JobObjectExtendedLimitInformation();
- extendedInfo.BasicLimitInformation = info;
- int length = Marshal.SizeOf(typeof(JobObjectExtendedLimitInformation));
- IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
- Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
- UnsafeNativeMethods.SetInformationJobObject(_handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length);
- }
- ~Job()
- {
- DoDispose();
- }
- public void Dispose()
- {
- DoDispose();
- GC.SuppressFinalize(this);
- }
- private void DoDispose()
- {
- Close();
- }
- public void Close()
- {
- UnsafeNativeMethods.CloseHandle(_handle);
- _handle = IntPtr.Zero;
- }
- public bool AddProcess(IntPtr handle)
- {
- return UnsafeNativeMethods.AssignProcessToJobObject(_handle, handle);
- }
- private IntPtr _handle;
- }
- }
|