Академический Документы
Профессиональный Документы
Культура Документы
слово4
слово4
… до настоящего времени!
история
Вначале был TTY
Как обсуждалось в прошлой статье, в первые дни вычислений пользователи
управляли компьютерами с помощью электромеханических телетайпов (TTY),
подключённых к компьютеру через какой-то последовательный канал связи
(обычно через токовую петлю 20 мА).
Распространение терминалов
Приложение/оболочка псевдотерминала
Что делать?
Многие, многие разработчики часто просили PTY-подобный механизм под
Windows, особенно те, кто работает с инструментами ConEmu/Cmder,
Console2/ConsoleZ, Hyper, VSCode, Visual Studio, WSL, Docker и OpenSSH.
Архитектура консоли/ConHost
Чтобы понять ConPTY, нужно изучить архитектуру консоли Windows, а точнее…
ConHost!
Важно понимать, что хотя ConHost реализует всё, что вы видите и знаете как
приложение Windows Console, но ConHost также содержит и реализует большую
часть инфраструктуры командной строки Windows! Отныне же ConHost
становится настоящим «консольным узлом», поддерживая все приложения
командной строки и/или GUI-приложения, которые взаимодействуют с
приложениями командной строки!
Как? Почему? Что? Давайте разберёмся подробнее.
1. Консоль:
Таким образом, чтобы удалённо управлять машиной Windows, нам нужен какой-то
брокер связи, который сможет прозрачно сериализовать данные по сети,
управлять временем жизни экземпляра приложения и т.д.
1. Пользователь:
Весело, правда? Вовсе нет! В такой ситуации многое может пойти наперекосяк,
особенно в процессе имитации и отправки пользовательского ввода и очистки
выходного буфера внеэкранной консоли. Это приводит к нестабильности, сбоям,
повреждению данных, чрезмерному потреблению энергии и т.д. Кроме того, не
все приложения выполняют работу по снятию не только самого текста, но и его
свойств, из-за чего теряется форматирование и цвет!
1. Пользователь:
Такой подход с использованием ConPTY явно чище и проще для службы sshd.
Вызовы Windows Console API выполняются полностью в экземпляре ConHost
приложения командной строки, который преобразует все видимые изменения в
текст/VT. Кто бы не подключался к ConHost, ему необязательно знать, что
приложение там вызывает Console API, а не генерирует текст/VT!
декларации API:
// Creates a "Pseudo Console" (ConPTY).
HRESULT WINAPI CreatePseudoConsole(
_In_ COORD size, // ConPty Dimensions
_In_ HANDLE hInput, // ConPty Input
_In_ HANDLE hOutput, // ConPty Output
_In_ DWORD dwFlags, // ConPty Flags
_Out_ HPCON* phPC); // ConPty Reference
// Closes the ConPTY and all associated handles. Client applications attached
// to the ConPTY will also terminated.
VOID WINAPI ClosePseudoConsole(_In_ HPCON hPC);
ResizePseudoConsole(hPC, size)
ClosePseudoConsole (hPC)
// ...
siEx->StartupInfo.cb = sizeof(STARTUPINFOEX);
if (fSuccess)
{
// Set thread attribute list's Pseudo Console to the specified
ConPTY
fSuccess = UpdateProcThreadAttribute(
lpAttributeList,
0,
PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,
hPC,
sizeof(HPCON),
NULL,
NULL);
return fSuccess ? S_OK : HRESULT_FROM_WIN32(GetLastError());
}
else
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
return hr;
}
// ...
HANDLE hOut, hIn;
HANDLE outPipeOurSide, inPipeOurSide;
HANDLE outPipePseudoConsoleSide, inPipePseudoConsoleSide;
HPCON hPC = 0;
// ...
Запись в псевдоконсоль
Закрытие псевдоконсоли
ClosePseudoConsole(hPC);
Призыв к действию!
Внедрение ConPTY API — пожалуй, одно из самых фундаментальных и
раскрепощающих изменений, произошедших с командной строкой Windows
за последние годы… если не десятилетия!