using Microsoft.Win32.SafeHandles; using System; using System.ComponentModel; using System.Runtime.InteropServices; using static GUIConsole.ConPTY.Native.PseudoConsoleApi; namespace GUIConsole.ConPTY { /// /// A pipe used to talk to the pseudoconsole, as described in: /// https://docs.microsoft.com/en-us/windows/console/creating-a-pseudoconsole-session /// /// /// We'll have two instances of this class, one for input and one for output. /// internal sealed class PseudoConsolePipe : IDisposable { public readonly SafeFileHandle ReadSide; public readonly SafeFileHandle WriteSide; public PseudoConsolePipe() { if (!CreatePipe(out ReadSide, out WriteSide, IntPtr.Zero, 0)) { throw new Win32Exception(Marshal.GetLastWin32Error(), "failed to create pipe"); } } #region IDisposable void Dispose(bool disposing) { if (disposing) { ReadSide?.Dispose(); WriteSide?.Dispose(); } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } #endregion } }