@shitiandmw/node-pty 1.1.0-agent.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +69 -0
- package/README.md +170 -0
- package/binding.gyp +111 -0
- package/deps/.editorconfig +2 -0
- package/deps/winpty/.drone.yml +17 -0
- package/deps/winpty/.gitattributes +19 -0
- package/deps/winpty/LICENSE +21 -0
- package/deps/winpty/Makefile +166 -0
- package/deps/winpty/README.md +151 -0
- package/deps/winpty/RELEASES.md +280 -0
- package/deps/winpty/VERSION.txt +1 -0
- package/deps/winpty/configure +167 -0
- package/deps/winpty/misc/BufferResizeTests.cc +90 -0
- package/deps/winpty/misc/ChangeScreenBuffer.cc +53 -0
- package/deps/winpty/misc/ClearConsole.cc +72 -0
- package/deps/winpty/misc/ConinMode.cc +117 -0
- package/deps/winpty/misc/ConinMode.ps1 +116 -0
- package/deps/winpty/misc/ConoutMode.cc +113 -0
- package/deps/winpty/misc/DebugClient.py +42 -0
- package/deps/winpty/misc/DebugServer.py +63 -0
- package/deps/winpty/misc/DumpLines.py +5 -0
- package/deps/winpty/misc/EnableExtendedFlags.txt +46 -0
- package/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +528 -0
- package/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +633 -0
- package/deps/winpty/misc/Font-Report-June2016/CP932.txt +630 -0
- package/deps/winpty/misc/Font-Report-June2016/CP936.txt +630 -0
- package/deps/winpty/misc/Font-Report-June2016/CP949.txt +630 -0
- package/deps/winpty/misc/Font-Report-June2016/CP950.txt +630 -0
- package/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +16 -0
- package/deps/winpty/misc/Font-Report-June2016/Results.txt +4 -0
- package/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +144 -0
- package/deps/winpty/misc/FontSurvey.cc +100 -0
- package/deps/winpty/misc/FormatChar.h +21 -0
- package/deps/winpty/misc/FreezePerfTest.cc +62 -0
- package/deps/winpty/misc/GetCh.cc +20 -0
- package/deps/winpty/misc/GetConsolePos.cc +41 -0
- package/deps/winpty/misc/GetFont.cc +261 -0
- package/deps/winpty/misc/IdentifyConsoleWindow.ps1 +51 -0
- package/deps/winpty/misc/IsNewConsole.cc +87 -0
- package/deps/winpty/misc/MouseInputNotes.txt +90 -0
- package/deps/winpty/misc/MoveConsoleWindow.cc +34 -0
- package/deps/winpty/misc/Notes.txt +219 -0
- package/deps/winpty/misc/OSVersion.cc +27 -0
- package/deps/winpty/misc/ScreenBufferFreezeInactive.cc +101 -0
- package/deps/winpty/misc/ScreenBufferTest.cc +671 -0
- package/deps/winpty/misc/ScreenBufferTest2.cc +151 -0
- package/deps/winpty/misc/SelectAllTest.cc +45 -0
- package/deps/winpty/misc/SetBufferSize.cc +32 -0
- package/deps/winpty/misc/SetCursorPos.cc +10 -0
- package/deps/winpty/misc/SetFont.cc +145 -0
- package/deps/winpty/misc/SetWindowRect.cc +36 -0
- package/deps/winpty/misc/ShowArgv.cc +12 -0
- package/deps/winpty/misc/ShowConsoleInput.cc +40 -0
- package/deps/winpty/misc/Spew.py +5 -0
- package/deps/winpty/misc/TestUtil.cc +172 -0
- package/deps/winpty/misc/UnicodeDoubleWidthTest.cc +102 -0
- package/deps/winpty/misc/UnicodeWideTest1.cc +246 -0
- package/deps/winpty/misc/UnicodeWideTest2.cc +130 -0
- package/deps/winpty/misc/UnixEcho.cc +89 -0
- package/deps/winpty/misc/Utf16Echo.cc +46 -0
- package/deps/winpty/misc/VeryLargeRead.cc +122 -0
- package/deps/winpty/misc/VkEscapeTest.cc +56 -0
- package/deps/winpty/misc/Win10ResizeWhileFrozen.cc +52 -0
- package/deps/winpty/misc/Win10WrapTest1.cc +57 -0
- package/deps/winpty/misc/Win10WrapTest2.cc +30 -0
- package/deps/winpty/misc/Win32Echo1.cc +26 -0
- package/deps/winpty/misc/Win32Echo2.cc +19 -0
- package/deps/winpty/misc/Win32Test1.cc +46 -0
- package/deps/winpty/misc/Win32Test2.cc +70 -0
- package/deps/winpty/misc/Win32Test3.cc +78 -0
- package/deps/winpty/misc/Win32Write1.cc +44 -0
- package/deps/winpty/misc/WindowsBugCrashReader.cc +27 -0
- package/deps/winpty/misc/WriteConsole.cc +106 -0
- package/deps/winpty/misc/build32.sh +9 -0
- package/deps/winpty/misc/build64.sh +9 -0
- package/deps/winpty/misc/color-test.sh +212 -0
- package/deps/winpty/misc/font-notes.txt +300 -0
- package/deps/winpty/misc/winbug-15048.cc +201 -0
- package/deps/winpty/ship/build-pty4j-libpty.bat +36 -0
- package/deps/winpty/ship/common_ship.py +53 -0
- package/deps/winpty/ship/make_msvc_package.py +165 -0
- package/deps/winpty/ship/ship.py +108 -0
- package/deps/winpty/src/agent/Agent.cc +613 -0
- package/deps/winpty/src/agent/Agent.h +103 -0
- package/deps/winpty/src/agent/AgentCreateDesktop.cc +84 -0
- package/deps/winpty/src/agent/AgentCreateDesktop.h +28 -0
- package/deps/winpty/src/agent/ConsoleFont.cc +632 -0
- package/deps/winpty/src/agent/ConsoleFont.h +28 -0
- package/deps/winpty/src/agent/ConsoleInput.cc +852 -0
- package/deps/winpty/src/agent/ConsoleInput.h +109 -0
- package/deps/winpty/src/agent/ConsoleInputReencoding.cc +121 -0
- package/deps/winpty/src/agent/ConsoleInputReencoding.h +36 -0
- package/deps/winpty/src/agent/ConsoleLine.cc +152 -0
- package/deps/winpty/src/agent/ConsoleLine.h +41 -0
- package/deps/winpty/src/agent/Coord.h +87 -0
- package/deps/winpty/src/agent/DebugShowInput.cc +239 -0
- package/deps/winpty/src/agent/DebugShowInput.h +32 -0
- package/deps/winpty/src/agent/DefaultInputMap.cc +422 -0
- package/deps/winpty/src/agent/DefaultInputMap.h +28 -0
- package/deps/winpty/src/agent/DsrSender.h +30 -0
- package/deps/winpty/src/agent/EventLoop.cc +99 -0
- package/deps/winpty/src/agent/EventLoop.h +47 -0
- package/deps/winpty/src/agent/InputMap.cc +246 -0
- package/deps/winpty/src/agent/InputMap.h +114 -0
- package/deps/winpty/src/agent/LargeConsoleRead.cc +71 -0
- package/deps/winpty/src/agent/LargeConsoleRead.h +68 -0
- package/deps/winpty/src/agent/NamedPipe.cc +378 -0
- package/deps/winpty/src/agent/NamedPipe.h +125 -0
- package/deps/winpty/src/agent/Scraper.cc +699 -0
- package/deps/winpty/src/agent/Scraper.h +103 -0
- package/deps/winpty/src/agent/SimplePool.h +75 -0
- package/deps/winpty/src/agent/SmallRect.h +143 -0
- package/deps/winpty/src/agent/Terminal.cc +535 -0
- package/deps/winpty/src/agent/Terminal.h +69 -0
- package/deps/winpty/src/agent/UnicodeEncoding.h +157 -0
- package/deps/winpty/src/agent/UnicodeEncodingTest.cc +189 -0
- package/deps/winpty/src/agent/Win32Console.cc +107 -0
- package/deps/winpty/src/agent/Win32Console.h +67 -0
- package/deps/winpty/src/agent/Win32ConsoleBuffer.cc +193 -0
- package/deps/winpty/src/agent/Win32ConsoleBuffer.h +99 -0
- package/deps/winpty/src/agent/main.cc +114 -0
- package/deps/winpty/src/agent/subdir.mk +61 -0
- package/deps/winpty/src/configurations.gypi +60 -0
- package/deps/winpty/src/debugserver/DebugServer.cc +117 -0
- package/deps/winpty/src/debugserver/subdir.mk +41 -0
- package/deps/winpty/src/include/winpty.h +242 -0
- package/deps/winpty/src/include/winpty_constants.h +131 -0
- package/deps/winpty/src/libwinpty/AgentLocation.cc +75 -0
- package/deps/winpty/src/libwinpty/AgentLocation.h +28 -0
- package/deps/winpty/src/libwinpty/LibWinptyException.h +54 -0
- package/deps/winpty/src/libwinpty/WinptyInternal.h +72 -0
- package/deps/winpty/src/libwinpty/subdir.mk +46 -0
- package/deps/winpty/src/libwinpty/winpty.cc +970 -0
- package/deps/winpty/src/shared/AgentMsg.h +38 -0
- package/deps/winpty/src/shared/BackgroundDesktop.cc +122 -0
- package/deps/winpty/src/shared/BackgroundDesktop.h +73 -0
- package/deps/winpty/src/shared/Buffer.cc +103 -0
- package/deps/winpty/src/shared/Buffer.h +102 -0
- package/deps/winpty/src/shared/DebugClient.cc +187 -0
- package/deps/winpty/src/shared/DebugClient.h +38 -0
- package/deps/winpty/src/shared/GenRandom.cc +138 -0
- package/deps/winpty/src/shared/GenRandom.h +55 -0
- package/deps/winpty/src/shared/GetCommitHash.bat +13 -0
- package/deps/winpty/src/shared/Mutex.h +54 -0
- package/deps/winpty/src/shared/OsModule.h +63 -0
- package/deps/winpty/src/shared/OwnedHandle.cc +36 -0
- package/deps/winpty/src/shared/OwnedHandle.h +45 -0
- package/deps/winpty/src/shared/PrecompiledHeader.h +43 -0
- package/deps/winpty/src/shared/StringBuilder.h +227 -0
- package/deps/winpty/src/shared/StringBuilderTest.cc +114 -0
- package/deps/winpty/src/shared/StringUtil.cc +55 -0
- package/deps/winpty/src/shared/StringUtil.h +80 -0
- package/deps/winpty/src/shared/TimeMeasurement.h +63 -0
- package/deps/winpty/src/shared/UnixCtrlChars.h +45 -0
- package/deps/winpty/src/shared/UpdateGenVersion.bat +20 -0
- package/deps/winpty/src/shared/WindowsSecurity.cc +460 -0
- package/deps/winpty/src/shared/WindowsSecurity.h +104 -0
- package/deps/winpty/src/shared/WindowsVersion.cc +252 -0
- package/deps/winpty/src/shared/WindowsVersion.h +29 -0
- package/deps/winpty/src/shared/WinptyAssert.cc +55 -0
- package/deps/winpty/src/shared/WinptyAssert.h +64 -0
- package/deps/winpty/src/shared/WinptyException.cc +57 -0
- package/deps/winpty/src/shared/WinptyException.h +43 -0
- package/deps/winpty/src/shared/WinptyVersion.cc +42 -0
- package/deps/winpty/src/shared/WinptyVersion.h +27 -0
- package/deps/winpty/src/shared/winpty_snprintf.h +99 -0
- package/deps/winpty/src/subdir.mk +5 -0
- package/deps/winpty/src/tests/subdir.mk +28 -0
- package/deps/winpty/src/tests/trivial_test.cc +158 -0
- package/deps/winpty/src/unix-adapter/InputHandler.cc +114 -0
- package/deps/winpty/src/unix-adapter/InputHandler.h +56 -0
- package/deps/winpty/src/unix-adapter/OutputHandler.cc +80 -0
- package/deps/winpty/src/unix-adapter/OutputHandler.h +53 -0
- package/deps/winpty/src/unix-adapter/Util.cc +86 -0
- package/deps/winpty/src/unix-adapter/Util.h +31 -0
- package/deps/winpty/src/unix-adapter/WakeupFd.cc +70 -0
- package/deps/winpty/src/unix-adapter/WakeupFd.h +42 -0
- package/deps/winpty/src/unix-adapter/main.cc +729 -0
- package/deps/winpty/src/unix-adapter/subdir.mk +41 -0
- package/deps/winpty/src/winpty.gyp +234 -0
- package/deps/winpty/vcbuild.bat +83 -0
- package/lib/conpty_console_list_agent.js +16 -0
- package/lib/conpty_console_list_agent.js.map +1 -0
- package/lib/eventEmitter2.js +47 -0
- package/lib/eventEmitter2.js.map +1 -0
- package/lib/eventEmitter2.test.js +30 -0
- package/lib/eventEmitter2.test.js.map +1 -0
- package/lib/index.js +52 -0
- package/lib/index.js.map +1 -0
- package/lib/interfaces.js +7 -0
- package/lib/interfaces.js.map +1 -0
- package/lib/shared/conout.js +11 -0
- package/lib/shared/conout.js.map +1 -0
- package/lib/terminal.js +190 -0
- package/lib/terminal.js.map +1 -0
- package/lib/terminal.test.js +139 -0
- package/lib/terminal.test.js.map +1 -0
- package/lib/testUtils.test.js +28 -0
- package/lib/testUtils.test.js.map +1 -0
- package/lib/types.js +7 -0
- package/lib/types.js.map +1 -0
- package/lib/unixTerminal.js +346 -0
- package/lib/unixTerminal.js.map +1 -0
- package/lib/unixTerminal.test.js +351 -0
- package/lib/unixTerminal.test.js.map +1 -0
- package/lib/utils.js +39 -0
- package/lib/utils.js.map +1 -0
- package/lib/windowsConoutConnection.js +125 -0
- package/lib/windowsConoutConnection.js.map +1 -0
- package/lib/windowsPtyAgent.js +320 -0
- package/lib/windowsPtyAgent.js.map +1 -0
- package/lib/windowsPtyAgent.test.js +90 -0
- package/lib/windowsPtyAgent.test.js.map +1 -0
- package/lib/windowsTerminal.js +199 -0
- package/lib/windowsTerminal.js.map +1 -0
- package/lib/windowsTerminal.test.js +219 -0
- package/lib/windowsTerminal.test.js.map +1 -0
- package/lib/worker/conoutSocketWorker.js +22 -0
- package/lib/worker/conoutSocketWorker.js.map +1 -0
- package/package.json +68 -0
- package/prebuilds/darwin-arm64/pty.node +0 -0
- package/prebuilds/darwin-arm64/spawn-helper +0 -0
- package/prebuilds/darwin-x64/pty.node +0 -0
- package/prebuilds/darwin-x64/spawn-helper +0 -0
- package/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/prebuilds/win32-arm64/conpty.node +0 -0
- package/prebuilds/win32-arm64/conpty.pdb +0 -0
- package/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
- package/prebuilds/win32-arm64/pty.node +0 -0
- package/prebuilds/win32-arm64/pty.pdb +0 -0
- package/prebuilds/win32-arm64/winpty-agent.exe +0 -0
- package/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
- package/prebuilds/win32-arm64/winpty.dll +0 -0
- package/prebuilds/win32-arm64/winpty.pdb +0 -0
- package/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/prebuilds/win32-x64/conpty.node +0 -0
- package/prebuilds/win32-x64/conpty.pdb +0 -0
- package/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
- package/prebuilds/win32-x64/pty.node +0 -0
- package/prebuilds/win32-x64/pty.pdb +0 -0
- package/prebuilds/win32-x64/winpty-agent.exe +0 -0
- package/prebuilds/win32-x64/winpty-agent.pdb +0 -0
- package/prebuilds/win32-x64/winpty.dll +0 -0
- package/prebuilds/win32-x64/winpty.pdb +0 -0
- package/scripts/gen-compile-commands.js +8 -0
- package/scripts/increment-version.js +54 -0
- package/scripts/post-install.js +99 -0
- package/scripts/prebuild.js +39 -0
- package/scripts/sync-prebuild.js +31 -0
- package/scripts/verify-darwin-fd-leak.js +63 -0
- package/src/conpty_console_list_agent.ts +15 -0
- package/src/eventEmitter2.test.ts +30 -0
- package/src/eventEmitter2.ts +48 -0
- package/src/index.ts +52 -0
- package/src/interfaces.ts +130 -0
- package/src/native.d.ts +54 -0
- package/src/shared/conout.ts +15 -0
- package/src/terminal.test.ts +119 -0
- package/src/terminal.ts +211 -0
- package/src/testUtils.test.ts +23 -0
- package/src/tsconfig.json +22 -0
- package/src/types.ts +15 -0
- package/src/unix/pty.cc +808 -0
- package/src/unix/spawn-helper.cc +23 -0
- package/src/unixTerminal.test.ts +367 -0
- package/src/unixTerminal.ts +388 -0
- package/src/utils.ts +29 -0
- package/src/win/conpty.cc +583 -0
- package/src/win/conpty.h +41 -0
- package/src/win/conpty_console_list.cc +44 -0
- package/src/win/path_util.cc +95 -0
- package/src/win/path_util.h +26 -0
- package/src/win/winpty.cc +333 -0
- package/src/windowsConoutConnection.ts +82 -0
- package/src/windowsPtyAgent.test.ts +94 -0
- package/src/windowsPtyAgent.ts +321 -0
- package/src/windowsTerminal.test.ts +229 -0
- package/src/windowsTerminal.ts +203 -0
- package/src/worker/conoutSocketWorker.ts +22 -0
- package/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
- package/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
- package/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
- package/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
- package/typings/node-pty.d.ts +211 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// Copyright (c) 2011-2016 Ryan Prichard
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to
|
|
5
|
+
// deal in the Software without restriction, including without limitation the
|
|
6
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
// IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
#include "Win32ConsoleBuffer.h"
|
|
22
|
+
|
|
23
|
+
#include <windows.h>
|
|
24
|
+
|
|
25
|
+
#include "../shared/DebugClient.h"
|
|
26
|
+
#include "../shared/StringBuilder.h"
|
|
27
|
+
#include "../shared/WinptyAssert.h"
|
|
28
|
+
|
|
29
|
+
std::unique_ptr<Win32ConsoleBuffer> Win32ConsoleBuffer::openStdout() {
|
|
30
|
+
return std::unique_ptr<Win32ConsoleBuffer>(
|
|
31
|
+
new Win32ConsoleBuffer(GetStdHandle(STD_OUTPUT_HANDLE), false));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
std::unique_ptr<Win32ConsoleBuffer> Win32ConsoleBuffer::openConout() {
|
|
35
|
+
const HANDLE conout = CreateFileW(L"CONOUT$",
|
|
36
|
+
GENERIC_READ | GENERIC_WRITE,
|
|
37
|
+
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
38
|
+
NULL, OPEN_EXISTING, 0, NULL);
|
|
39
|
+
ASSERT(conout != INVALID_HANDLE_VALUE);
|
|
40
|
+
return std::unique_ptr<Win32ConsoleBuffer>(
|
|
41
|
+
new Win32ConsoleBuffer(conout, true));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
std::unique_ptr<Win32ConsoleBuffer> Win32ConsoleBuffer::createErrorBuffer() {
|
|
45
|
+
SECURITY_ATTRIBUTES sa = {};
|
|
46
|
+
sa.nLength = sizeof(sa);
|
|
47
|
+
sa.bInheritHandle = TRUE;
|
|
48
|
+
const HANDLE conout =
|
|
49
|
+
CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,
|
|
50
|
+
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
51
|
+
&sa,
|
|
52
|
+
CONSOLE_TEXTMODE_BUFFER,
|
|
53
|
+
nullptr);
|
|
54
|
+
ASSERT(conout != INVALID_HANDLE_VALUE);
|
|
55
|
+
return std::unique_ptr<Win32ConsoleBuffer>(
|
|
56
|
+
new Win32ConsoleBuffer(conout, true));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
HANDLE Win32ConsoleBuffer::conout() {
|
|
60
|
+
return m_conout;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
void Win32ConsoleBuffer::clearLines(
|
|
64
|
+
int row,
|
|
65
|
+
int count,
|
|
66
|
+
const ConsoleScreenBufferInfo &info) {
|
|
67
|
+
// TODO: error handling
|
|
68
|
+
const int width = info.bufferSize().X;
|
|
69
|
+
DWORD actual = 0;
|
|
70
|
+
if (!FillConsoleOutputCharacterW(
|
|
71
|
+
m_conout, L' ', width * count, Coord(0, row),
|
|
72
|
+
&actual) || static_cast<int>(actual) != width * count) {
|
|
73
|
+
trace("FillConsoleOutputCharacterW failed");
|
|
74
|
+
}
|
|
75
|
+
if (!FillConsoleOutputAttribute(
|
|
76
|
+
m_conout, kDefaultAttributes, width * count, Coord(0, row),
|
|
77
|
+
&actual) || static_cast<int>(actual) != width * count) {
|
|
78
|
+
trace("FillConsoleOutputAttribute failed");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
void Win32ConsoleBuffer::clearAllLines(const ConsoleScreenBufferInfo &info) {
|
|
83
|
+
clearLines(0, info.bufferSize().Y, info);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
ConsoleScreenBufferInfo Win32ConsoleBuffer::bufferInfo() {
|
|
87
|
+
// TODO: error handling
|
|
88
|
+
ConsoleScreenBufferInfo info;
|
|
89
|
+
if (!GetConsoleScreenBufferInfo(m_conout, &info)) {
|
|
90
|
+
trace("GetConsoleScreenBufferInfo failed");
|
|
91
|
+
}
|
|
92
|
+
return info;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
Coord Win32ConsoleBuffer::bufferSize() {
|
|
96
|
+
return bufferInfo().bufferSize();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
SmallRect Win32ConsoleBuffer::windowRect() {
|
|
100
|
+
return bufferInfo().windowRect();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
bool Win32ConsoleBuffer::resizeBufferRange(const Coord &initialSize,
|
|
104
|
+
Coord &finalSize) {
|
|
105
|
+
if (SetConsoleScreenBufferSize(m_conout, initialSize)) {
|
|
106
|
+
finalSize = initialSize;
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
// The font might be too small to accommodate a very narrow console window.
|
|
110
|
+
// In that case, rather than simply give up, it's better to try wider
|
|
111
|
+
// buffer sizes until the call succeeds.
|
|
112
|
+
Coord size = initialSize;
|
|
113
|
+
while (size.X < 20) {
|
|
114
|
+
size.X++;
|
|
115
|
+
if (SetConsoleScreenBufferSize(m_conout, size)) {
|
|
116
|
+
finalSize = size;
|
|
117
|
+
trace("SetConsoleScreenBufferSize: initial size (%d,%d) failed, "
|
|
118
|
+
"but wider size (%d,%d) succeeded",
|
|
119
|
+
initialSize.X, initialSize.Y,
|
|
120
|
+
finalSize.X, finalSize.Y);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
trace("SetConsoleScreenBufferSize failed: "
|
|
125
|
+
"tried (%d,%d) through (%d,%d)",
|
|
126
|
+
initialSize.X, initialSize.Y,
|
|
127
|
+
size.X, size.Y);
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
void Win32ConsoleBuffer::resizeBuffer(const Coord &size) {
|
|
132
|
+
// TODO: error handling
|
|
133
|
+
if (!SetConsoleScreenBufferSize(m_conout, size)) {
|
|
134
|
+
trace("SetConsoleScreenBufferSize failed: size=(%d,%d)",
|
|
135
|
+
size.X, size.Y);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
void Win32ConsoleBuffer::moveWindow(const SmallRect &rect) {
|
|
140
|
+
// TODO: error handling
|
|
141
|
+
if (!SetConsoleWindowInfo(m_conout, TRUE, &rect)) {
|
|
142
|
+
trace("SetConsoleWindowInfo failed");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
Coord Win32ConsoleBuffer::cursorPosition() {
|
|
147
|
+
return bufferInfo().dwCursorPosition;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
void Win32ConsoleBuffer::setCursorPosition(const Coord &coord) {
|
|
151
|
+
// TODO: error handling
|
|
152
|
+
if (!SetConsoleCursorPosition(m_conout, coord)) {
|
|
153
|
+
trace("SetConsoleCursorPosition failed");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
void Win32ConsoleBuffer::read(const SmallRect &rect, CHAR_INFO *data) {
|
|
158
|
+
// TODO: error handling
|
|
159
|
+
SmallRect tmp(rect);
|
|
160
|
+
if (!ReadConsoleOutputW(m_conout, data, rect.size(), Coord(), &tmp) &&
|
|
161
|
+
isTracingEnabled()) {
|
|
162
|
+
StringBuilder sb(256);
|
|
163
|
+
auto outStruct = [&](const SMALL_RECT &sr) {
|
|
164
|
+
sb << "{L=" << sr.Left << ",T=" << sr.Top
|
|
165
|
+
<< ",R=" << sr.Right << ",B=" << sr.Bottom << '}';
|
|
166
|
+
};
|
|
167
|
+
sb << "Win32ConsoleBuffer::read: ReadConsoleOutput failed: readRegion=";
|
|
168
|
+
outStruct(rect);
|
|
169
|
+
CONSOLE_SCREEN_BUFFER_INFO info = {};
|
|
170
|
+
if (GetConsoleScreenBufferInfo(m_conout, &info)) {
|
|
171
|
+
sb << ", dwSize=(" << info.dwSize.X << ',' << info.dwSize.Y
|
|
172
|
+
<< "), srWindow=";
|
|
173
|
+
outStruct(info.srWindow);
|
|
174
|
+
} else {
|
|
175
|
+
sb << ", GetConsoleScreenBufferInfo also failed";
|
|
176
|
+
}
|
|
177
|
+
trace("%s", sb.c_str());
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
void Win32ConsoleBuffer::write(const SmallRect &rect, const CHAR_INFO *data) {
|
|
182
|
+
// TODO: error handling
|
|
183
|
+
SmallRect tmp(rect);
|
|
184
|
+
if (!WriteConsoleOutputW(m_conout, data, rect.size(), Coord(), &tmp)) {
|
|
185
|
+
trace("WriteConsoleOutput failed");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
void Win32ConsoleBuffer::setTextAttribute(WORD attributes) {
|
|
190
|
+
if (!SetConsoleTextAttribute(m_conout, attributes)) {
|
|
191
|
+
trace("SetConsoleTextAttribute failed");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// Copyright (c) 2011-2016 Ryan Prichard
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to
|
|
5
|
+
// deal in the Software without restriction, including without limitation the
|
|
6
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
// IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
#ifndef AGENT_WIN32_CONSOLE_BUFFER_H
|
|
22
|
+
#define AGENT_WIN32_CONSOLE_BUFFER_H
|
|
23
|
+
|
|
24
|
+
#include <windows.h>
|
|
25
|
+
|
|
26
|
+
#include <string.h>
|
|
27
|
+
|
|
28
|
+
#include <memory>
|
|
29
|
+
|
|
30
|
+
#include "Coord.h"
|
|
31
|
+
#include "SmallRect.h"
|
|
32
|
+
|
|
33
|
+
class ConsoleScreenBufferInfo : public CONSOLE_SCREEN_BUFFER_INFO {
|
|
34
|
+
public:
|
|
35
|
+
ConsoleScreenBufferInfo()
|
|
36
|
+
{
|
|
37
|
+
memset(this, 0, sizeof(*this));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
Coord bufferSize() const { return dwSize; }
|
|
41
|
+
SmallRect windowRect() const { return srWindow; }
|
|
42
|
+
Coord cursorPosition() const { return dwCursorPosition; }
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
class Win32ConsoleBuffer {
|
|
46
|
+
private:
|
|
47
|
+
Win32ConsoleBuffer(HANDLE conout, bool owned) :
|
|
48
|
+
m_conout(conout), m_owned(owned)
|
|
49
|
+
{
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public:
|
|
53
|
+
static const int kDefaultAttributes = 7;
|
|
54
|
+
|
|
55
|
+
~Win32ConsoleBuffer() {
|
|
56
|
+
if (m_owned) {
|
|
57
|
+
CloseHandle(m_conout);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static std::unique_ptr<Win32ConsoleBuffer> openStdout();
|
|
62
|
+
static std::unique_ptr<Win32ConsoleBuffer> openConout();
|
|
63
|
+
static std::unique_ptr<Win32ConsoleBuffer> createErrorBuffer();
|
|
64
|
+
|
|
65
|
+
Win32ConsoleBuffer(const Win32ConsoleBuffer &other) = delete;
|
|
66
|
+
Win32ConsoleBuffer &operator=(const Win32ConsoleBuffer &other) = delete;
|
|
67
|
+
|
|
68
|
+
HANDLE conout();
|
|
69
|
+
void clearLines(int row, int count, const ConsoleScreenBufferInfo &info);
|
|
70
|
+
void clearAllLines(const ConsoleScreenBufferInfo &info);
|
|
71
|
+
|
|
72
|
+
// Buffer and window sizes.
|
|
73
|
+
ConsoleScreenBufferInfo bufferInfo();
|
|
74
|
+
Coord bufferSize();
|
|
75
|
+
SmallRect windowRect();
|
|
76
|
+
void resizeBuffer(const Coord &size);
|
|
77
|
+
bool resizeBufferRange(const Coord &initialSize, Coord &finalSize);
|
|
78
|
+
bool resizeBufferRange(const Coord &initialSize) {
|
|
79
|
+
Coord dummy;
|
|
80
|
+
return resizeBufferRange(initialSize, dummy);
|
|
81
|
+
}
|
|
82
|
+
void moveWindow(const SmallRect &rect);
|
|
83
|
+
|
|
84
|
+
// Cursor.
|
|
85
|
+
Coord cursorPosition();
|
|
86
|
+
void setCursorPosition(const Coord &point);
|
|
87
|
+
|
|
88
|
+
// Screen content.
|
|
89
|
+
void read(const SmallRect &rect, CHAR_INFO *data);
|
|
90
|
+
void write(const SmallRect &rect, const CHAR_INFO *data);
|
|
91
|
+
|
|
92
|
+
void setTextAttribute(WORD attributes);
|
|
93
|
+
|
|
94
|
+
private:
|
|
95
|
+
HANDLE m_conout = nullptr;
|
|
96
|
+
bool m_owned = false;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
#endif // AGENT_WIN32_CONSOLE_BUFFER_H
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// Copyright (c) 2011-2015 Ryan Prichard
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to
|
|
5
|
+
// deal in the Software without restriction, including without limitation the
|
|
6
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
// IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
#include <stdio.h>
|
|
22
|
+
#include <stdlib.h>
|
|
23
|
+
#include <string.h>
|
|
24
|
+
#include <wchar.h>
|
|
25
|
+
|
|
26
|
+
#include "../shared/StringUtil.h"
|
|
27
|
+
#include "../shared/WindowsVersion.h"
|
|
28
|
+
#include "../shared/WinptyAssert.h"
|
|
29
|
+
#include "../shared/WinptyVersion.h"
|
|
30
|
+
|
|
31
|
+
#include "Agent.h"
|
|
32
|
+
#include "AgentCreateDesktop.h"
|
|
33
|
+
#include "DebugShowInput.h"
|
|
34
|
+
|
|
35
|
+
const char USAGE[] =
|
|
36
|
+
"Usage: %ls controlPipeName flags mouseMode cols rows\n"
|
|
37
|
+
"Usage: %ls controlPipeName --create-desktop\n"
|
|
38
|
+
"\n"
|
|
39
|
+
"Ordinarily, this program is launched by winpty.dll and is not directly\n"
|
|
40
|
+
"useful to winpty users. However, it also has options intended for\n"
|
|
41
|
+
"debugging winpty.\n"
|
|
42
|
+
"\n"
|
|
43
|
+
"Usage: %ls [options]\n"
|
|
44
|
+
"\n"
|
|
45
|
+
"Options:\n"
|
|
46
|
+
" --show-input [--with-mouse] [--escape-input]\n"
|
|
47
|
+
" Dump INPUT_RECORDs from the console input buffer\n"
|
|
48
|
+
" --with-mouse: Include MOUSE_INPUT_RECORDs in the dump\n"
|
|
49
|
+
" output\n"
|
|
50
|
+
" --escape-input: Direct the new Windows 10 console to use\n"
|
|
51
|
+
" escape sequences for input\n"
|
|
52
|
+
" --version Print the winpty version\n";
|
|
53
|
+
|
|
54
|
+
static uint64_t winpty_atoi64(const char *str) {
|
|
55
|
+
return strtoll(str, NULL, 10);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
int main() {
|
|
59
|
+
dumpWindowsVersion();
|
|
60
|
+
dumpVersionToTrace();
|
|
61
|
+
|
|
62
|
+
// Technically, we should free the CommandLineToArgvW return value using
|
|
63
|
+
// a single call to LocalFree, but the call will never actually happen in
|
|
64
|
+
// the normal case.
|
|
65
|
+
int argc = 0;
|
|
66
|
+
wchar_t *cmdline = GetCommandLineW();
|
|
67
|
+
ASSERT(cmdline != nullptr && "GetCommandLineW returned NULL");
|
|
68
|
+
wchar_t **argv = CommandLineToArgvW(cmdline, &argc);
|
|
69
|
+
ASSERT(argv != nullptr && "CommandLineToArgvW returned NULL");
|
|
70
|
+
|
|
71
|
+
if (argc == 2 && !wcscmp(argv[1], L"--version")) {
|
|
72
|
+
dumpVersionToStdout();
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (argc >= 2 && !wcscmp(argv[1], L"--show-input")) {
|
|
77
|
+
bool withMouse = false;
|
|
78
|
+
bool escapeInput = false;
|
|
79
|
+
for (int i = 2; i < argc; ++i) {
|
|
80
|
+
if (!wcscmp(argv[i], L"--with-mouse")) {
|
|
81
|
+
withMouse = true;
|
|
82
|
+
} else if (!wcscmp(argv[i], L"--escape-input")) {
|
|
83
|
+
escapeInput = true;
|
|
84
|
+
} else {
|
|
85
|
+
fprintf(stderr, "Unrecognized --show-input option: %ls\n",
|
|
86
|
+
argv[i]);
|
|
87
|
+
return 1;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
debugShowInput(withMouse, escapeInput);
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (argc == 3 && !wcscmp(argv[2], L"--create-desktop")) {
|
|
95
|
+
handleCreateDesktop(argv[1]);
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (argc != 6) {
|
|
100
|
+
fprintf(stderr, USAGE, argv[0], argv[0], argv[0]);
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
Agent agent(argv[1],
|
|
105
|
+
winpty_atoi64(utf8FromWide(argv[2]).c_str()),
|
|
106
|
+
atoi(utf8FromWide(argv[3]).c_str()),
|
|
107
|
+
atoi(utf8FromWide(argv[4]).c_str()),
|
|
108
|
+
atoi(utf8FromWide(argv[5]).c_str()));
|
|
109
|
+
agent.run();
|
|
110
|
+
|
|
111
|
+
// The Agent destructor shouldn't return, but if it does, exit
|
|
112
|
+
// unsuccessfully.
|
|
113
|
+
return 1;
|
|
114
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Copyright (c) 2011-2015 Ryan Prichard
|
|
2
|
+
#
|
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
# of this software and associated documentation files (the "Software"), to
|
|
5
|
+
# deal in the Software without restriction, including without limitation the
|
|
6
|
+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
# sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
# furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
|
11
|
+
# all copies or substantial portions of the Software.
|
|
12
|
+
#
|
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
# IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
ALL_TARGETS += build/winpty-agent.exe
|
|
22
|
+
|
|
23
|
+
$(eval $(call def_mingw_target,agent,-DWINPTY_AGENT_ASSERT))
|
|
24
|
+
|
|
25
|
+
AGENT_OBJECTS = \
|
|
26
|
+
build/agent/agent/Agent.o \
|
|
27
|
+
build/agent/agent/AgentCreateDesktop.o \
|
|
28
|
+
build/agent/agent/ConsoleFont.o \
|
|
29
|
+
build/agent/agent/ConsoleInput.o \
|
|
30
|
+
build/agent/agent/ConsoleInputReencoding.o \
|
|
31
|
+
build/agent/agent/ConsoleLine.o \
|
|
32
|
+
build/agent/agent/DebugShowInput.o \
|
|
33
|
+
build/agent/agent/DefaultInputMap.o \
|
|
34
|
+
build/agent/agent/EventLoop.o \
|
|
35
|
+
build/agent/agent/InputMap.o \
|
|
36
|
+
build/agent/agent/LargeConsoleRead.o \
|
|
37
|
+
build/agent/agent/NamedPipe.o \
|
|
38
|
+
build/agent/agent/Scraper.o \
|
|
39
|
+
build/agent/agent/Terminal.o \
|
|
40
|
+
build/agent/agent/Win32Console.o \
|
|
41
|
+
build/agent/agent/Win32ConsoleBuffer.o \
|
|
42
|
+
build/agent/agent/main.o \
|
|
43
|
+
build/agent/shared/BackgroundDesktop.o \
|
|
44
|
+
build/agent/shared/Buffer.o \
|
|
45
|
+
build/agent/shared/DebugClient.o \
|
|
46
|
+
build/agent/shared/GenRandom.o \
|
|
47
|
+
build/agent/shared/OwnedHandle.o \
|
|
48
|
+
build/agent/shared/StringUtil.o \
|
|
49
|
+
build/agent/shared/WindowsSecurity.o \
|
|
50
|
+
build/agent/shared/WindowsVersion.o \
|
|
51
|
+
build/agent/shared/WinptyAssert.o \
|
|
52
|
+
build/agent/shared/WinptyException.o \
|
|
53
|
+
build/agent/shared/WinptyVersion.o
|
|
54
|
+
|
|
55
|
+
build/agent/shared/WinptyVersion.o : build/gen/GenVersion.h
|
|
56
|
+
|
|
57
|
+
build/winpty-agent.exe : $(AGENT_OBJECTS)
|
|
58
|
+
$(info Linking $@)
|
|
59
|
+
@$(MINGW_CXX) $(MINGW_LDFLAGS) -o $@ $^
|
|
60
|
+
|
|
61
|
+
-include $(AGENT_OBJECTS:.o=.d)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# By default gyp/msbuild build for 32-bit Windows. This gyp include file
|
|
2
|
+
# defines configurations for both 32-bit and 64-bit Windows. To use it, run:
|
|
3
|
+
#
|
|
4
|
+
# C:\...\winpty\src>gyp -I configurations.gypi
|
|
5
|
+
#
|
|
6
|
+
# This command generates Visual Studio project files with a Release
|
|
7
|
+
# configuration and two Platforms--Win32 and x64. Both can be built:
|
|
8
|
+
#
|
|
9
|
+
# C:\...\winpty\src>msbuild winpty.sln /p:Platform=Win32
|
|
10
|
+
# C:\...\winpty\src>msbuild winpty.sln /p:Platform=x64
|
|
11
|
+
#
|
|
12
|
+
# The output is placed in:
|
|
13
|
+
#
|
|
14
|
+
# C:\...\winpty\src\Release\Win32
|
|
15
|
+
# C:\...\winpty\src\Release\x64
|
|
16
|
+
#
|
|
17
|
+
# Windows XP note: By default, the project files will use the default "toolset"
|
|
18
|
+
# for the given MSVC version. For MSVC 2013 and MSVC 2015, the default toolset
|
|
19
|
+
# generates binaries that do not run on Windows XP. To target Windows XP,
|
|
20
|
+
# select the XP-specific toolset by passing
|
|
21
|
+
# -D WINPTY_MSBUILD_TOOLSET={v120_xp,v140_xp} to gyp (v120_xp == MSVC 2013,
|
|
22
|
+
# v140_xp == MSVC 2015). Unfortunately, it isn't possible to have a single
|
|
23
|
+
# project file with configurations for both XP and post-XP. This seems to be a
|
|
24
|
+
# limitation of the MSVC project file format.
|
|
25
|
+
#
|
|
26
|
+
# This file is not included by default, because I suspect it would interfere
|
|
27
|
+
# with node-gyp, which has a different system for building 32-vs-64-bit
|
|
28
|
+
# binaries. It uses a common.gypi, and the project files it generates can only
|
|
29
|
+
# build a single architecture, the output paths are not differentiated by
|
|
30
|
+
# architecture.
|
|
31
|
+
|
|
32
|
+
{
|
|
33
|
+
'variables': {
|
|
34
|
+
'WINPTY_MSBUILD_TOOLSET%': '',
|
|
35
|
+
},
|
|
36
|
+
'target_defaults': {
|
|
37
|
+
'default_configuration': 'Release_Win32',
|
|
38
|
+
'configurations': {
|
|
39
|
+
'Release_Win32': {
|
|
40
|
+
'msvs_configuration_platform': 'Win32',
|
|
41
|
+
},
|
|
42
|
+
'Release_x64': {
|
|
43
|
+
'msvs_configuration_platform': 'x64',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
'msvs_configuration_attributes': {
|
|
47
|
+
'OutputDirectory': '$(SolutionDir)$(ConfigurationName)\\$(Platform)',
|
|
48
|
+
'IntermediateDirectory': '$(ConfigurationName)\\$(Platform)\\obj\\$(ProjectName)',
|
|
49
|
+
},
|
|
50
|
+
'msvs_settings': {
|
|
51
|
+
'VCLinkerTool': {
|
|
52
|
+
'SubSystem': '1', # /SUBSYSTEM:CONSOLE
|
|
53
|
+
},
|
|
54
|
+
'VCCLCompilerTool': {
|
|
55
|
+
'RuntimeLibrary': '0', # MultiThreaded (/MT)
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
'msbuild_toolset' : '<(WINPTY_MSBUILD_TOOLSET)',
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Copyright (c) 2015 Ryan Prichard
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to
|
|
5
|
+
// deal in the Software without restriction, including without limitation the
|
|
6
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
// IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
#include <cstdio>
|
|
22
|
+
#include <cstdlib>
|
|
23
|
+
|
|
24
|
+
#include <windows.h>
|
|
25
|
+
|
|
26
|
+
#include "../shared/WindowsSecurity.h"
|
|
27
|
+
#include "../shared/WinptyException.h"
|
|
28
|
+
|
|
29
|
+
const wchar_t *kPipeName = L"\\\\.\\pipe\\DebugServer";
|
|
30
|
+
|
|
31
|
+
// A message may not be larger than this size.
|
|
32
|
+
const int MSG_SIZE = 4096;
|
|
33
|
+
|
|
34
|
+
static void usage(const char *program, int code) {
|
|
35
|
+
printf("Usage: %s [--everyone]\n"
|
|
36
|
+
"\n"
|
|
37
|
+
"Creates the named pipe %ls and reads messages. Prints each\n"
|
|
38
|
+
"message to stdout. By default, only the current user can send messages.\n"
|
|
39
|
+
"Pass --everyone to let anyone send a message.\n"
|
|
40
|
+
"\n"
|
|
41
|
+
"Use the WINPTY_DEBUG environment variable to enable winpty trace output.\n"
|
|
42
|
+
"(e.g. WINPTY_DEBUG=trace for the default trace output.) Set WINPTYDBG=1\n"
|
|
43
|
+
"to enable trace with older winpty versions.\n",
|
|
44
|
+
program, kPipeName);
|
|
45
|
+
exit(code);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
int main(int argc, char *argv[]) {
|
|
49
|
+
bool everyone = false;
|
|
50
|
+
for (int i = 1; i < argc; ++i) {
|
|
51
|
+
std::string arg = argv[i];
|
|
52
|
+
if (arg == "--everyone") {
|
|
53
|
+
everyone = true;
|
|
54
|
+
} else if (arg == "-h" || arg == "--help") {
|
|
55
|
+
usage(argv[0], 0);
|
|
56
|
+
} else {
|
|
57
|
+
usage(argv[0], 1);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
SecurityDescriptor sd;
|
|
62
|
+
PSECURITY_ATTRIBUTES psa = nullptr;
|
|
63
|
+
SECURITY_ATTRIBUTES sa = {};
|
|
64
|
+
if (everyone) {
|
|
65
|
+
try {
|
|
66
|
+
sd = createPipeSecurityDescriptorOwnerFullControlEveryoneWrite();
|
|
67
|
+
} catch (const WinptyException &e) {
|
|
68
|
+
fprintf(stderr,
|
|
69
|
+
"error creating security descriptor: %ls\n", e.what());
|
|
70
|
+
exit(1);
|
|
71
|
+
}
|
|
72
|
+
sa.nLength = sizeof(sa);
|
|
73
|
+
sa.lpSecurityDescriptor = sd.get();
|
|
74
|
+
psa = &sa;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
HANDLE serverPipe = CreateNamedPipeW(
|
|
78
|
+
kPipeName,
|
|
79
|
+
/*dwOpenMode=*/PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE,
|
|
80
|
+
/*dwPipeMode=*/PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE |
|
|
81
|
+
rejectRemoteClientsPipeFlag(),
|
|
82
|
+
/*nMaxInstances=*/1,
|
|
83
|
+
/*nOutBufferSize=*/MSG_SIZE,
|
|
84
|
+
/*nInBufferSize=*/MSG_SIZE,
|
|
85
|
+
/*nDefaultTimeOut=*/10 * 1000,
|
|
86
|
+
psa);
|
|
87
|
+
|
|
88
|
+
if (serverPipe == INVALID_HANDLE_VALUE) {
|
|
89
|
+
fprintf(stderr, "error: could not create %ls pipe: error %u\n",
|
|
90
|
+
kPipeName, static_cast<unsigned>(GetLastError()));
|
|
91
|
+
exit(1);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
char msgBuffer[MSG_SIZE + 1];
|
|
95
|
+
|
|
96
|
+
while (true) {
|
|
97
|
+
if (!ConnectNamedPipe(serverPipe, nullptr)) {
|
|
98
|
+
fprintf(stderr, "error: ConnectNamedPipe failed\n");
|
|
99
|
+
fflush(stderr);
|
|
100
|
+
exit(1);
|
|
101
|
+
}
|
|
102
|
+
DWORD bytesRead = 0;
|
|
103
|
+
if (!ReadFile(serverPipe, msgBuffer, MSG_SIZE, &bytesRead, nullptr)) {
|
|
104
|
+
fprintf(stderr, "error: ReadFile on pipe failed\n");
|
|
105
|
+
fflush(stderr);
|
|
106
|
+
DisconnectNamedPipe(serverPipe);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
msgBuffer[bytesRead] = '\n';
|
|
110
|
+
fwrite(msgBuffer, 1, bytesRead + 1, stdout);
|
|
111
|
+
fflush(stdout);
|
|
112
|
+
|
|
113
|
+
DWORD bytesWritten = 0;
|
|
114
|
+
WriteFile(serverPipe, "OK", 2, &bytesWritten, nullptr);
|
|
115
|
+
DisconnectNamedPipe(serverPipe);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Copyright (c) 2015 Ryan Prichard
|
|
2
|
+
#
|
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
# of this software and associated documentation files (the "Software"), to
|
|
5
|
+
# deal in the Software without restriction, including without limitation the
|
|
6
|
+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
# sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
# furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
|
11
|
+
# all copies or substantial portions of the Software.
|
|
12
|
+
#
|
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
# IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
ALL_TARGETS += build/winpty-debugserver.exe
|
|
22
|
+
|
|
23
|
+
$(eval $(call def_mingw_target,debugserver,))
|
|
24
|
+
|
|
25
|
+
DEBUGSERVER_OBJECTS = \
|
|
26
|
+
build/debugserver/debugserver/DebugServer.o \
|
|
27
|
+
build/debugserver/shared/DebugClient.o \
|
|
28
|
+
build/debugserver/shared/OwnedHandle.o \
|
|
29
|
+
build/debugserver/shared/StringUtil.o \
|
|
30
|
+
build/debugserver/shared/WindowsSecurity.o \
|
|
31
|
+
build/debugserver/shared/WindowsVersion.o \
|
|
32
|
+
build/debugserver/shared/WinptyAssert.o \
|
|
33
|
+
build/debugserver/shared/WinptyException.o
|
|
34
|
+
|
|
35
|
+
build/debugserver/shared/WindowsVersion.o : build/gen/GenVersion.h
|
|
36
|
+
|
|
37
|
+
build/winpty-debugserver.exe : $(DEBUGSERVER_OBJECTS)
|
|
38
|
+
$(info Linking $@)
|
|
39
|
+
@$(MINGW_CXX) $(MINGW_LDFLAGS) -o $@ $^
|
|
40
|
+
|
|
41
|
+
-include $(DEBUGSERVER_OBJECTS:.o=.d)
|