@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.
Files changed (288) hide show
  1. package/LICENSE +69 -0
  2. package/README.md +170 -0
  3. package/binding.gyp +111 -0
  4. package/deps/.editorconfig +2 -0
  5. package/deps/winpty/.drone.yml +17 -0
  6. package/deps/winpty/.gitattributes +19 -0
  7. package/deps/winpty/LICENSE +21 -0
  8. package/deps/winpty/Makefile +166 -0
  9. package/deps/winpty/README.md +151 -0
  10. package/deps/winpty/RELEASES.md +280 -0
  11. package/deps/winpty/VERSION.txt +1 -0
  12. package/deps/winpty/configure +167 -0
  13. package/deps/winpty/misc/BufferResizeTests.cc +90 -0
  14. package/deps/winpty/misc/ChangeScreenBuffer.cc +53 -0
  15. package/deps/winpty/misc/ClearConsole.cc +72 -0
  16. package/deps/winpty/misc/ConinMode.cc +117 -0
  17. package/deps/winpty/misc/ConinMode.ps1 +116 -0
  18. package/deps/winpty/misc/ConoutMode.cc +113 -0
  19. package/deps/winpty/misc/DebugClient.py +42 -0
  20. package/deps/winpty/misc/DebugServer.py +63 -0
  21. package/deps/winpty/misc/DumpLines.py +5 -0
  22. package/deps/winpty/misc/EnableExtendedFlags.txt +46 -0
  23. package/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +528 -0
  24. package/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +633 -0
  25. package/deps/winpty/misc/Font-Report-June2016/CP932.txt +630 -0
  26. package/deps/winpty/misc/Font-Report-June2016/CP936.txt +630 -0
  27. package/deps/winpty/misc/Font-Report-June2016/CP949.txt +630 -0
  28. package/deps/winpty/misc/Font-Report-June2016/CP950.txt +630 -0
  29. package/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +16 -0
  30. package/deps/winpty/misc/Font-Report-June2016/Results.txt +4 -0
  31. package/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +144 -0
  32. package/deps/winpty/misc/FontSurvey.cc +100 -0
  33. package/deps/winpty/misc/FormatChar.h +21 -0
  34. package/deps/winpty/misc/FreezePerfTest.cc +62 -0
  35. package/deps/winpty/misc/GetCh.cc +20 -0
  36. package/deps/winpty/misc/GetConsolePos.cc +41 -0
  37. package/deps/winpty/misc/GetFont.cc +261 -0
  38. package/deps/winpty/misc/IdentifyConsoleWindow.ps1 +51 -0
  39. package/deps/winpty/misc/IsNewConsole.cc +87 -0
  40. package/deps/winpty/misc/MouseInputNotes.txt +90 -0
  41. package/deps/winpty/misc/MoveConsoleWindow.cc +34 -0
  42. package/deps/winpty/misc/Notes.txt +219 -0
  43. package/deps/winpty/misc/OSVersion.cc +27 -0
  44. package/deps/winpty/misc/ScreenBufferFreezeInactive.cc +101 -0
  45. package/deps/winpty/misc/ScreenBufferTest.cc +671 -0
  46. package/deps/winpty/misc/ScreenBufferTest2.cc +151 -0
  47. package/deps/winpty/misc/SelectAllTest.cc +45 -0
  48. package/deps/winpty/misc/SetBufferSize.cc +32 -0
  49. package/deps/winpty/misc/SetCursorPos.cc +10 -0
  50. package/deps/winpty/misc/SetFont.cc +145 -0
  51. package/deps/winpty/misc/SetWindowRect.cc +36 -0
  52. package/deps/winpty/misc/ShowArgv.cc +12 -0
  53. package/deps/winpty/misc/ShowConsoleInput.cc +40 -0
  54. package/deps/winpty/misc/Spew.py +5 -0
  55. package/deps/winpty/misc/TestUtil.cc +172 -0
  56. package/deps/winpty/misc/UnicodeDoubleWidthTest.cc +102 -0
  57. package/deps/winpty/misc/UnicodeWideTest1.cc +246 -0
  58. package/deps/winpty/misc/UnicodeWideTest2.cc +130 -0
  59. package/deps/winpty/misc/UnixEcho.cc +89 -0
  60. package/deps/winpty/misc/Utf16Echo.cc +46 -0
  61. package/deps/winpty/misc/VeryLargeRead.cc +122 -0
  62. package/deps/winpty/misc/VkEscapeTest.cc +56 -0
  63. package/deps/winpty/misc/Win10ResizeWhileFrozen.cc +52 -0
  64. package/deps/winpty/misc/Win10WrapTest1.cc +57 -0
  65. package/deps/winpty/misc/Win10WrapTest2.cc +30 -0
  66. package/deps/winpty/misc/Win32Echo1.cc +26 -0
  67. package/deps/winpty/misc/Win32Echo2.cc +19 -0
  68. package/deps/winpty/misc/Win32Test1.cc +46 -0
  69. package/deps/winpty/misc/Win32Test2.cc +70 -0
  70. package/deps/winpty/misc/Win32Test3.cc +78 -0
  71. package/deps/winpty/misc/Win32Write1.cc +44 -0
  72. package/deps/winpty/misc/WindowsBugCrashReader.cc +27 -0
  73. package/deps/winpty/misc/WriteConsole.cc +106 -0
  74. package/deps/winpty/misc/build32.sh +9 -0
  75. package/deps/winpty/misc/build64.sh +9 -0
  76. package/deps/winpty/misc/color-test.sh +212 -0
  77. package/deps/winpty/misc/font-notes.txt +300 -0
  78. package/deps/winpty/misc/winbug-15048.cc +201 -0
  79. package/deps/winpty/ship/build-pty4j-libpty.bat +36 -0
  80. package/deps/winpty/ship/common_ship.py +53 -0
  81. package/deps/winpty/ship/make_msvc_package.py +165 -0
  82. package/deps/winpty/ship/ship.py +108 -0
  83. package/deps/winpty/src/agent/Agent.cc +613 -0
  84. package/deps/winpty/src/agent/Agent.h +103 -0
  85. package/deps/winpty/src/agent/AgentCreateDesktop.cc +84 -0
  86. package/deps/winpty/src/agent/AgentCreateDesktop.h +28 -0
  87. package/deps/winpty/src/agent/ConsoleFont.cc +632 -0
  88. package/deps/winpty/src/agent/ConsoleFont.h +28 -0
  89. package/deps/winpty/src/agent/ConsoleInput.cc +852 -0
  90. package/deps/winpty/src/agent/ConsoleInput.h +109 -0
  91. package/deps/winpty/src/agent/ConsoleInputReencoding.cc +121 -0
  92. package/deps/winpty/src/agent/ConsoleInputReencoding.h +36 -0
  93. package/deps/winpty/src/agent/ConsoleLine.cc +152 -0
  94. package/deps/winpty/src/agent/ConsoleLine.h +41 -0
  95. package/deps/winpty/src/agent/Coord.h +87 -0
  96. package/deps/winpty/src/agent/DebugShowInput.cc +239 -0
  97. package/deps/winpty/src/agent/DebugShowInput.h +32 -0
  98. package/deps/winpty/src/agent/DefaultInputMap.cc +422 -0
  99. package/deps/winpty/src/agent/DefaultInputMap.h +28 -0
  100. package/deps/winpty/src/agent/DsrSender.h +30 -0
  101. package/deps/winpty/src/agent/EventLoop.cc +99 -0
  102. package/deps/winpty/src/agent/EventLoop.h +47 -0
  103. package/deps/winpty/src/agent/InputMap.cc +246 -0
  104. package/deps/winpty/src/agent/InputMap.h +114 -0
  105. package/deps/winpty/src/agent/LargeConsoleRead.cc +71 -0
  106. package/deps/winpty/src/agent/LargeConsoleRead.h +68 -0
  107. package/deps/winpty/src/agent/NamedPipe.cc +378 -0
  108. package/deps/winpty/src/agent/NamedPipe.h +125 -0
  109. package/deps/winpty/src/agent/Scraper.cc +699 -0
  110. package/deps/winpty/src/agent/Scraper.h +103 -0
  111. package/deps/winpty/src/agent/SimplePool.h +75 -0
  112. package/deps/winpty/src/agent/SmallRect.h +143 -0
  113. package/deps/winpty/src/agent/Terminal.cc +535 -0
  114. package/deps/winpty/src/agent/Terminal.h +69 -0
  115. package/deps/winpty/src/agent/UnicodeEncoding.h +157 -0
  116. package/deps/winpty/src/agent/UnicodeEncodingTest.cc +189 -0
  117. package/deps/winpty/src/agent/Win32Console.cc +107 -0
  118. package/deps/winpty/src/agent/Win32Console.h +67 -0
  119. package/deps/winpty/src/agent/Win32ConsoleBuffer.cc +193 -0
  120. package/deps/winpty/src/agent/Win32ConsoleBuffer.h +99 -0
  121. package/deps/winpty/src/agent/main.cc +114 -0
  122. package/deps/winpty/src/agent/subdir.mk +61 -0
  123. package/deps/winpty/src/configurations.gypi +60 -0
  124. package/deps/winpty/src/debugserver/DebugServer.cc +117 -0
  125. package/deps/winpty/src/debugserver/subdir.mk +41 -0
  126. package/deps/winpty/src/include/winpty.h +242 -0
  127. package/deps/winpty/src/include/winpty_constants.h +131 -0
  128. package/deps/winpty/src/libwinpty/AgentLocation.cc +75 -0
  129. package/deps/winpty/src/libwinpty/AgentLocation.h +28 -0
  130. package/deps/winpty/src/libwinpty/LibWinptyException.h +54 -0
  131. package/deps/winpty/src/libwinpty/WinptyInternal.h +72 -0
  132. package/deps/winpty/src/libwinpty/subdir.mk +46 -0
  133. package/deps/winpty/src/libwinpty/winpty.cc +970 -0
  134. package/deps/winpty/src/shared/AgentMsg.h +38 -0
  135. package/deps/winpty/src/shared/BackgroundDesktop.cc +122 -0
  136. package/deps/winpty/src/shared/BackgroundDesktop.h +73 -0
  137. package/deps/winpty/src/shared/Buffer.cc +103 -0
  138. package/deps/winpty/src/shared/Buffer.h +102 -0
  139. package/deps/winpty/src/shared/DebugClient.cc +187 -0
  140. package/deps/winpty/src/shared/DebugClient.h +38 -0
  141. package/deps/winpty/src/shared/GenRandom.cc +138 -0
  142. package/deps/winpty/src/shared/GenRandom.h +55 -0
  143. package/deps/winpty/src/shared/GetCommitHash.bat +13 -0
  144. package/deps/winpty/src/shared/Mutex.h +54 -0
  145. package/deps/winpty/src/shared/OsModule.h +63 -0
  146. package/deps/winpty/src/shared/OwnedHandle.cc +36 -0
  147. package/deps/winpty/src/shared/OwnedHandle.h +45 -0
  148. package/deps/winpty/src/shared/PrecompiledHeader.h +43 -0
  149. package/deps/winpty/src/shared/StringBuilder.h +227 -0
  150. package/deps/winpty/src/shared/StringBuilderTest.cc +114 -0
  151. package/deps/winpty/src/shared/StringUtil.cc +55 -0
  152. package/deps/winpty/src/shared/StringUtil.h +80 -0
  153. package/deps/winpty/src/shared/TimeMeasurement.h +63 -0
  154. package/deps/winpty/src/shared/UnixCtrlChars.h +45 -0
  155. package/deps/winpty/src/shared/UpdateGenVersion.bat +20 -0
  156. package/deps/winpty/src/shared/WindowsSecurity.cc +460 -0
  157. package/deps/winpty/src/shared/WindowsSecurity.h +104 -0
  158. package/deps/winpty/src/shared/WindowsVersion.cc +252 -0
  159. package/deps/winpty/src/shared/WindowsVersion.h +29 -0
  160. package/deps/winpty/src/shared/WinptyAssert.cc +55 -0
  161. package/deps/winpty/src/shared/WinptyAssert.h +64 -0
  162. package/deps/winpty/src/shared/WinptyException.cc +57 -0
  163. package/deps/winpty/src/shared/WinptyException.h +43 -0
  164. package/deps/winpty/src/shared/WinptyVersion.cc +42 -0
  165. package/deps/winpty/src/shared/WinptyVersion.h +27 -0
  166. package/deps/winpty/src/shared/winpty_snprintf.h +99 -0
  167. package/deps/winpty/src/subdir.mk +5 -0
  168. package/deps/winpty/src/tests/subdir.mk +28 -0
  169. package/deps/winpty/src/tests/trivial_test.cc +158 -0
  170. package/deps/winpty/src/unix-adapter/InputHandler.cc +114 -0
  171. package/deps/winpty/src/unix-adapter/InputHandler.h +56 -0
  172. package/deps/winpty/src/unix-adapter/OutputHandler.cc +80 -0
  173. package/deps/winpty/src/unix-adapter/OutputHandler.h +53 -0
  174. package/deps/winpty/src/unix-adapter/Util.cc +86 -0
  175. package/deps/winpty/src/unix-adapter/Util.h +31 -0
  176. package/deps/winpty/src/unix-adapter/WakeupFd.cc +70 -0
  177. package/deps/winpty/src/unix-adapter/WakeupFd.h +42 -0
  178. package/deps/winpty/src/unix-adapter/main.cc +729 -0
  179. package/deps/winpty/src/unix-adapter/subdir.mk +41 -0
  180. package/deps/winpty/src/winpty.gyp +234 -0
  181. package/deps/winpty/vcbuild.bat +83 -0
  182. package/lib/conpty_console_list_agent.js +16 -0
  183. package/lib/conpty_console_list_agent.js.map +1 -0
  184. package/lib/eventEmitter2.js +47 -0
  185. package/lib/eventEmitter2.js.map +1 -0
  186. package/lib/eventEmitter2.test.js +30 -0
  187. package/lib/eventEmitter2.test.js.map +1 -0
  188. package/lib/index.js +52 -0
  189. package/lib/index.js.map +1 -0
  190. package/lib/interfaces.js +7 -0
  191. package/lib/interfaces.js.map +1 -0
  192. package/lib/shared/conout.js +11 -0
  193. package/lib/shared/conout.js.map +1 -0
  194. package/lib/terminal.js +190 -0
  195. package/lib/terminal.js.map +1 -0
  196. package/lib/terminal.test.js +139 -0
  197. package/lib/terminal.test.js.map +1 -0
  198. package/lib/testUtils.test.js +28 -0
  199. package/lib/testUtils.test.js.map +1 -0
  200. package/lib/types.js +7 -0
  201. package/lib/types.js.map +1 -0
  202. package/lib/unixTerminal.js +346 -0
  203. package/lib/unixTerminal.js.map +1 -0
  204. package/lib/unixTerminal.test.js +351 -0
  205. package/lib/unixTerminal.test.js.map +1 -0
  206. package/lib/utils.js +39 -0
  207. package/lib/utils.js.map +1 -0
  208. package/lib/windowsConoutConnection.js +125 -0
  209. package/lib/windowsConoutConnection.js.map +1 -0
  210. package/lib/windowsPtyAgent.js +320 -0
  211. package/lib/windowsPtyAgent.js.map +1 -0
  212. package/lib/windowsPtyAgent.test.js +90 -0
  213. package/lib/windowsPtyAgent.test.js.map +1 -0
  214. package/lib/windowsTerminal.js +199 -0
  215. package/lib/windowsTerminal.js.map +1 -0
  216. package/lib/windowsTerminal.test.js +219 -0
  217. package/lib/windowsTerminal.test.js.map +1 -0
  218. package/lib/worker/conoutSocketWorker.js +22 -0
  219. package/lib/worker/conoutSocketWorker.js.map +1 -0
  220. package/package.json +68 -0
  221. package/prebuilds/darwin-arm64/pty.node +0 -0
  222. package/prebuilds/darwin-arm64/spawn-helper +0 -0
  223. package/prebuilds/darwin-x64/pty.node +0 -0
  224. package/prebuilds/darwin-x64/spawn-helper +0 -0
  225. package/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  226. package/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  227. package/prebuilds/win32-arm64/conpty.node +0 -0
  228. package/prebuilds/win32-arm64/conpty.pdb +0 -0
  229. package/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  230. package/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  231. package/prebuilds/win32-arm64/pty.node +0 -0
  232. package/prebuilds/win32-arm64/pty.pdb +0 -0
  233. package/prebuilds/win32-arm64/winpty-agent.exe +0 -0
  234. package/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
  235. package/prebuilds/win32-arm64/winpty.dll +0 -0
  236. package/prebuilds/win32-arm64/winpty.pdb +0 -0
  237. package/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  238. package/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  239. package/prebuilds/win32-x64/conpty.node +0 -0
  240. package/prebuilds/win32-x64/conpty.pdb +0 -0
  241. package/prebuilds/win32-x64/conpty_console_list.node +0 -0
  242. package/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  243. package/prebuilds/win32-x64/pty.node +0 -0
  244. package/prebuilds/win32-x64/pty.pdb +0 -0
  245. package/prebuilds/win32-x64/winpty-agent.exe +0 -0
  246. package/prebuilds/win32-x64/winpty-agent.pdb +0 -0
  247. package/prebuilds/win32-x64/winpty.dll +0 -0
  248. package/prebuilds/win32-x64/winpty.pdb +0 -0
  249. package/scripts/gen-compile-commands.js +8 -0
  250. package/scripts/increment-version.js +54 -0
  251. package/scripts/post-install.js +99 -0
  252. package/scripts/prebuild.js +39 -0
  253. package/scripts/sync-prebuild.js +31 -0
  254. package/scripts/verify-darwin-fd-leak.js +63 -0
  255. package/src/conpty_console_list_agent.ts +15 -0
  256. package/src/eventEmitter2.test.ts +30 -0
  257. package/src/eventEmitter2.ts +48 -0
  258. package/src/index.ts +52 -0
  259. package/src/interfaces.ts +130 -0
  260. package/src/native.d.ts +54 -0
  261. package/src/shared/conout.ts +15 -0
  262. package/src/terminal.test.ts +119 -0
  263. package/src/terminal.ts +211 -0
  264. package/src/testUtils.test.ts +23 -0
  265. package/src/tsconfig.json +22 -0
  266. package/src/types.ts +15 -0
  267. package/src/unix/pty.cc +808 -0
  268. package/src/unix/spawn-helper.cc +23 -0
  269. package/src/unixTerminal.test.ts +367 -0
  270. package/src/unixTerminal.ts +388 -0
  271. package/src/utils.ts +29 -0
  272. package/src/win/conpty.cc +583 -0
  273. package/src/win/conpty.h +41 -0
  274. package/src/win/conpty_console_list.cc +44 -0
  275. package/src/win/path_util.cc +95 -0
  276. package/src/win/path_util.h +26 -0
  277. package/src/win/winpty.cc +333 -0
  278. package/src/windowsConoutConnection.ts +82 -0
  279. package/src/windowsPtyAgent.test.ts +94 -0
  280. package/src/windowsPtyAgent.ts +321 -0
  281. package/src/windowsTerminal.test.ts +229 -0
  282. package/src/windowsTerminal.ts +203 -0
  283. package/src/worker/conoutSocketWorker.ts +22 -0
  284. package/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  285. package/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  286. package/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  287. package/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  288. 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
+ }