Beispiel #1
0
        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);
        }
Beispiel #2
0
        private void CloseCore()
        {
            _inputPipe?.Dispose();
            _outputPipe?.Dispose();

            _inputPipe  = null;
            _outputPipe = null;


            if (_ptyHandle != IntPtr.Zero)
            {
                Kernel32.ClosePseudoConsole(_ptyHandle);
                _ptyHandle = IntPtr.Zero;
            }
        }
Beispiel #3
0
        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;
        }