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));
        }