A Windows software package providing an interface similar to a Unix pty-master for communicating with Windows console programs.
Go to file
2018-12-14 14:16:31 +08:00
misc Add util exercising [GS]etConsoleScreenBufferInfoEx 2018-09-16 20:59:52 -07:00
ship Use Appveyor's MSYS2/Cygwin installation rather than my own snapshots 2018-10-29 04:20:06 -07:00
src Do not output title escape sequences when WINPTY_FLAG_PLAIN_OUTPUT sets 2018-12-14 14:16:31 +08:00
.drone.yml Continuous Integration: Add build configure for Tea CI. 2016-06-14 11:50:59 +08:00
.gitattributes Put the commit hash into the msvc binary package 2017-01-18 04:57:11 -06:00
.gitignore ship.py: build packages using cygwin/msys2 prebuilts 2018-10-14 22:43:03 -07:00
appveyor.yml Use Appveyor's MSYS2/Cygwin installation rather than my own snapshots 2018-10-29 04:20:06 -07:00
configure Build system: redo how version number tracking works 2017-01-17 23:39:14 -06:00
LICENSE Update the LICENSE copyright year 2016-02-25 21:27:47 -06:00
Makefile Build system: redo how version number tracking works 2017-01-17 23:39:14 -06:00
README.md Add a tea-ci badge to the README 2016-06-14 00:03:47 -05:00
RELEASES.md Update release notes 2017-05-25 20:01:39 -05:00
vcbuild.bat Put the commit hash into the msvc binary package 2017-01-18 04:57:11 -06:00
VERSION.txt Bump version to 0.4.4-dev 2017-05-17 02:01:42 -05:00

winpty

Build Status

winpty is a Windows software package providing an interface similar to a Unix pty-master for communicating with Windows console programs. The package consists of a library (libwinpty) and a tool for Cygwin and MSYS for running Windows console programs in a Cygwin/MSYS pty.

The software works by starting the winpty-agent.exe process with a new, hidden console window, which bridges between the console API and terminal input/output escape codes. It polls the hidden console's screen buffer for changes and generates a corresponding stream of output.

The Unix adapter allows running Windows console programs (e.g. CMD, PowerShell, IronPython, etc.) under mintty or Cygwin's sshd with properly-functioning input (e.g. arrow and function keys) and output (e.g. line buffering). The library could be also useful for writing a non-Cygwin SSH server.

Supported Windows versions

winpty runs on Windows XP through Windows 10, including server versions. It can be compiled into either 32-bit or 64-bit binaries.

Cygwin/MSYS adapter (winpty.exe)

Prerequisites

You need the following to build winpty:

  • A Cygwin or MSYS installation
  • GNU make
  • A MinGW g++ toolchain capable of compiling C++11 code to build winpty.dll and winpty-agent.exe
  • A g++ toolchain targeting Cygwin or MSYS to build winpty.exe

Winpty requires two g++ toolchains as it is split into two parts. The winpty.dll and winpty-agent.exe binaries interface with the native Windows command prompt window so they are compiled with the native MinGW toolchain. The winpty.exe binary interfaces with the MSYS/Cygwin terminal so it is compiled with the MSYS/Cygwin toolchain.

MinGW appears to be split into two distributions -- MinGW (creates 32-bit binaries) and MinGW-w64 (creates both 32-bit and 64-bit binaries). Either one is generally acceptable.

Cygwin packages

The default g++ compiler for Cygwin targets Cygwin itself, but Cygwin also packages MinGW-w64 compilers. As of this writing, the necessary packages are:

  • Either mingw64-i686-gcc-g++ or mingw64-x86_64-gcc-g++. Select the appropriate compiler for your CPU architecture.
  • gcc-g++
  • make

As of this writing (2016-01-23), only the MinGW-w64 compiler is acceptable. The MinGW compiler (e.g. from the mingw-gcc-g++ package) is no longer maintained and is too buggy.

MSYS packages

For the original MSYS, use the mingw-get tool (MinGW Installation Manager), and select at least these components:

  • mingw-developer-toolkit
  • mingw32-base
  • mingw32-gcc-g++
  • msys-base
  • msys-system-builder

When running ./configure, make sure that mingw32-g++ is in your PATH. It will be in the C:\MinGW\bin directory.

MSYS2 packages

For MSYS2, use pacman and install at least these packages:

  • msys/gcc
  • mingw32/mingw-w64-i686-gcc or mingw64/mingw-w64-x86_64-gcc. Select the appropriate compiler for your CPU architecture.
  • make

MSYS2 provides three start menu shortcuts for starting MSYS2:

  • MinGW-w64 Win32 Shell
  • MinGW-w64 Win64 Shell
  • MSYS2 Shell

To build winpty, use the MinGW-w64 {Win32,Win64} shortcut of the architecture matching MSYS2. These shortcuts will put the g++ compiler from the {mingw32,mingw64}/mingw-w64-{i686,x86_64}-gcc packages into the PATH.

Alternatively, instead of installing mingw32/mingw-w64-i686-gcc or mingw64/mingw-w64-x86_64-gcc, install the mingw-w64-cross-gcc and mingw-w64-cross-crt-git packages. These packages install cross-compilers into /opt/bin, and then any of the three shortcuts will work.

Building the Unix adapter

In the project directory, run ./configure, then make, then make install. By default, winpty is installed into /usr/local. Pass PREFIX=<path> to make install to override this default.

Using the Unix adapter

To run a Windows console program in mintty or Cygwin sshd, prepend winpty to the command-line:

$ winpty powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\rprichard\proj\winpty> 10 + 20
30
PS C:\rprichard\proj\winpty> exit

Embedding winpty / MSVC compilation

See src/include/winpty.h for the prototypes of functions exported by winpty.dll.

Only the winpty.exe binary uses Cygwin; all the other binaries work without it and can be compiled with either MinGW or MSVC. To compile using MSVC, download gyp and run gyp -I configurations.gypi in the src subdirectory. This will generate a winpty.sln and associated project files. See the src/winpty.gyp and src/configurations.gypi files for notes on dealing with MSVC versions and different architectures.

Compiling winpty with MSVC currently requires MSVC 2013 or newer.

Debugging winpty

winpty comes with a tool for collecting timestamped debugging output. To use it:

  1. Run winpty-debugserver.exe on the same computer as winpty.
  2. Set the WINPTY_DEBUG environment variable to trace for the winpty.exe process and/or the process using libwinpty.dll.

winpty also recognizes a WINPTY_SHOW_CONSOLE environment variable. Set it to 1 to prevent winpty from hiding the console window.

This project is distributed under the MIT license (see the LICENSE file in the project root).

By submitting a pull request for this project, you agree to license your contribution under the MIT license to this project.