public static unsafe Win32Job CreateAndAssignToProcess(SafeFileHandle hProcess, uint processId, bool propagateOnChildProcesses, long clockTimeLimitInMilliseconds) { var securityAttributes = new SECURITY_ATTRIBUTES(); securityAttributes.nLength = (uint)Marshal.SizeOf(securityAttributes); var hJob = CheckWin32Result(PInvoke.CreateJobObject(securityAttributes, $"Local\\procgov-{processId}")); var hCurrentProcess = PInvoke.GetCurrentProcess(); CheckWin32Result(PInvoke.DuplicateHandle(hCurrentProcess, (HANDLE)hJob.DangerousGetHandle(), (HANDLE)hProcess.DangerousGetHandle(), null, 0, false, DUPLICATE_HANDLE_OPTIONS.DUPLICATE_SAME_ACCESS)); // assign a process to a job to apply constraints CheckWin32Result(PInvoke.AssignProcessToJobObject(hJob, hProcess)); return(new Win32Job(hJob, hProcess, propagateOnChildProcesses, clockTimeLimitInMilliseconds)); }