/// <summary> /// Create process. /// </summary> /// <param name="config">The process configuration.</param> /// <returns>The created win32 process.</returns> public static Win32Process CreateProcess(Win32ProcessConfig config) { if (config.Token != null) { return(CreateProcessAsUser(config.Token, config)); } PROCESS_INFORMATION proc_info = new PROCESS_INFORMATION(); using (var resources = new DisposableList <IDisposable>()) { SECURITY_ATTRIBUTES proc_attr = config.ProcessSecurityAttributes(resources); SECURITY_ATTRIBUTES thread_attr = config.ThreadSecurityAttributes(resources); using (var debug_object = config.SetDebugObject()) { if (!Win32NativeMethods.CreateProcess(config.ApplicationName, config.CommandLine, proc_attr, thread_attr, config.InheritHandles, config.CreationFlags | CreateProcessFlags.ExtendedStartupInfoPresent, config.Environment, config.CurrentDirectory, config.ToStartupInfoEx(resources), out proc_info)) { throw new SafeWin32Exception(); } } return(new Win32Process(proc_info, config.TerminateOnDispose)); } }