Exemplo n.º 1
0
        public JobObject Build()
        {
            var jobObject = new JobObject();

            var lim = new JobObjectExtendedLimitInformation
            {
                BasicLimitInformation = new JobObjectBasicLimitInformation
                {
                    LimitFlags              = LimitFlag,
                    ActiveProcessLimit      = ProcessCounts,
                    PerProcessUserTimeLimit = UserTimeLimit,
                },

                ProcessMemoryLimit = new UIntPtr(ProcessMemoryLimit),
            };

            jobObject.SetExtendedLimit(ref lim);
            jobObject.SetUIRestrictions(LimitFunction);
            return(jobObject);
        }
Exemplo n.º 2
0
        public unsafe Process Build(JobObject jobObject = null)
        {
            var jo  = jobObject ?? hJobObject;
            var flg = flags;

            if (jo != null)
            {
                flg |= CreateProcessFlags.CreateSuspended;
            }

            var si = new StartupInfo
            {
                cb      = Marshal.SizeOf <StartupInfo>(),
                dwFlags = stf
            };

            var  pi = new ProcessInformation();
            Pipe stdin = null, stdout = null, stderr = null;

            // Set the redirect of standard io handles
            if ((stf & StartFlag.UseStdHandles) != 0)
            {
                SafeFileHandle useIn, useOut, useErr;

                if (this.useIn)
                {
                    stdin = new Pipe(true);
                    useIn = stdin.ChildrenHandle;
                }
                else
                {
                    useIn = Kernel32.GetStdHandle(StdHandle.Input);
                }

                if (this.useOut)
                {
                    stdout = new Pipe(false);
                    useOut = stdout.ChildrenHandle;
                }
                else
                {
                    useOut = Kernel32.GetStdHandle(StdHandle.Output);
                }

                if (this.useErr)
                {
                    stderr = new Pipe(false);
                    useErr = stderr.ChildrenHandle;
                }
                else
                {
                    useErr = Kernel32.GetStdHandle(StdHandle.Error);
                }

                si.hStdInput  = useIn.DangerousGetHandle();
                si.hStdOutput = useOut.DangerousGetHandle();
                si.hStdError  = useErr.DangerousGetHandle();
            }

            SecurityAttributes sc = new SecurityAttributes();

            fixed(char *envPtr = env)
            {
                var res = Kernel32.CreateProcessW(fileName, args,
                                                  &sc, &sc, true, flg,
                                                  IntPtr.Zero, workDir, ref si, ref pi);

                if (!res)
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }

            var proc = new SafeProcessHandle(pi.hProcess, true);

            if (jo != null)
            {
                jo.AssignProcess(proc);
                Kernel32.ResumeThread(pi.hThread);
            }

            Kernel32.CloseHandle(pi.hThread);
            return(new Process(proc, stdin, stdout, stderr, encoding));
        }
Exemplo n.º 3
0
 public ProcessBuilder AssignTo(JobObject jobObject)
 {
     hJobObject = jobObject;
     return(this);
 }