ReactOS 0.4.16-dev-2104-gb84fa49
console.c
Go to the documentation of this file.
1/*
2 * msvcrt.dll console functions
3 *
4 * Copyright 2000 Jon Griffiths
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 *
20 * Note: init and free don't need MT locking since they are called at DLL
21 * (de)attachment time, which is synchronised for us
22 */
23
24#include "msvcrt.h"
25#include "winnls.h"
26#include "wincon.h"
27#include "mtdll.h"
28#include "wine/debug.h"
29
31
32/* MT */
33#define LOCK_CONSOLE _lock(_CONIO_LOCK)
34#define UNLOCK_CONSOLE _unlock(_CONIO_LOCK)
35
40
41/* INTERNAL: Initialise console handles, _CONIO_LOCK must be held */
43{
45 {
50 WARN("Input console handle initialization failed!\n");
51 }
52 return MSVCRT_console_in;
53}
54
56{
58 {
62 WARN("Output console handle initialization failed!\n");
63 }
64 return MSVCRT_console_out;
65}
66
67/* INTERNAL: Free console handles */
69{
70 TRACE(":Closing console handles\n");
73}
74
75/*********************************************************************
76 * _cputs (MSVCRT.@)
77 */
78int CDECL _cputs(const char* str)
79{
81 int len, retval = -1;
82
83 if (!MSVCRT_CHECK_PMT(str != NULL)) return -1;
84 len = strlen(str);
85
88 && count == len)
89 retval = 0;
91 return retval;
92}
93
94/*********************************************************************
95 * _cputws (MSVCRT.@)
96 */
97int CDECL _cputws(const wchar_t* str)
98{
100 int len, retval = -1;
101
102 if (!MSVCRT_CHECK_PMT(str != NULL)) return -1;
103 len = wcslen(str);
104
107 && count == len)
108 retval = 0;
110 return retval;
111}
112
113#define NORMAL_CHAR 0
114#define ALT_CHAR 1
115#define CTRL_CHAR 2
116#define SHIFT_CHAR 3
117
118static const struct {unsigned short vk; unsigned char ch[4][2];} enh_map[] = {
119 {0x47, {{0xE0, 0x47}, {0x00, 0x97}, {0xE0, 0x77}, {0xE0, 0x47}}},
120 {0x48, {{0xE0, 0x48}, {0x00, 0x98}, {0xE0, 0x8D}, {0xE0, 0x48}}},
121 {0x49, {{0xE0, 0x49}, {0x00, 0x99}, {0xE0, 0x86}, {0xE0, 0x49}}},
122 {0x4B, {{0xE0, 0x4B}, {0x00, 0x9B}, {0xE0, 0x73}, {0xE0, 0x4B}}},
123 {0x4D, {{0xE0, 0x4D}, {0x00, 0x9D}, {0xE0, 0x74}, {0xE0, 0x4D}}},
124 {0x4F, {{0xE0, 0x4F}, {0x00, 0x9F}, {0xE0, 0x75}, {0xE0, 0x4F}}},
125 {0x50, {{0xE0, 0x50}, {0x00, 0xA0}, {0xE0, 0x91}, {0xE0, 0x50}}},
126 {0x51, {{0xE0, 0x51}, {0x00, 0xA1}, {0xE0, 0x76}, {0xE0, 0x51}}},
127 {0x52, {{0xE0, 0x52}, {0x00, 0xA2}, {0xE0, 0x92}, {0xE0, 0x52}}},
128 {0x53, {{0xE0, 0x53}, {0x00, 0xA3}, {0xE0, 0x93}, {0xE0, 0x53}}},
130
131static BOOL handle_enhanced_keys(INPUT_RECORD *ir, unsigned char *ch1, unsigned char *ch2)
132{
133 int i;
134
135 for (i = 0; i < ARRAY_SIZE(enh_map); i++)
136 {
137 if (ir->Event.KeyEvent.wVirtualScanCode == enh_map[i].vk)
138 {
139 unsigned idx;
140
142 idx = ALT_CHAR;
144 idx = CTRL_CHAR;
146 idx = SHIFT_CHAR;
147 else
149
150 *ch1 = enh_map[i].ch[idx][0];
151 *ch2 = enh_map[i].ch[idx][1];
152 return TRUE;
153 }
154 }
155
156 WARN("Unmapped char keyState=%lx vk=%x\n",
158 return FALSE;
159}
160
161/*********************************************************************
162 * _getch_nolock (MSVCR80.@)
163 */
165{
166 int retval = EOF;
167
169 {
172 }
173 else
174 {
175 INPUT_RECORD ir;
176 DWORD count;
177 DWORD mode = 0;
178
180 if(mode)
182
183 do {
185 {
186 /* Only interested in ASCII chars */
187 if (ir.EventType == KEY_EVENT &&
189 {
190 unsigned char ch1, ch2;
191
193 {
195 break;
196 }
197
198 if (handle_enhanced_keys(&ir, &ch1, &ch2))
199 {
200 retval = ch1;
202 break;
203 }
204 }
205 }
206 else
207 break;
208 } while(1);
209 if (mode)
211 }
212 return retval;
213}
214
215/*********************************************************************
216 * _getch (MSVCRT.@)
217 */
218int CDECL _getch(void)
219{
220 int ret;
221
223 ret = _getch_nolock();
225 return ret;
226}
227
228/*********************************************************************
229 * _getwch_nolock (MSVCR80.@)
230 */
232{
233 wchar_t retval = WEOF;
234
236 {
239 }
240 else
241 {
242 INPUT_RECORD ir;
243 DWORD count;
244 DWORD mode = 0;
245
247 if(mode)
249
250 do {
252 {
253 /* Only interested in ASCII chars */
254 if (ir.EventType == KEY_EVENT &&
256 {
257 unsigned char ch1, ch2;
258
260 {
262 break;
263 }
264
265 if (handle_enhanced_keys(&ir, &ch1, &ch2))
266 {
267 retval = ch1;
269 break;
270 }
271 }
272 }
273 else
274 break;
275 } while(1);
276 if (mode)
278 }
279 return retval;
280}
281
282/*********************************************************************
283 * _getwch (MSVCRT.@)
284 */
285wchar_t CDECL _getwch(void)
286{
287 wchar_t ret;
288
292 return ret;
293}
294
295/*********************************************************************
296 * _putch_nolock (MSVCR80.@)
297 */
299{
300 DWORD count;
301 if (WriteConsoleA(msvcrt_output_console(), &c, 1, &count, NULL) && count == 1)
302 return c;
303 return EOF;
304}
305
306/*********************************************************************
307 * _putch (MSVCRT.@)
308 */
309int CDECL _putch(int c)
310{
312 c = _putch_nolock(c);
314 return c;
315}
316
317/*********************************************************************
318 * _putwch_nolock (MSVCR80.@)
319 */
320wchar_t CDECL _putwch_nolock(wchar_t c)
321{
322 DWORD count;
324 return c;
325 return WEOF;
326}
327
328/*********************************************************************
329 * _putwch (MSVCRT.@)
330 */
331wchar_t CDECL _putwch(wchar_t c)
332{
334 c = _putwch_nolock(c);
336 return c;
337}
338
339/*********************************************************************
340 * _getche_nolock (MSVCR80.@)
341 */
343{
344 int retval;
346 if (retval != EOF)
348 return retval;
349}
350
351/*********************************************************************
352 * _getche (MSVCRT.@)
353 */
354int CDECL _getche(void)
355{
356 int ret;
357
361 return ret;
362}
363
364/*********************************************************************
365 * _getwche_nolock (MSVCR80.@)
366 */
368{
369 wchar_t wch;
370 wch = _getch_nolock();
371 if (wch == WEOF)
372 return wch;
373 return _putwch_nolock(wch);
374}
375
376/*********************************************************************
377 * _getwche (MSVCRT.@)
378 */
379wchar_t CDECL _getwche(void)
380{
381 wchar_t ret;
382
386 return ret;
387}
388
389/*********************************************************************
390 * _cgets (MSVCRT.@)
391 */
392char* CDECL _cgets(char* str)
393{
394 char *buf = str + 2;
395 DWORD got;
396 DWORD conmode = 0;
397
398 TRACE("(%p)\n", str);
399 str[1] = 0; /* Length */
403
404 if(ReadConsoleA(msvcrt_input_console(), buf, str[0], &got, NULL)) {
405 if(buf[got-2] == '\r') {
406 buf[got-2] = 0;
407 str[1] = got-2;
408 }
409 else if(got == 1 && buf[got-1] == '\n') {
410 buf[0] = 0;
411 str[1] = 0;
412 }
413 else if(got == str[0] && buf[got-1] == '\r') {
414 buf[got-1] = 0;
415 str[1] = got-1;
416 }
417 else
418 str[1] = got;
419 }
420 else
421 buf = NULL;
424 return buf;
425}
426
427/*********************************************************************
428 * _ungetch_nolock (MSVCRT.@)
429 */
431{
432 int retval = EOF;
433 if (c != EOF && __MSVCRT_console_buffer == EOF)
435 return retval;
436}
437
438/*********************************************************************
439 * _ungetch (MSVCRT.@)
440 */
442{
446 return c;
447}
448
449/*********************************************************************
450 * _ungetwch_nolock (MSVCR80.@)
451 */
452wchar_t CDECL _ungetwch_nolock(wchar_t c)
453{
454 wchar_t retval = WEOF;
457 return retval;
458}
459
460/*********************************************************************
461 * _ungetwch (MSVCRT.@)
462 */
463wchar_t CDECL _ungetwch(wchar_t c)
464{
468 return c;
469}
470
471/*********************************************************************
472 * _kbhit (MSVCRT.@)
473 */
474int CDECL _kbhit(void)
475{
476 int retval = 0;
477
480 retval = 1;
481 else
482 {
483 /* FIXME: There has to be a faster way than this in Win32.. */
484 INPUT_RECORD *ir = NULL;
485 DWORD count = 0, i;
486
488
489 if (count && (ir = malloc(count * sizeof(INPUT_RECORD))) &&
491 for(i = 0; i < count; i++)
492 {
493 if (ir[i].EventType == KEY_EVENT &&
494 ir[i].Event.KeyEvent.bKeyDown &&
496 {
497 retval = 1;
498 break;
499 }
500 }
501 free(ir);
502 }
504 return retval;
505}
506
507static int puts_clbk_console_a(void *ctx, int len, const char *str)
508{
511 len = -1;
513 return len;
514}
515
516static int puts_clbk_console_w(void *ctx, int len, const wchar_t *str)
517{
520 len = -1;
522 return len;
523}
524
525#if _MSVCR_VER<=120
526/*********************************************************************
527 * _vcprintf_l (MSVCRT.@)
528 */
530{
532}
533#endif
534
535/*********************************************************************
536 * _vcprintf (MSVCRT.@)
537 */
539{
541}
542
543#if _MSVCR_VER<=120
544/*********************************************************************
545 * _cprintf_l (MSVCRT.@)
546 */
548{
549 int retval;
551
554 va_end(valist);
555
556 return retval;
557}
558#endif
559
560/*********************************************************************
561 * _cprintf (MSVCRT.@)
562 */
563int WINAPIV _cprintf(const char* format, ...)
564{
565 int retval;
567
570 va_end(valist);
571
572 return retval;
573}
574
575#if _MSVCR_VER<=120
576/*********************************************************************
577 * _vcwprintf_l (MSVCRT.@)
578 */
580{
582}
583
584/*********************************************************************
585 * _vcwprintf (MSVCRT.@)
586 */
588{
590}
591
592/*********************************************************************
593 * _cwprintf_l (MSVCRT.@)
594 */
595int WINAPIV _cwprintf_l(const wchar_t* format, _locale_t locale, ...)
596{
597 int retval;
599
602 va_end(valist);
603
604 return retval;
605}
606
607/*********************************************************************
608 * _cwprintf (MSVCRT.@)
609 */
610int WINAPIV _cwprintf(const wchar_t* format, ...)
611{
612 int retval;
614
617 va_end(valist);
618
619 return retval;
620}
621#endif
622
623#if _MSVCR_VER>=140
624
625/*********************************************************************
626 * __conio_common_vcprintf (UCRTBASE.@)
627 */
628int CDECL __conio_common_vcprintf(unsigned __int64 options, const char* format,
630{
632 FIXME("options %#I64x not handled\n", options);
635}
636
637/*********************************************************************
638 * __conio_common_vcwprintf (UCRTBASE.@)
639 */
640int CDECL __conio_common_vcwprintf(unsigned __int64 options, const wchar_t* format,
642{
644 FIXME("options %#I64x not handled\n", options);
647}
648
649#endif /* _MSVCR_VER>=140 */
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
Definition: _locale.h:75
int __cdecl __conio_common_vcwprintf(unsigned __int64 const options, wchar_t const *const format, _locale_t const locale, va_list const arglist)
Definition: cprintf.cpp:73
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int idx
Definition: utils.c:41
#define CDECL
Definition: compat.h:29
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define GENERIC_READ
Definition: compat.h:135
#define FILE_SHARE_READ
Definition: compat.h:136
BOOL WINAPI GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode)
Definition: console.c:1571
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode)
Definition: console.c:1608
BOOL WINAPI GetNumberOfConsoleInputEvents(HANDLE hConsoleInput, LPDWORD lpNumberOfEvents)
Definition: console.c:1637
BOOL WINAPI DECLSPEC_HOTPATCH PeekConsoleInputA(HANDLE handle, INPUT_RECORD *buffer, DWORD length, DWORD *count)
Definition: console.c:1228
BOOL WINAPI ReadConsoleInputA(HANDLE handle, INPUT_RECORD *buffer, DWORD length, DWORD *count)
Definition: console.c:1801
BOOL WINAPI ReadConsoleA(HANDLE handle, void *buffer, DWORD length, DWORD *count, void *reserved)
Definition: console.c:2066
BOOL WINAPI ReadConsoleInputW(HANDLE handle, INPUT_RECORD *buffer, DWORD length, DWORD *count)
Definition: console.c:1815
BOOL WINAPI DECLSPEC_HOTPATCH WriteConsoleW(HANDLE handle, const void *buffer, DWORD length, DWORD *written, void *reserved)
Definition: console.c:2151
BOOL WINAPI DECLSPEC_HOTPATCH WriteConsoleA(HANDLE handle, const void *buffer, DWORD length, DWORD *written, void *reserved)
Definition: console.c:2135
int CDECL _vcwprintf(const wchar_t *format, va_list valist)
Definition: console.c:587
static BOOL handle_enhanced_keys(INPUT_RECORD *ir, unsigned char *ch1, unsigned char *ch2)
Definition: console.c:131
int CDECL _ungetch_nolock(int c)
Definition: console.c:430
static HANDLE MSVCRT_console_out
Definition: console.c:37
static HANDLE MSVCRT_console_in
Definition: console.c:36
static HANDLE msvcrt_input_console(void)
Definition: console.c:42
int CDECL _vcprintf_l(const char *format, _locale_t locale, va_list valist)
Definition: console.c:529
unsigned char ch[4][2]
Definition: console.c:118
int CDECL _ungetch(int c)
Definition: console.c:441
int WINAPIV _cwprintf_l(const wchar_t *format, _locale_t locale,...)
Definition: console.c:595
int WINAPIV _cprintf_l(const char *format, _locale_t locale,...)
Definition: console.c:547
static wchar_t __MSVCRT_console_buffer_w
Definition: console.c:39
static int puts_clbk_console_a(void *ctx, int len, const char *str)
Definition: console.c:507
int CDECL _getche_nolock(void)
Definition: console.c:342
int CDECL _getch(void)
Definition: console.c:218
int CDECL _kbhit(void)
Definition: console.c:474
int CDECL _vcprintf(const char *format, va_list valist)
Definition: console.c:538
static const struct @574 enh_map[]
wchar_t CDECL _getwche(void)
Definition: console.c:379
wchar_t CDECL _getwch_nolock(void)
Definition: console.c:231
static int __MSVCRT_console_buffer
Definition: console.c:38
#define NORMAL_CHAR
Definition: console.c:113
static int puts_clbk_console_w(void *ctx, int len, const wchar_t *str)
Definition: console.c:516
#define ALT_CHAR
Definition: console.c:114
int CDECL _putch(int c)
Definition: console.c:309
wchar_t CDECL _ungetwch_nolock(wchar_t c)
Definition: console.c:452
#define CTRL_CHAR
Definition: console.c:115
int CDECL _getche(void)
Definition: console.c:354
#define LOCK_CONSOLE
Definition: console.c:33
#define SHIFT_CHAR
Definition: console.c:116
static HANDLE msvcrt_output_console(void)
Definition: console.c:55
int CDECL _putch_nolock(int c)
Definition: console.c:298
int CDECL _getch_nolock(void)
Definition: console.c:164
void msvcrt_free_console(void)
Definition: console.c:68
wchar_t CDECL _getwche_nolock(void)
Definition: console.c:367
int CDECL _cputs(const char *str)
Definition: console.c:78
#define UNLOCK_CONSOLE
Definition: console.c:34
int CDECL _cputws(const wchar_t *str)
Definition: console.c:97
unsigned short vk
Definition: console.c:118
int CDECL _vcwprintf_l(const wchar_t *format, _locale_t locale, va_list valist)
Definition: console.c:579
int WINAPIV _cprintf(const char *format,...)
Definition: console.c:563
int WINAPIV _cwprintf(const wchar_t *format,...)
Definition: console.c:610
wchar_t CDECL _getwch(void)
Definition: console.c:285
wchar_t CDECL _putwch_nolock(wchar_t c)
Definition: console.c:320
#define __int64
Definition: corecrt.h:72
#define WEOF
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
#define EOF
Definition: stdio.h:33
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1592
char * va_list
Definition: vadefs.h:50
#define UCRTBASE_PRINTF_MASK
Definition: msvcrt.h:401
int pf_printf_a(puts_clbk_a, void *, const char *, _locale_t, DWORD, args_clbk, void *, va_list *)
int pf_printf_w(puts_clbk_w, void *, const wchar_t *, _locale_t, DWORD, args_clbk, void *, va_list *)
printf_arg arg_clbk_valist(void *, int, int, va_list *)
Definition: wcs.c:847
#define MSVCRT_CHECK_PMT(x)
Definition: msvcrt.h:378
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei count
Definition: gl.h:1545
const GLubyte * c
Definition: glext.h:8905
GLenum mode
Definition: glext.h:6217
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define c
Definition: ke_i.h:80
static va_list valist
Definition: printf.c:46
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_ EVENT_TYPE EventType
Definition: exfuncs.h:167
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define GENERIC_WRITE
Definition: nt_native.h:90
const WCHAR * str
#define WINAPIV
Definition: sdbpapi.h:64
#define _putwch()
Definition: conio.h:338
#define _ungetwch()
Definition: conio.h:341
_Check_return_opt_ _DCRTIMP int __cdecl __conio_common_vcprintf(_In_ unsigned __int64 _Options, _In_z_ _Printf_format_string_params_(2) char const *_Format, _In_opt_ _locale_t _Locale, va_list _ArgList)
#define TRACE(s)
Definition: solgame.cpp:4
union _INPUT_RECORD::@3503 Event
WORD EventType
Definition: wincon.h:294
KEY_EVENT_RECORD KeyEvent
Definition: wincon.h:296
union _KEY_EVENT_RECORD::@3502 uChar
WORD wVirtualScanCode
Definition: wincon.h:264
DWORD dwControlKeyState
Definition: wincon.h:269
WCHAR UnicodeChar
Definition: wincon.h:266
Definition: format.c:58
int retval
Definition: wcstombs.cpp:91
#define LEFT_CTRL_PRESSED
Definition: wincon.h:168
#define SHIFT_PRESSED
Definition: wincon.h:169
#define ENABLE_ECHO_INPUT
Definition: wincon.h:109
#define KEY_EVENT
Definition: wincon.h:156
#define RIGHT_CTRL_PRESSED
Definition: wincon.h:167
#define RIGHT_ALT_PRESSED
Definition: wincon.h:165
#define LEFT_ALT_PRESSED
Definition: wincon.h:166
#define ENABLE_LINE_INPUT
Definition: wincon.h:108
#define ENABLE_PROCESSED_INPUT
Definition: wincon.h:107