@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,122 @@
|
|
|
1
|
+
//
|
|
2
|
+
// 2015-09-25
|
|
3
|
+
// I measured these limits on the size of a single ReadConsoleOutputW call.
|
|
4
|
+
// The limit seems to more-or-less disppear with Windows 8, which is the first
|
|
5
|
+
// OS to stop using ALPCs for console I/O. My guess is that the new I/O
|
|
6
|
+
// method does not use the 64KiB shared memory buffer that the ALPC method
|
|
7
|
+
// uses.
|
|
8
|
+
//
|
|
9
|
+
// I'm guessing the remaining difference between Windows 8/8.1 and Windows 10
|
|
10
|
+
// might be related to the 32-vs-64-bitness.
|
|
11
|
+
//
|
|
12
|
+
// Client OSs
|
|
13
|
+
//
|
|
14
|
+
// Windows XP 32-bit VM ==> up to 13304 characters
|
|
15
|
+
// - 13304x1 works, but 13305x1 fails instantly
|
|
16
|
+
// Windows 7 32-bit VM ==> between 16-17 thousand characters
|
|
17
|
+
// - 16000x1 works, 17000x1 fails instantly
|
|
18
|
+
// - 163x100 *crashes* conhost.exe but leaves VeryLargeRead.exe running
|
|
19
|
+
// Windows 8 32-bit VM ==> between 240-250 million characters
|
|
20
|
+
// - 10000x24000 works, but 10000x25000 does not
|
|
21
|
+
// Windows 8.1 32-bit VM ==> between 240-250 million characters
|
|
22
|
+
// - 10000x24000 works, but 10000x25000 does not
|
|
23
|
+
// Windows 10 64-bit VM ==> no limit (tested to 576 million characters)
|
|
24
|
+
// - 24000x24000 works
|
|
25
|
+
// - `ver` reports [Version 10.0.10240], conhost.exe and ConhostV1.dll are
|
|
26
|
+
// 10.0.10240.16384 for file and product version. ConhostV2.dll is
|
|
27
|
+
// 10.0.10240.16391 for file and product version.
|
|
28
|
+
//
|
|
29
|
+
// Server OSs
|
|
30
|
+
//
|
|
31
|
+
// Windows Server 2008 64-bit VM ==> 14300-14400 characters
|
|
32
|
+
// - 14300x1 works, 14400x1 fails instantly
|
|
33
|
+
// - This OS does not have conhost.exe.
|
|
34
|
+
// - `ver` reports [Version 6.0.6002]
|
|
35
|
+
// Windows Server 2008 R2 64-bit VM ==> 15600-15700 characters
|
|
36
|
+
// - 15600x1 works, 15700x1 fails instantly
|
|
37
|
+
// - This OS has conhost.exe, and procexp.exe reveals console ALPC ports in
|
|
38
|
+
// use in conhost.exe.
|
|
39
|
+
// - `ver` reports [Version 6.1.7601], conhost.exe is 6.1.7601.23153 for file
|
|
40
|
+
// and product version.
|
|
41
|
+
// Windows Server 2012 64-bit VM ==> at least 100 million characters
|
|
42
|
+
// - 10000x10000 works (VM had only 1GiB of RAM, so I skipped larger tests)
|
|
43
|
+
// - This OS has Windows 8's task manager and procexp.exe reveals the same
|
|
44
|
+
// lack of ALPC ports and the same \Device\ConDrv\* files as Windows 8.
|
|
45
|
+
// - `ver` reports [Version 6.2.9200], conhost.exe is 6.2.9200.16579 for file
|
|
46
|
+
// and product version.
|
|
47
|
+
//
|
|
48
|
+
// To summarize:
|
|
49
|
+
//
|
|
50
|
+
// client-OS server-OS notes
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// XP Server 2008 CSRSS, small reads
|
|
53
|
+
// 7 Server 2008 R2 ALPC-to-conhost, small reads
|
|
54
|
+
// 8, 8.1 Server 2012 new I/O interface, large reads allowed
|
|
55
|
+
// 10 <no server OS yet> enhanced console w/rewrapping
|
|
56
|
+
//
|
|
57
|
+
// (Presumably, Win2K, Vista, and Win2K3 behave the same as XP. conhost.exe
|
|
58
|
+
// was announced as a Win7 feature.)
|
|
59
|
+
//
|
|
60
|
+
|
|
61
|
+
#include <windows.h>
|
|
62
|
+
#include <assert.h>
|
|
63
|
+
#include <vector>
|
|
64
|
+
|
|
65
|
+
#include "TestUtil.cc"
|
|
66
|
+
|
|
67
|
+
int main(int argc, char *argv[]) {
|
|
68
|
+
long long width = 9000;
|
|
69
|
+
long long height = 9000;
|
|
70
|
+
|
|
71
|
+
assert(argc >= 1);
|
|
72
|
+
if (argc == 4) {
|
|
73
|
+
width = atoi(argv[2]);
|
|
74
|
+
height = atoi(argv[3]);
|
|
75
|
+
} else {
|
|
76
|
+
if (argc == 3) {
|
|
77
|
+
width = atoi(argv[1]);
|
|
78
|
+
height = atoi(argv[2]);
|
|
79
|
+
}
|
|
80
|
+
wchar_t args[1024];
|
|
81
|
+
swprintf(args, 1024, L"CHILD %lld %lld", width, height);
|
|
82
|
+
startChildProcess(args);
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const HANDLE conout = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
87
|
+
|
|
88
|
+
setWindowPos(0, 0, 1, 1);
|
|
89
|
+
setBufferSize(width, height);
|
|
90
|
+
setWindowPos(0, 0, std::min(80LL, width), std::min(50LL, height));
|
|
91
|
+
|
|
92
|
+
setCursorPos(0, 0);
|
|
93
|
+
printf("A");
|
|
94
|
+
fflush(stdout);
|
|
95
|
+
setCursorPos(width - 2, height - 1);
|
|
96
|
+
printf("B");
|
|
97
|
+
fflush(stdout);
|
|
98
|
+
|
|
99
|
+
trace("sizeof(CHAR_INFO) = %d", (int)sizeof(CHAR_INFO));
|
|
100
|
+
|
|
101
|
+
trace("Allocating buffer...");
|
|
102
|
+
CHAR_INFO *buffer = new CHAR_INFO[width * height];
|
|
103
|
+
assert(buffer != NULL);
|
|
104
|
+
memset(&buffer[0], 0, sizeof(CHAR_INFO));
|
|
105
|
+
memset(&buffer[width * height - 2], 0, sizeof(CHAR_INFO));
|
|
106
|
+
|
|
107
|
+
COORD bufSize = { width, height };
|
|
108
|
+
COORD bufCoord = { 0, 0 };
|
|
109
|
+
SMALL_RECT readRegion = { 0, 0, width - 1, height - 1 };
|
|
110
|
+
trace("ReadConsoleOutputW: calling...");
|
|
111
|
+
BOOL success = ReadConsoleOutputW(conout, buffer, bufSize, bufCoord, &readRegion);
|
|
112
|
+
trace("ReadConsoleOutputW: success=%d", success);
|
|
113
|
+
|
|
114
|
+
assert(buffer[0].Char.UnicodeChar == L'A');
|
|
115
|
+
assert(buffer[width * height - 2].Char.UnicodeChar == L'B');
|
|
116
|
+
trace("Top-left and bottom-right characters read successfully!");
|
|
117
|
+
|
|
118
|
+
Sleep(30000);
|
|
119
|
+
|
|
120
|
+
delete [] buffer;
|
|
121
|
+
return 0;
|
|
122
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Sending VK_PAUSE to the console window almost works as a mechanism for
|
|
3
|
+
* pausing it, but it doesn't because the console could turn off the
|
|
4
|
+
* ENABLE_LINE_INPUT console mode flag.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#define _WIN32_WINNT 0x0501
|
|
8
|
+
#include <stdio.h>
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
#include <windows.h>
|
|
11
|
+
|
|
12
|
+
CALLBACK DWORD pausingThread(LPVOID dummy)
|
|
13
|
+
{
|
|
14
|
+
if (1) {
|
|
15
|
+
Sleep(1000);
|
|
16
|
+
HWND hwnd = GetConsoleWindow();
|
|
17
|
+
SendMessage(hwnd, WM_KEYDOWN, VK_PAUSE, 1);
|
|
18
|
+
Sleep(1000);
|
|
19
|
+
SendMessage(hwnd, WM_KEYDOWN, VK_ESCAPE, 1);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (0) {
|
|
23
|
+
INPUT_RECORD ir;
|
|
24
|
+
memset(&ir, 0, sizeof(ir));
|
|
25
|
+
ir.EventType = KEY_EVENT;
|
|
26
|
+
ir.Event.KeyEvent.bKeyDown = TRUE;
|
|
27
|
+
ir.Event.KeyEvent.wVirtualKeyCode = VK_PAUSE;
|
|
28
|
+
ir.Event.KeyEvent.wRepeatCount = 1;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
int main()
|
|
35
|
+
{
|
|
36
|
+
HANDLE hin = GetStdHandle(STD_INPUT_HANDLE);
|
|
37
|
+
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
38
|
+
COORD c = { 0, 0 };
|
|
39
|
+
|
|
40
|
+
DWORD mode;
|
|
41
|
+
GetConsoleMode(hin, &mode);
|
|
42
|
+
SetConsoleMode(hin, mode &
|
|
43
|
+
~(ENABLE_LINE_INPUT));
|
|
44
|
+
|
|
45
|
+
CreateThread(NULL, 0,
|
|
46
|
+
pausingThread, NULL,
|
|
47
|
+
0, NULL);
|
|
48
|
+
|
|
49
|
+
int i = 0;
|
|
50
|
+
while (true) {
|
|
51
|
+
Sleep(100);
|
|
52
|
+
printf("%d\n", ++i);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Demonstrates a conhost hang that occurs when widening the console buffer
|
|
3
|
+
* while selection is in progress. The problem affects the new Windows 10
|
|
4
|
+
* console, not the "legacy" console mode that Windows 10 also includes.
|
|
5
|
+
*
|
|
6
|
+
* First tested with:
|
|
7
|
+
* - Windows 10.0.10240
|
|
8
|
+
* - conhost.exe version 10.0.10240.16384
|
|
9
|
+
* - ConhostV1.dll version 10.0.10240.16384
|
|
10
|
+
* - ConhostV2.dll version 10.0.10240.16391
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
#include <windows.h>
|
|
14
|
+
#include <stdio.h>
|
|
15
|
+
#include <stdlib.h>
|
|
16
|
+
#include <wchar.h>
|
|
17
|
+
|
|
18
|
+
#include "TestUtil.cc"
|
|
19
|
+
|
|
20
|
+
const int SC_CONSOLE_MARK = 0xFFF2;
|
|
21
|
+
const int SC_CONSOLE_SELECT_ALL = 0xFFF5;
|
|
22
|
+
|
|
23
|
+
int main(int argc, char *argv[]) {
|
|
24
|
+
if (argc == 1) {
|
|
25
|
+
startChildProcess(L"CHILD");
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
setWindowPos(0, 0, 1, 1);
|
|
30
|
+
setBufferSize(80, 25);
|
|
31
|
+
setWindowPos(0, 0, 80, 25);
|
|
32
|
+
|
|
33
|
+
countDown(5);
|
|
34
|
+
|
|
35
|
+
SendMessage(GetConsoleWindow(), WM_SYSCOMMAND, SC_CONSOLE_SELECT_ALL, 0);
|
|
36
|
+
Sleep(2000);
|
|
37
|
+
|
|
38
|
+
// This API call does not return. In the console window, the "Select All"
|
|
39
|
+
// operation appears to end. The console window becomes non-responsive,
|
|
40
|
+
// and the conhost.exe process must be killed from the Task Manager.
|
|
41
|
+
// (Killing this test program or closing the console window is not
|
|
42
|
+
// sufficient.)
|
|
43
|
+
//
|
|
44
|
+
// The same hang occurs whether line resizing is off or on. It happens
|
|
45
|
+
// with both "Mark" and "Select All". Calling setBufferSize with the
|
|
46
|
+
// existing buffer size does not hang, but calling it with only a changed
|
|
47
|
+
// buffer height *does* hang. Calling setWindowPos does not hang.
|
|
48
|
+
setBufferSize(120, 25);
|
|
49
|
+
|
|
50
|
+
printf("Done...\n");
|
|
51
|
+
Sleep(2000);
|
|
52
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Demonstrates some wrapping behaviors of the new Windows 10 console.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
#include <windows.h>
|
|
6
|
+
#include <stdio.h>
|
|
7
|
+
#include <stdlib.h>
|
|
8
|
+
|
|
9
|
+
#include "TestUtil.cc"
|
|
10
|
+
|
|
11
|
+
int main(int argc, char *argv[]) {
|
|
12
|
+
if (argc == 1) {
|
|
13
|
+
startChildProcess(L"CHILD");
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
setWindowPos(0, 0, 1, 1);
|
|
18
|
+
setBufferSize(40, 20);
|
|
19
|
+
setWindowPos(0, 0, 40, 20);
|
|
20
|
+
|
|
21
|
+
system("cls");
|
|
22
|
+
|
|
23
|
+
repeatChar(39, 'A'); repeatChar(1, ' ');
|
|
24
|
+
repeatChar(39, 'B'); repeatChar(1, ' ');
|
|
25
|
+
printf("\n");
|
|
26
|
+
|
|
27
|
+
repeatChar(39, 'C'); repeatChar(1, ' ');
|
|
28
|
+
repeatChar(39, 'D'); repeatChar(1, ' ');
|
|
29
|
+
printf("\n");
|
|
30
|
+
|
|
31
|
+
repeatChar(40, 'E');
|
|
32
|
+
repeatChar(40, 'F');
|
|
33
|
+
printf("\n");
|
|
34
|
+
|
|
35
|
+
repeatChar(39, 'G'); repeatChar(1, ' ');
|
|
36
|
+
repeatChar(39, 'H'); repeatChar(1, ' ');
|
|
37
|
+
printf("\n");
|
|
38
|
+
|
|
39
|
+
Sleep(2000);
|
|
40
|
+
|
|
41
|
+
setChar(39, 0, '*', 0x24);
|
|
42
|
+
setChar(39, 1, '*', 0x24);
|
|
43
|
+
|
|
44
|
+
setChar(39, 3, ' ', 0x24);
|
|
45
|
+
setChar(39, 4, ' ', 0x24);
|
|
46
|
+
|
|
47
|
+
setChar(38, 6, ' ', 0x24);
|
|
48
|
+
setChar(38, 7, ' ', 0x24);
|
|
49
|
+
|
|
50
|
+
Sleep(2000);
|
|
51
|
+
setWindowPos(0, 0, 35, 20);
|
|
52
|
+
setBufferSize(35, 20);
|
|
53
|
+
trace("DONE");
|
|
54
|
+
|
|
55
|
+
printf("Sleeping forever...\n");
|
|
56
|
+
while(true) { Sleep(1000); }
|
|
57
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#include <windows.h>
|
|
2
|
+
|
|
3
|
+
#include "TestUtil.cc"
|
|
4
|
+
|
|
5
|
+
int main(int argc, char *argv[]) {
|
|
6
|
+
if (argc == 1) {
|
|
7
|
+
startChildProcess(L"CHILD");
|
|
8
|
+
return 0;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const int WIDTH = 25;
|
|
12
|
+
|
|
13
|
+
setWindowPos(0, 0, 1, 1);
|
|
14
|
+
setBufferSize(WIDTH, 40);
|
|
15
|
+
setWindowPos(0, 0, WIDTH, 20);
|
|
16
|
+
|
|
17
|
+
system("cls");
|
|
18
|
+
|
|
19
|
+
for (int i = 0; i < 100; ++i) {
|
|
20
|
+
printf("FOO(%d)\n", i);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
repeatChar(5, '\n');
|
|
24
|
+
repeatChar(WIDTH * 5, '.');
|
|
25
|
+
repeatChar(10, '\n');
|
|
26
|
+
setWindowPos(0, 20, WIDTH, 20);
|
|
27
|
+
writeBox(0, 5, 1, 10, '|');
|
|
28
|
+
|
|
29
|
+
Sleep(120000);
|
|
30
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A Win32 program that reads raw console input with ReadFile and echos
|
|
3
|
+
* it to stdout.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#include <stdio.h>
|
|
7
|
+
#include <conio.h>
|
|
8
|
+
#include <windows.h>
|
|
9
|
+
|
|
10
|
+
int main()
|
|
11
|
+
{
|
|
12
|
+
int count = 0;
|
|
13
|
+
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
|
|
14
|
+
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
15
|
+
SetConsoleMode(hStdIn, 0);
|
|
16
|
+
|
|
17
|
+
while (true) {
|
|
18
|
+
DWORD actual;
|
|
19
|
+
char ch;
|
|
20
|
+
ReadFile(hStdIn, &ch, 1, &actual, NULL);
|
|
21
|
+
printf("%02x ", ch);
|
|
22
|
+
if (++count == 50)
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A Win32 program that reads raw console input with getch and echos
|
|
3
|
+
* it to stdout.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#include <stdio.h>
|
|
7
|
+
#include <conio.h>
|
|
8
|
+
|
|
9
|
+
int main()
|
|
10
|
+
{
|
|
11
|
+
int count = 0;
|
|
12
|
+
while (true) {
|
|
13
|
+
int ch = getch();
|
|
14
|
+
printf("%02x ", ch);
|
|
15
|
+
if (++count == 50)
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#define _WIN32_WINNT 0x0501
|
|
2
|
+
#include "../src/shared/DebugClient.cc"
|
|
3
|
+
#include <windows.h>
|
|
4
|
+
#include <stdio.h>
|
|
5
|
+
|
|
6
|
+
const int SC_CONSOLE_MARK = 0xFFF2;
|
|
7
|
+
|
|
8
|
+
CALLBACK DWORD writerThread(void*)
|
|
9
|
+
{
|
|
10
|
+
while (true) {
|
|
11
|
+
Sleep(1000);
|
|
12
|
+
trace("writing");
|
|
13
|
+
printf("X\n");
|
|
14
|
+
trace("written");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
int main()
|
|
19
|
+
{
|
|
20
|
+
CreateThread(NULL, 0, writerThread, NULL, 0, NULL);
|
|
21
|
+
trace("marking console");
|
|
22
|
+
HWND hwnd = GetConsoleWindow();
|
|
23
|
+
PostMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_MARK, 0);
|
|
24
|
+
|
|
25
|
+
Sleep(2000);
|
|
26
|
+
|
|
27
|
+
trace("reading output");
|
|
28
|
+
CHAR_INFO buf[1];
|
|
29
|
+
COORD bufSize = { 1, 1 };
|
|
30
|
+
COORD zeroCoord = { 0, 0 };
|
|
31
|
+
SMALL_RECT readRect = { 0, 0, 0, 0 };
|
|
32
|
+
ReadConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE),
|
|
33
|
+
buf,
|
|
34
|
+
bufSize,
|
|
35
|
+
zeroCoord,
|
|
36
|
+
&readRect);
|
|
37
|
+
trace("done reading output");
|
|
38
|
+
|
|
39
|
+
Sleep(2000);
|
|
40
|
+
|
|
41
|
+
PostMessage(hwnd, WM_CHAR, 27, 0x00010001);
|
|
42
|
+
|
|
43
|
+
Sleep(1100);
|
|
44
|
+
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This test demonstrates that putting a console into selection mode does not
|
|
3
|
+
* block the low-level console APIs, even though it blocks WriteFile.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#define _WIN32_WINNT 0x0501
|
|
7
|
+
#include "../src/shared/DebugClient.cc"
|
|
8
|
+
#include <windows.h>
|
|
9
|
+
#include <stdio.h>
|
|
10
|
+
|
|
11
|
+
const int SC_CONSOLE_MARK = 0xFFF2;
|
|
12
|
+
|
|
13
|
+
CALLBACK DWORD writerThread(void*)
|
|
14
|
+
{
|
|
15
|
+
CHAR_INFO xChar, fillChar;
|
|
16
|
+
memset(&xChar, 0, sizeof(xChar));
|
|
17
|
+
xChar.Char.AsciiChar = 'X';
|
|
18
|
+
xChar.Attributes = 7;
|
|
19
|
+
memset(&fillChar, 0, sizeof(fillChar));
|
|
20
|
+
fillChar.Char.AsciiChar = ' ';
|
|
21
|
+
fillChar.Attributes = 7;
|
|
22
|
+
COORD oneCoord = { 1, 1 };
|
|
23
|
+
COORD zeroCoord = { 0, 0 };
|
|
24
|
+
|
|
25
|
+
while (true) {
|
|
26
|
+
SMALL_RECT writeRegion = { 5, 5, 5, 5 };
|
|
27
|
+
WriteConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE),
|
|
28
|
+
&xChar, oneCoord,
|
|
29
|
+
zeroCoord,
|
|
30
|
+
&writeRegion);
|
|
31
|
+
Sleep(500);
|
|
32
|
+
SMALL_RECT scrollRect = { 1, 1, 20, 20 };
|
|
33
|
+
COORD destCoord = { 0, 0 };
|
|
34
|
+
ScrollConsoleScreenBuffer(GetStdHandle(STD_OUTPUT_HANDLE),
|
|
35
|
+
&scrollRect,
|
|
36
|
+
NULL,
|
|
37
|
+
destCoord,
|
|
38
|
+
&fillChar);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
int main()
|
|
43
|
+
{
|
|
44
|
+
CreateThread(NULL, 0, writerThread, NULL, 0, NULL);
|
|
45
|
+
trace("marking console");
|
|
46
|
+
HWND hwnd = GetConsoleWindow();
|
|
47
|
+
PostMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_MARK, 0);
|
|
48
|
+
|
|
49
|
+
Sleep(2000);
|
|
50
|
+
|
|
51
|
+
trace("reading output");
|
|
52
|
+
CHAR_INFO buf[1];
|
|
53
|
+
COORD bufSize = { 1, 1 };
|
|
54
|
+
COORD zeroCoord = { 0, 0 };
|
|
55
|
+
SMALL_RECT readRect = { 0, 0, 0, 0 };
|
|
56
|
+
ReadConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE),
|
|
57
|
+
buf,
|
|
58
|
+
bufSize,
|
|
59
|
+
zeroCoord,
|
|
60
|
+
&readRect);
|
|
61
|
+
trace("done reading output");
|
|
62
|
+
|
|
63
|
+
Sleep(2000);
|
|
64
|
+
|
|
65
|
+
PostMessage(hwnd, WM_CHAR, 27, 0x00010001);
|
|
66
|
+
|
|
67
|
+
Sleep(1100);
|
|
68
|
+
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Creates a window station and starts a process under it. The new process
|
|
3
|
+
* also gets a new console.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#include <windows.h>
|
|
7
|
+
#include <string.h>
|
|
8
|
+
#include <stdio.h>
|
|
9
|
+
|
|
10
|
+
int main()
|
|
11
|
+
{
|
|
12
|
+
BOOL success;
|
|
13
|
+
|
|
14
|
+
SECURITY_ATTRIBUTES sa;
|
|
15
|
+
memset(&sa, 0, sizeof(sa));
|
|
16
|
+
sa.bInheritHandle = TRUE;
|
|
17
|
+
|
|
18
|
+
HWINSTA originalStation = GetProcessWindowStation();
|
|
19
|
+
printf("originalStation == 0x%x\n", originalStation);
|
|
20
|
+
HWINSTA station = CreateWindowStation(NULL,
|
|
21
|
+
0,
|
|
22
|
+
WINSTA_ALL_ACCESS,
|
|
23
|
+
&sa);
|
|
24
|
+
printf("station == 0x%x\n", station);
|
|
25
|
+
if (!SetProcessWindowStation(station))
|
|
26
|
+
printf("SetWindowStation failed!\n");
|
|
27
|
+
HDESK desktop = CreateDesktop("Default", NULL, NULL,
|
|
28
|
+
/*dwFlags=*/0, GENERIC_ALL,
|
|
29
|
+
&sa);
|
|
30
|
+
printf("desktop = 0x%x\n", desktop);
|
|
31
|
+
|
|
32
|
+
char stationName[256];
|
|
33
|
+
stationName[0] = '\0';
|
|
34
|
+
success = GetUserObjectInformation(station, UOI_NAME,
|
|
35
|
+
stationName, sizeof(stationName),
|
|
36
|
+
NULL);
|
|
37
|
+
printf("stationName = [%s]\n", stationName);
|
|
38
|
+
|
|
39
|
+
char startupDesktop[256];
|
|
40
|
+
sprintf(startupDesktop, "%s\\Default", stationName);
|
|
41
|
+
|
|
42
|
+
STARTUPINFO sui;
|
|
43
|
+
PROCESS_INFORMATION pi;
|
|
44
|
+
memset(&sui, 0, sizeof(sui));
|
|
45
|
+
memset(&pi, 0, sizeof(pi));
|
|
46
|
+
sui.cb = sizeof(STARTUPINFO);
|
|
47
|
+
sui.lpDesktop = startupDesktop;
|
|
48
|
+
|
|
49
|
+
// Start a cmd subprocess, and have it start its own cmd subprocess.
|
|
50
|
+
// Both subprocesses will connect to the same non-interactive window
|
|
51
|
+
// station.
|
|
52
|
+
|
|
53
|
+
const char program[] = "c:\\windows\\system32\\cmd.exe";
|
|
54
|
+
char cmdline[256];
|
|
55
|
+
sprintf(cmdline, "%s /c cmd", program);
|
|
56
|
+
success = CreateProcess(program,
|
|
57
|
+
cmdline,
|
|
58
|
+
NULL,
|
|
59
|
+
NULL,
|
|
60
|
+
/*bInheritHandles=*/FALSE,
|
|
61
|
+
/*dwCreationFlags=*/CREATE_NEW_CONSOLE,
|
|
62
|
+
NULL, NULL,
|
|
63
|
+
&sui,
|
|
64
|
+
&pi);
|
|
65
|
+
|
|
66
|
+
printf("pid == %d\n", pi.dwProcessId);
|
|
67
|
+
|
|
68
|
+
// This sleep is necessary. We must give the child enough time to
|
|
69
|
+
// connect to the specified window station.
|
|
70
|
+
Sleep(5000);
|
|
71
|
+
|
|
72
|
+
SetProcessWindowStation(originalStation);
|
|
73
|
+
CloseWindowStation(station);
|
|
74
|
+
CloseDesktop(desktop);
|
|
75
|
+
Sleep(5000);
|
|
76
|
+
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A Win32 program that scrolls and writes to the console using the ioctl-like
|
|
3
|
+
* interface.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#include <stdio.h>
|
|
7
|
+
#include <windows.h>
|
|
8
|
+
|
|
9
|
+
int main()
|
|
10
|
+
{
|
|
11
|
+
HANDLE conout = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
12
|
+
|
|
13
|
+
for (int i = 0; i < 80; ++i) {
|
|
14
|
+
|
|
15
|
+
CONSOLE_SCREEN_BUFFER_INFO info;
|
|
16
|
+
GetConsoleScreenBufferInfo(conout, &info);
|
|
17
|
+
|
|
18
|
+
SMALL_RECT src = { 0, 1, info.dwSize.X - 1, info.dwSize.Y - 1 };
|
|
19
|
+
COORD destOrigin = { 0, 0 };
|
|
20
|
+
CHAR_INFO fillCharInfo = { 0 };
|
|
21
|
+
fillCharInfo.Char.AsciiChar = ' ';
|
|
22
|
+
fillCharInfo.Attributes = 7;
|
|
23
|
+
ScrollConsoleScreenBuffer(conout,
|
|
24
|
+
&src,
|
|
25
|
+
NULL,
|
|
26
|
+
destOrigin,
|
|
27
|
+
&fillCharInfo);
|
|
28
|
+
|
|
29
|
+
CHAR_INFO buffer = { 0 };
|
|
30
|
+
buffer.Char.AsciiChar = 'X';
|
|
31
|
+
buffer.Attributes = 7;
|
|
32
|
+
COORD bufferSize = { 1, 1 };
|
|
33
|
+
COORD bufferCoord = { 0, 0 };
|
|
34
|
+
SMALL_RECT writeRegion = { 0, 0, 0, 0 };
|
|
35
|
+
writeRegion.Left = writeRegion.Right = i;
|
|
36
|
+
writeRegion.Top = writeRegion.Bottom = 5;
|
|
37
|
+
WriteConsoleOutput(conout,
|
|
38
|
+
&buffer, bufferSize, bufferCoord,
|
|
39
|
+
&writeRegion);
|
|
40
|
+
|
|
41
|
+
Sleep(250);
|
|
42
|
+
}
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// I noticed this on the ConEmu web site:
|
|
2
|
+
//
|
|
3
|
+
// https://social.msdn.microsoft.com/Forums/en-US/40c8e395-cca9-45c8-b9b8-2fbe6782ac2b/readconsoleoutput-cause-access-violation-writing-location-exception
|
|
4
|
+
// https://conemu.github.io/en/MicrosoftBugs.html
|
|
5
|
+
//
|
|
6
|
+
// In Windows 7, 8, and 8.1, a ReadConsoleOutputW with an out-of-bounds read
|
|
7
|
+
// region crashes the application. I have reproduced the problem on Windows 8
|
|
8
|
+
// and 8.1, but not on Windows 7.
|
|
9
|
+
//
|
|
10
|
+
|
|
11
|
+
#include <windows.h>
|
|
12
|
+
|
|
13
|
+
#include "TestUtil.cc"
|
|
14
|
+
|
|
15
|
+
int main() {
|
|
16
|
+
setWindowPos(0, 0, 1, 1);
|
|
17
|
+
setBufferSize(80, 25);
|
|
18
|
+
setWindowPos(0, 0, 80, 25);
|
|
19
|
+
|
|
20
|
+
const HANDLE conout = openConout();
|
|
21
|
+
static CHAR_INFO lineBuf[80];
|
|
22
|
+
SMALL_RECT readRegion = { 0, 999, 79, 999 };
|
|
23
|
+
const BOOL ret = ReadConsoleOutputW(conout, lineBuf, {80, 1}, {0, 0}, &readRegion);
|
|
24
|
+
ASSERT(!ret && "ReadConsoleOutputW should have failed");
|
|
25
|
+
|
|
26
|
+
return 0;
|
|
27
|
+
}
|