-
Notifications
You must be signed in to change notification settings - Fork 8.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge https://github.com/Microsoft/Console into master
- Loading branch information
Showing
68 changed files
with
5,506 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
This bug-tracker is monitored by Windows Console development team and other technical types. **We like detail!** | ||
|
||
If you have a feature request, please post to [the UserVoice](https://wpdev.uservoice.com/forums/266908). | ||
|
||
> **Important: When reporting BSODs or security issues, DO NOT attach memory dumps, logs, or traces to Github issues**. Instead, send dumps/traces to [email protected], referencing this GitHub issue. | ||
Please use this form and describe your issue, concisely but precisely, with as much detail as possible | ||
|
||
* Your Windows build number: (Type `ver` at a Windows Command Prompt) | ||
|
||
* What you're doing and what's happening: (Copy & paste specific commands and their output, or include screen shots) | ||
|
||
* What's wrong / what should be happening instead: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# Welcome to the official Windows Console issues & samples repo! | ||
|
||
## Issues | ||
|
||
This repo is monitored by the Windows Console engineering team, and provides a best-effort, informal support option for the community. Your patience is appreciated! | ||
|
||
The Windows Console engineering team greatly appreciate issues containing concise, detailed issues containing repro-steps, and screenshots where appropriate :) | ||
|
||
We also appreciate not +1-ing issues with no additional or actionable information. Please use a reaction to show your support of an existing comment on the thread and/or subscribe to notifications using the button in the sidebar in lieu of providing a low-value comment. | ||
|
||
### Code of Conduct | ||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [email protected] with any additional questions or comments. | ||
|
||
In addition, the team reserve the right to actively manage issues, closing duplicates or resolved issues, etc., and would appreciate it if you would avoid creating duplicates of existing items by searching issues _before_ filing a new issue. | ||
|
||
## Tools & Samples | ||
You'll also find assorted Console tools, samples, including the following: | ||
|
||
* [ColorTool](https://github.com/Microsoft/Console/tree/master/src/tools/ColorTool) - A tool for changing the color scheme of the Windows console. | ||
* [EchoCon](https://github.com/Microsoft/console/tree/master/samples/ConPTY/EchoCon) - A C++ sample application that illustrates how to use the new Win32 Pseudo Console (ConPTY). | ||
* [MiniTerm](https://github.com/Microsoft/console/tree/master/samples/ConPTY/MiniTerm) - A C# sample terminal that illustrates how to use ConPTY. | ||
* [ReadConsoleInputStream](https://github.com/Microsoft/console/tree/master/samples/ReadConsoleInputStream) - A C# sample console application that shows how to use the console APIs to stream stdin while asynchronously watching for console events (buffer size, viewport size, mouse input etc.) | ||
|
||
### Tool Build Status | ||
|
||
Project|Build Status | ||
---|--- | ||
src/tools/ColorTool|![](https://microsoft.visualstudio.com/_apis/public/build/definitions/c93e867a-8815-43c1-92c4-e7dd5404f1e1/17023/badge) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
|
||
Microsoft Visual Studio Solution File, Format Version 12.00 | ||
# Visual Studio 15 | ||
VisualStudioVersion = 15.0.27703.2026 | ||
MinimumVisualStudioVersion = 10.0.40219.1 | ||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EchoCon", "EchoCon\EchoCon.vcxproj", "{96274800-9574-423E-892A-909FBE2AC8BE}" | ||
EndProject | ||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{556CAA54-33E0-4F99-95C8-0DFD6E8F6C6B}" | ||
ProjectSection(SolutionItems) = preProject | ||
readme.md = readme.md | ||
EndProjectSection | ||
EndProject | ||
Global | ||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||
Debug|x64 = Debug|x64 | ||
Debug|x86 = Debug|x86 | ||
Release|x64 = Release|x64 | ||
Release|x86 = Release|x86 | ||
EndGlobalSection | ||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||
{96274800-9574-423E-892A-909FBE2AC8BE}.Debug|x64.ActiveCfg = Debug|x64 | ||
{96274800-9574-423E-892A-909FBE2AC8BE}.Debug|x64.Build.0 = Debug|x64 | ||
{96274800-9574-423E-892A-909FBE2AC8BE}.Debug|x86.ActiveCfg = Debug|Win32 | ||
{96274800-9574-423E-892A-909FBE2AC8BE}.Debug|x86.Build.0 = Debug|Win32 | ||
{96274800-9574-423E-892A-909FBE2AC8BE}.Release|x64.ActiveCfg = Release|x64 | ||
{96274800-9574-423E-892A-909FBE2AC8BE}.Release|x64.Build.0 = Release|x64 | ||
{96274800-9574-423E-892A-909FBE2AC8BE}.Release|x86.ActiveCfg = Release|Win32 | ||
{96274800-9574-423E-892A-909FBE2AC8BE}.Release|x86.Build.0 = Release|Win32 | ||
EndGlobalSection | ||
GlobalSection(SolutionProperties) = preSolution | ||
HideSolutionNode = FALSE | ||
EndGlobalSection | ||
GlobalSection(ExtensibilityGlobals) = postSolution | ||
SolutionGuid = {B27C5007-61E2-4080-965D-8C934367BA4F} | ||
EndGlobalSection | ||
EndGlobal |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,189 @@ | ||
// EchoCon.cpp : Entry point for the EchoCon Pseudo-Consle sample application. | ||
// Copyright © 2018, Microsoft | ||
|
||
#include "stdafx.h" | ||
#include <Windows.h> | ||
#include <process.h> | ||
|
||
// Forward declarations | ||
HRESULT CreatePseudoConsoleAndPipes(HPCON*, HANDLE*, HANDLE*); | ||
HRESULT InitializeStartupInfoAttachedToPseudoConsole(STARTUPINFOEX*, HPCON); | ||
void __cdecl PipeListener(LPVOID); | ||
|
||
int main() | ||
{ | ||
wchar_t szCommand[]{ L"ping localhost" }; | ||
HRESULT hr{ E_UNEXPECTED }; | ||
HANDLE hConsole = { GetStdHandle(STD_OUTPUT_HANDLE) }; | ||
|
||
// Enable Console VT Processing | ||
DWORD consoleMode{}; | ||
GetConsoleMode(hConsole, &consoleMode); | ||
hr = SetConsoleMode(hConsole, consoleMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING) | ||
? S_OK | ||
: GetLastError(); | ||
if (S_OK == hr) | ||
{ | ||
HPCON hPC{ INVALID_HANDLE_VALUE }; | ||
|
||
// Create the Pseudo Console and pipes to it | ||
HANDLE hPipeIn{ INVALID_HANDLE_VALUE }; | ||
HANDLE hPipeOut{ INVALID_HANDLE_VALUE }; | ||
hr = CreatePseudoConsoleAndPipes(&hPC, &hPipeIn, &hPipeOut); | ||
if (S_OK == hr) | ||
{ | ||
// Create & start thread to listen to the incoming pipe | ||
// Note: Using CRT-safe _beginthread() rather than CreateThread() | ||
HANDLE hPipeListenerThread{ reinterpret_cast<HANDLE>(_beginthread(PipeListener, 0, hPipeIn)) }; | ||
|
||
// Initialize the necessary startup info struct | ||
STARTUPINFOEX startupInfo{}; | ||
if (S_OK == InitializeStartupInfoAttachedToPseudoConsole(&startupInfo, hPC)) | ||
{ | ||
// Launch ping to emit some text back via the pipe | ||
PROCESS_INFORMATION piClient{}; | ||
hr = CreateProcess( | ||
NULL, // No module name - use Command Line | ||
szCommand, // Command Line | ||
NULL, // Process handle not inheritable | ||
NULL, // Thread handle not inheritable | ||
FALSE, // Inherit handles | ||
EXTENDED_STARTUPINFO_PRESENT, // Creation flags | ||
NULL, // Use parent's environment block | ||
NULL, // Use parent's starting directory | ||
&startupInfo.StartupInfo, // Pointer to STARTUPINFO | ||
&piClient) // Pointer to PROCESS_INFORMATION | ||
? S_OK | ||
: GetLastError(); | ||
|
||
if (S_OK == hr) | ||
{ | ||
// Wait up to 10s for ping process to complete | ||
WaitForSingleObject(piClient.hThread, 10 * 1000); | ||
|
||
// Allow listening thread to catch-up with final output! | ||
Sleep(500); | ||
} | ||
|
||
// --- CLOSEDOWN --- | ||
|
||
// Now safe to clean-up client app's process-info & thread | ||
CloseHandle(piClient.hThread); | ||
CloseHandle(piClient.hProcess); | ||
|
||
// Cleanup attribute list | ||
DeleteProcThreadAttributeList(startupInfo.lpAttributeList); | ||
free(startupInfo.lpAttributeList); | ||
} | ||
|
||
// Close ConPTY - this will terminate client process if running | ||
ClosePseudoConsole(hPC); | ||
|
||
// Clean-up the pipes | ||
if (INVALID_HANDLE_VALUE != hPipeOut) CloseHandle(hPipeOut); | ||
if (INVALID_HANDLE_VALUE != hPipeIn) CloseHandle(hPipeIn); | ||
} | ||
} | ||
|
||
return S_OK == hr ? EXIT_SUCCESS : EXIT_FAILURE; | ||
} | ||
|
||
HRESULT CreatePseudoConsoleAndPipes(HPCON* phPC, HANDLE* phPipeIn, HANDLE* phPipeOut) | ||
{ | ||
HRESULT hr{ E_UNEXPECTED }; | ||
HANDLE hPipePTYIn{ INVALID_HANDLE_VALUE }; | ||
HANDLE hPipePTYOut{ INVALID_HANDLE_VALUE }; | ||
|
||
// Create the pipes to which the ConPTY will connect | ||
if (CreatePipe(&hPipePTYIn, phPipeOut, NULL, 0) && | ||
CreatePipe(phPipeIn, &hPipePTYOut, NULL, 0)) | ||
{ | ||
// Determine required size of Pseudo Console | ||
COORD consoleSize{}; | ||
CONSOLE_SCREEN_BUFFER_INFO csbi{}; | ||
HANDLE hConsole{ GetStdHandle(STD_OUTPUT_HANDLE) }; | ||
if (GetConsoleScreenBufferInfo(hConsole, &csbi)) | ||
{ | ||
consoleSize.X = csbi.srWindow.Right - csbi.srWindow.Left + 1; | ||
consoleSize.Y = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; | ||
} | ||
|
||
// Create the Pseudo Console of the required size, attached to the PTY-end of the pipes | ||
hr = CreatePseudoConsole(consoleSize, hPipePTYIn, hPipePTYOut, 0, phPC); | ||
|
||
// Note: We can close the handles to the PTY-end of the pipes here | ||
// because the handles are dup'ed into the ConHost and will be released | ||
// when the ConPTY is destroyed. | ||
if (INVALID_HANDLE_VALUE != hPipePTYOut) CloseHandle(hPipePTYOut); | ||
if (INVALID_HANDLE_VALUE != hPipePTYIn) CloseHandle(hPipePTYIn); | ||
} | ||
|
||
return hr; | ||
} | ||
|
||
// Initializes the specified startup info struct with the required properties and | ||
// updates its thread attribute list with the specified ConPTY handle | ||
HRESULT InitializeStartupInfoAttachedToPseudoConsole(STARTUPINFOEX* pStartupInfo, HPCON hPC) | ||
{ | ||
HRESULT hr{ E_UNEXPECTED }; | ||
|
||
if (pStartupInfo) | ||
{ | ||
size_t attrListSize{}; | ||
|
||
pStartupInfo->StartupInfo.cb = sizeof(STARTUPINFOEX); | ||
|
||
// Get the size of the thread attribute list. | ||
InitializeProcThreadAttributeList(NULL, 1, 0, &attrListSize); | ||
|
||
// Allocate a thread attribute list of the correct size | ||
pStartupInfo->lpAttributeList = | ||
reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(malloc(attrListSize)); | ||
|
||
// Initialize thread attribute list | ||
if (pStartupInfo->lpAttributeList | ||
&& InitializeProcThreadAttributeList(pStartupInfo->lpAttributeList, 1, 0, &attrListSize)) | ||
{ | ||
// Set Pseudo Console attribute | ||
hr = UpdateProcThreadAttribute( | ||
pStartupInfo->lpAttributeList, | ||
0, | ||
PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE, | ||
hPC, | ||
sizeof(HPCON), | ||
NULL, | ||
NULL) | ||
? S_OK | ||
: HRESULT_FROM_WIN32(GetLastError()); | ||
} | ||
else | ||
{ | ||
hr = HRESULT_FROM_WIN32(GetLastError()); | ||
} | ||
} | ||
return hr; | ||
} | ||
|
||
void __cdecl PipeListener(LPVOID pipe) | ||
{ | ||
HANDLE hPipe{ pipe }; | ||
HANDLE hConsole{ GetStdHandle(STD_OUTPUT_HANDLE) }; | ||
|
||
const DWORD BUFF_SIZE{ 512 }; | ||
char szBuffer[BUFF_SIZE]{}; | ||
|
||
DWORD dwBytesWritten{}; | ||
DWORD dwBytesRead{}; | ||
BOOL fRead{ FALSE }; | ||
do | ||
{ | ||
// Read from the pipe | ||
fRead = ReadFile(hPipe, szBuffer, BUFF_SIZE, &dwBytesRead, NULL); | ||
|
||
// Write received text to the Console | ||
// Note: Write to the Console using WriteFile(hConsole...), not printf()/puts() to | ||
// prevent partially-read VT sequences from corrupting output | ||
WriteFile(hConsole, szBuffer, dwBytesRead, &dwBytesWritten, NULL); | ||
|
||
} while (fRead && dwBytesRead >= 0); | ||
} |
Oops, something went wrong.