void AssignProcessToJobObject() { var securityAttributes = new WinInterop.SecurityAttributes(); securityAttributes.nLength = Marshal.SizeOf(securityAttributes); hJob = CheckResult(WinJobs.NativeMethods.CreateJobObject(securityAttributes, "procgov-" + Guid.NewGuid())); // create completion port hIOCP = CheckResult(WinJobs.NativeMethods.CreateIoCompletionPort(WinHandles.NativeMethods.INVALID_HANDLE_VALUE, IntPtr.Zero, IntPtr.Zero, 1)); var assocInfo = new WinJobs.JOBOBJECT_ASSOCIATE_COMPLETION_PORT { CompletionKey = IntPtr.Zero, CompletionPort = hIOCP }; uint size = (uint)Marshal.SizeOf(assocInfo); CheckResult(WinJobs.NativeMethods.SetInformationJobObject(hJob, WinJobs.JOBOBJECTINFOCLASS.AssociateCompletionPortInformation, ref assocInfo, size)); // start listening thread listener = new Thread(CompletionPortListener); listener.Start(hIOCP); WinJobs.JobInformationLimitFlags flags = WinJobs.JobInformationLimitFlags.JOB_OBJECT_LIMIT_BREAKAWAY_OK | WinJobs.JobInformationLimitFlags.JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK; if (maxProcessMemory > 0) { flags |= WinJobs.JobInformationLimitFlags.JOB_OBJECT_LIMIT_PROCESS_MEMORY; } if (cpuAffinityMask != 0) { flags |= WinJobs.JobInformationLimitFlags.JOB_OBJECT_LIMIT_AFFINITY; } long systemAffinity, processAffinity; CheckResult(WinProcesses.NativeMethods.GetProcessAffinityMask(hProcess, out processAffinity, out systemAffinity)); // configure constraints var limitInfo = new WinJobs.JOBOBJECT_EXTENDED_LIMIT_INFORMATION { BasicLimitInformation = new WinJobs.JOBOBJECT_BASIC_LIMIT_INFORMATION { LimitFlags = flags, Affinity = systemAffinity & cpuAffinityMask }, ProcessMemoryLimit = (UIntPtr)maxProcessMemory }; size = (uint)Marshal.SizeOf(limitInfo); CheckResult(WinJobs.NativeMethods.SetInformationJobObject(hJob, WinJobs.JOBOBJECTINFOCLASS.ExtendedLimitInformation, ref limitInfo, size)); // assign a process to a job to apply constraints CheckResult(WinJobs.NativeMethods.AssignProcessToJobObject(hJob, hProcess.DangerousGetHandle())); }
public static extern bool SetInformationJobObject(IntPtr hJob, JOBOBJECTINFOCLASS JobObjectInfoClass, ref JOBOBJECT_EXTENDED_LIMIT_INFORMATION lpJobObjectInfo, uint cbJobObjectInfoLength);