1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- using System;
- using System.Runtime.InteropServices;
- namespace WinSCP
- {
- internal class Job : IDisposable
- {
- public Job(Logger logger, string name)
- {
- _logger = logger;
- _handle = UnsafeNativeMethods.CreateJobObject(IntPtr.Zero, name);
- if (_handle == IntPtr.Zero)
- {
- _logger.WriteLine("Cannot create job ({0})", Logger.LastWin32ErrorMessage());
- }
- else
- {
- _logger.WriteLine("Job created");
- JobObjectBasicLimitInformation info = new JobObjectBasicLimitInformation();
- info.LimitFlags = 0x2000; // JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
- JobObjectExtendedLimitInformation extendedInfo = new JobObjectExtendedLimitInformation();
- extendedInfo.BasicLimitInformation = info;
- int length = Marshal.SizeOf(typeof(JobObjectExtendedLimitInformation));
- IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
- Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
- if (UnsafeNativeMethods.SetInformationJobObject(_handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length))
- {
- _logger.WriteLine("Job set to kill all processes");
- }
- else
- {
- _logger.WriteLine("Cannot set job to kill all processes ({0})", Logger.LastWin32ErrorMessage());
- }
- }
- }
- ~Job()
- {
- DoDispose();
- }
- public void Dispose()
- {
- DoDispose();
- GC.SuppressFinalize(this);
- }
- private void DoDispose()
- {
- Close();
- }
- public void Close()
- {
- _logger.WriteLine("Closing job");
- UnsafeNativeMethods.CloseHandle(_handle);
- _handle = IntPtr.Zero;
- }
- private IntPtr _handle;
- private Logger _logger;
- }
- }
|