Example #1
0
        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();
        }