public static StartupInfoWithOutputStreams Create() { var result = new StartupInfoWithOutputStreams(); result.STARTUP_INFO = new AdvApi32PInvoke.STARTUPINFO(); result.STARTUP_INFO.cb = Marshal.SizeOf(typeof(AdvApi32PInvoke.STARTUPINFO)); SafeFileHandle internalConsoleOutput; SafeFileHandle internalErrorOutput; SafeFileHandle consoleOutput; SafeFileHandle errorOutput; Win32Pipe.CreatePipe(out internalConsoleOutput, out consoleOutput, false); Win32Pipe.CreatePipe(out internalErrorOutput, out errorOutput, false); result.STARTUP_INFO.hStdInput = Kernel32.GetStdHandle(Kernel32.STD_INPUT_HANDLE); result.STARTUP_INFO.hStdOutput = consoleOutput.DangerousGetHandle(); result.STARTUP_INFO.hStdError = errorOutput.DangerousGetHandle(); result.STARTUP_INFO.dwFlags = AdvApi32PInvoke.STARTF_USESTDHANDLES; Encoding encoding = Encoding.GetEncoding(Kernel32.GetConsoleOutputCP()); result.ConsoleOutput = new StreamReader(new FileStream(internalConsoleOutput, FileAccess.Read, 0x1000, false), encoding, true, 0x1000); result.ErrorOutput = new StreamReader(new FileStream(internalErrorOutput, FileAccess.Read, 0x1000, false), encoding, true, 0x1000); return(result); }
private void CloseCore() { _inputPipe?.Dispose(); _outputPipe?.Dispose(); _inputPipe = null; _outputPipe = null; if (_ptyHandle != IntPtr.Zero) { Kernel32.ClosePseudoConsole(_ptyHandle); _ptyHandle = IntPtr.Zero; } }
private void StartCore() { if (!_attr.Sys.UseTty) { throw new Exception("Only a new process with controlled tty supported"); } _inputPipe = new Win32Pipe(); _outputPipe = new Win32Pipe(); var size = new COORD { X = DEFAULT_WIDTH, Y = DEFAULT_HEIGHT, }; var result = Kernel32.CreatePseudoConsole( size: size, hInput: _inputPipe.Read, hOutput: _outputPipe.Write, dwFlags: 0, phPC: out _ptyHandle ); if (result != 0) { throw new Win32Exception(result, "Could not create pseudo console."); } startupInfo = ConfigureProcessThread(_ptyHandle, (IntPtr)Kernel32.PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE); processInfo = RunProcess(ref startupInfo, _fileName); if (_attr.RedirectStdin) { var inStream = new FileStream(_inputPipe.Write, FileAccess.Write); Stdin = new StreamWriter(inStream); } if (_attr.RedirectStdout) { var outStream = new FileStream(_outputPipe.Read, FileAccess.Read); Stdout = new StreamReader(outStream); } Pid = processInfo.dwProcessId; IsRunning = true; }