public unsafe Job() { _handle = Kernel32.CreateJobObject(null, null); var info = new Kernel32.JOBOBJECT_BASIC_LIMIT_INFORMATION { LimitFlags = Kernel32.JOB_OBJECT_LIMIT_FLAGS.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE }; var extendedInfo = new Kernel32.JOBOBJECT_EXTENDED_LIMIT_INFORMATION { BasicLimitInformation = info }; var length = Marshal.SizeOf(typeof(Kernel32.JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); var extendedInfoPtr = Marshal.AllocHGlobal(length); Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false); if (!Kernel32.SetInformationJobObject(_handle, Kernel32.JOBOBJECTINFOCLASS.JobObjectExtendedLimitInformation, extendedInfoPtr, (uint)length)) { throw new Exception( $"Unable to set information. Error: {Marshal.GetLastWin32Error()}"); } }
public TerminalService() { _job = Kernel32.CreateJobObject(IntPtr.Zero, null); var limit = new Kernel32.JOBOBJECT_EXTENDED_LIMIT_INFORMATION(); limit.BasicLimitInformation.LimitFlags = Kernel32.JOB_OBJECT_LIMIT_FLAGS.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; unsafe { if (!Kernel32.SetInformationJobObject(_job, Kernel32.JOBOBJECTINFOCLASS.JobObjectExtendedLimitInformation, &limit, (uint)sizeof(Kernel32.JOBOBJECT_EXTENDED_LIMIT_INFORMATION))) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } } _plinkFile = Path.GetTempFileName(); File.SetAttributes(_plinkFile, File.GetAttributes(_plinkFile) | FileAttributes.Temporary); _plinkHandle = ExtractPlink(); }