2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/misc/console.c
5 * PURPOSE: Win32 server console functions
9 * 19990204 EA SetConsoleTitleA
13 #include <ddk/ntddk.h>
14 #include <ddk/ntddblue.h>
19 #include <kernel32/kernel32.h>
23 #define EXTENDED_CONSOLE */
25 HANDLE StdInput
= INVALID_HANDLE_VALUE
;
26 HANDLE StdOutput
= INVALID_HANDLE_VALUE
;
27 HANDLE StdError
= INVALID_HANDLE_VALUE
;
28 #ifdef EXTENDED_CONSOLE
29 HANDLE StdAux
= INVALID_HANDLE_VALUE
;
30 HANDLE StdPrint
= INVALID_HANDLE_VALUE
;
37 /*--------------------------------------------------------------
46 SetLastError(ERROR_SUCCESS
); /* OK */
49 case STD_INPUT_HANDLE
: return StdInput
;
50 case STD_OUTPUT_HANDLE
: return StdOutput
;
51 case STD_ERROR_HANDLE
: return StdError
;
52 #ifdef EXTENDED_CONSOLE
53 case STD_AUX_HANDLE
: return StdError
;
54 case STD_PRINT_HANDLE
: return StdError
;
57 SetLastError(0); /* FIXME: What error code? */
58 return INVALID_HANDLE_VALUE
;
62 /*--------------------------------------------------------------
73 /* More checking needed? */
74 if (hHandle
== INVALID_HANDLE_VALUE
)
76 SetLastError(0); /* FIXME: What error code? */
79 SetLastError(ERROR_SUCCESS
); /* OK */
82 case STD_INPUT_HANDLE
:
85 case STD_OUTPUT_HANDLE
:
88 case STD_ERROR_HANDLE
:
91 #ifdef EXTENDED_CONSOLE
95 case STD_PRINT_HANDLE
:
100 SetLastError(0); /* FIXME: What error code? */
105 /*--------------------------------------------------------------
111 HANDLE hConsoleOutput
,
112 CONST VOID
*lpBuffer
,
113 DWORD nNumberOfCharsToWrite
,
114 LPDWORD lpNumberOfCharsWritten
,
118 return WriteFile(hConsoleOutput
, lpBuffer
, nNumberOfCharsToWrite
,lpNumberOfCharsWritten
, lpReserved
);
122 /*--------------------------------------------------------------
127 ReadConsoleA(HANDLE hConsoleInput
,
129 DWORD nNumberOfCharsToRead
,
130 LPDWORD lpNumberOfCharsRead
,
133 KEY_EVENT_RECORD KeyEventRecord
;
135 PCHAR Buffer
= (PCHAR
)lpBuffer
;
139 for (i
=0; (stat
&& i
<nNumberOfCharsToRead
);)
141 stat
= ReadFile(hConsoleInput
,
143 sizeof(KEY_EVENT_RECORD
),
146 if (stat
&& KeyEventRecord
.bKeyDown
&& KeyEventRecord
.AsciiChar
!= 0)
148 Buffer
[i
] = KeyEventRecord
.AsciiChar
;
152 if (lpNumberOfCharsRead
!= NULL
)
154 *lpNumberOfCharsRead
= i
;
160 /*--------------------------------------------------------------
167 /* FIXME: add CreateFile error checking */
168 StdInput
= CreateFile("\\\\.\\Keyboard",
176 StdOutput
= CreateFile("\\\\.\\BlueScreen",
177 FILE_GENERIC_WRITE
|FILE_GENERIC_READ
,
184 StdError
= StdOutput
;
190 /*--------------------------------------------------------------
197 if (StdInput
== INVALID_HANDLE_VALUE
)
199 SetLastError(0); /* FIXME: What error code? */
202 SetLastError(ERROR_SUCCESS
);
203 CloseHandle(StdInput
);
204 CloseHandle(StdOutput
);
205 CloseHandle(StdError
);
206 #ifdef EXTENDED_CONSOLE
208 CloseHandle(StdPrint
);
210 return TRUE
; /* FIXME: error check needed? */
214 /*--------------------------------------------------------------
215 * GetConsoleScreenBufferInfo
219 GetConsoleScreenBufferInfo(
220 HANDLE hConsoleOutput
,
221 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
224 DWORD dwBytesReturned
;
226 if ( !DeviceIoControl(
228 IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO
,
231 lpConsoleScreenBufferInfo
,
232 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
238 SetLastError(0); /* FIXME: What error code? */
241 SetLastError(ERROR_SUCCESS
); /* OK */
246 /*--------------------------------------------------------------
247 * SetConsoleCursorPosition
251 SetConsoleCursorPosition(
252 HANDLE hConsoleOutput
,
253 COORD dwCursorPosition
256 DWORD dwBytesReturned
;
257 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo
;
259 if( !GetConsoleScreenBufferInfo(hConsoleOutput
,&ConsoleScreenBufferInfo
) )
261 SetLastError(0); /* FIXME: What error code? */
264 ConsoleScreenBufferInfo
.dwCursorPosition
.X
= dwCursorPosition
.X
;
265 ConsoleScreenBufferInfo
.dwCursorPosition
.Y
= dwCursorPosition
.Y
;
267 if( !DeviceIoControl(
269 IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO
,
270 &ConsoleScreenBufferInfo
,
271 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
282 /*--------------------------------------------------------------
283 * FillConsoleOutputCharacterA
287 FillConsoleOutputCharacterA(
288 HANDLE hConsoleOutput
,
292 LPDWORD lpNumberOfCharsWritten
295 DWORD dwBytesReturned
;
296 OUTPUT_CHARACTER Buffer
;
298 Buffer
.cCharacter
= cCharacter
;
299 Buffer
.nLength
= nLength
;
300 Buffer
.dwCoord
= dwWriteCoord
;
302 if (DeviceIoControl (hConsoleOutput
,
303 IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER
,
305 sizeof(OUTPUT_CHARACTER
),
307 sizeof(OUTPUT_CHARACTER
),
311 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
315 *lpNumberOfCharsWritten
= 0;
320 /*--------------------------------------------------------------
321 * FillConsoleOutputCharacterW
325 FillConsoleOutputCharacterW(
326 HANDLE hConsoleOutput
,
330 LPDWORD lpNumberOfCharsWritten
338 /*--------------------------------------------------------------
345 HANDLE hConsoleInput
,
346 PINPUT_RECORD lpBuffer
,
348 LPDWORD lpNumberOfEventsRead
356 /*--------------------------------------------------------------
363 HANDLE hConsoleInput
,
364 PINPUT_RECORD lpBuffer
,
366 LPDWORD lpNumberOfEventsRead
374 /*--------------------------------------------------------------
381 HANDLE hConsoleInput
,
382 PINPUT_RECORD lpBuffer
,
384 LPDWORD lpNumberOfEventsRead
391 for (i
=0; (stat
&& i
< nLength
);)
393 stat
= ReadFile(hConsoleInput
,
394 &lpBuffer
[i
].Event
.KeyEvent
,
395 sizeof(KEY_EVENT_RECORD
),
400 lpBuffer
[i
].EventType
= KEY_EVENT
;
404 if (lpNumberOfEventsRead
!= NULL
)
406 *lpNumberOfEventsRead
= i
;
412 /*--------------------------------------------------------------
419 HANDLE hConsoleInput
,
420 PINPUT_RECORD lpBuffer
,
422 LPDWORD lpNumberOfEventsRead
430 /*--------------------------------------------------------------
437 HANDLE hConsoleInput
,
438 CONST INPUT_RECORD
*lpBuffer
,
440 LPDWORD lpNumberOfEventsWritten
448 /*--------------------------------------------------------------
455 HANDLE hConsoleInput
,
456 CONST INPUT_RECORD
*lpBuffer
,
458 LPDWORD lpNumberOfEventsWritten
466 /*--------------------------------------------------------------
473 HANDLE hConsoleOutput
,
477 PSMALL_RECT lpReadRegion
485 /*--------------------------------------------------------------
492 HANDLE hConsoleOutput
,
496 PSMALL_RECT lpReadRegion
503 /*--------------------------------------------------------------
504 * WriteConsoleOutputA
510 HANDLE hConsoleOutput
,
511 CONST CHAR_INFO
*lpBuffer
,
514 PSMALL_RECT lpWriteRegion
522 /*--------------------------------------------------------------
523 * WriteConsoleOutputW
529 HANDLE hConsoleOutput
,
530 CONST CHAR_INFO
*lpBuffer
,
533 PSMALL_RECT lpWriteRegion
541 /*--------------------------------------------------------------
542 * ReadConsoleOutputCharacterA
547 ReadConsoleOutputCharacterA(
548 HANDLE hConsoleOutput
,
552 LPDWORD lpNumberOfCharsRead
555 DWORD dwBytesReturned
;
556 OUTPUT_CHARACTER Buffer
;
558 Buffer
.dwCoord
= dwReadCoord
;
560 if (DeviceIoControl (hConsoleOutput
,
561 IOCTL_CONSOLE_READ_OUTPUT_CHARACTER
,
563 sizeof(OUTPUT_CHARACTER
),
569 *lpNumberOfCharsRead
= Buffer
.dwTransfered
;
573 *lpNumberOfCharsRead
= 0;
578 /*--------------------------------------------------------------
579 * ReadConsoleOutputCharacterW
584 ReadConsoleOutputCharacterW(
585 HANDLE hConsoleOutput
,
589 LPDWORD lpNumberOfCharsRead
597 /*--------------------------------------------------------------
598 * ReadConsoleOutputAttribute
603 ReadConsoleOutputAttribute(
604 HANDLE hConsoleOutput
,
608 LPDWORD lpNumberOfAttrsRead
611 DWORD dwBytesReturned
;
612 OUTPUT_ATTRIBUTE Buffer
;
614 Buffer
.dwCoord
= dwReadCoord
;
616 if (DeviceIoControl (hConsoleOutput
,
617 IOCTL_CONSOLE_READ_OUTPUT_ATTRIBUTE
,
619 sizeof(OUTPUT_ATTRIBUTE
),
625 *lpNumberOfAttrsRead
= Buffer
.dwTransfered
;
629 *lpNumberOfAttrsRead
= 0;
635 /*--------------------------------------------------------------
636 * WriteConsoleOutputCharacterA
641 WriteConsoleOutputCharacterA(
642 HANDLE hConsoleOutput
,
646 LPDWORD lpNumberOfCharsWritten
649 DWORD dwBytesReturned
;
650 OUTPUT_CHARACTER Buffer
;
652 Buffer
.dwCoord
= dwWriteCoord
;
654 if (DeviceIoControl (hConsoleOutput
,
655 IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
,
657 sizeof(OUTPUT_CHARACTER
),
663 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
667 *lpNumberOfCharsWritten
= 0;
672 /*--------------------------------------------------------------
673 * WriteConsoleOutputCharacterW
678 WriteConsoleOutputCharacterW(
679 HANDLE hConsoleOutput
,
683 LPDWORD lpNumberOfCharsWritten
692 /*--------------------------------------------------------------
693 * WriteConsoleOutputAttribute
698 WriteConsoleOutputAttribute(
699 HANDLE hConsoleOutput
,
700 CONST WORD
*lpAttribute
,
703 LPDWORD lpNumberOfAttrsWritten
706 DWORD dwBytesReturned
;
707 OUTPUT_ATTRIBUTE Buffer
;
709 Buffer
.dwCoord
= dwWriteCoord
;
711 if (DeviceIoControl (hConsoleOutput
,
712 IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE
,
714 sizeof(OUTPUT_ATTRIBUTE
),
720 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
724 *lpNumberOfAttrsWritten
= 0;
730 /*--------------------------------------------------------------
731 * FillConsoleOutputAttribute
736 FillConsoleOutputAttribute(
737 HANDLE hConsoleOutput
,
741 LPDWORD lpNumberOfAttrsWritten
744 DWORD dwBytesReturned
;
745 OUTPUT_ATTRIBUTE Buffer
;
747 Buffer
.wAttribute
= wAttribute
;
748 Buffer
.nLength
= nLength
;
749 Buffer
.dwCoord
= dwWriteCoord
;
751 if (DeviceIoControl (hConsoleOutput
,
752 IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE
,
754 sizeof(OUTPUT_ATTRIBUTE
),
756 sizeof(OUTPUT_ATTRIBUTE
),
760 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
764 *lpNumberOfAttrsWritten
= 0;
770 /*--------------------------------------------------------------
777 HANDLE hConsoleHandle
,
782 DWORD dwBytesReturned
;
784 if (DeviceIoControl (hConsoleHandle
,
785 IOCTL_CONSOLE_GET_MODE
,
789 sizeof(CONSOLE_MODE
),
793 *lpMode
= Buffer
.dwMode
;
794 SetLastError (ERROR_SUCCESS
);
798 SetLastError(0); /* FIXME: What error code? */
803 /*--------------------------------------------------------------
804 * GetNumberOfConsoleInputEvents
809 GetNumberOfConsoleInputEvents(
810 HANDLE hConsoleInput
,
811 LPDWORD lpNumberOfEvents
819 /*--------------------------------------------------------------
820 * GetLargestConsoleWindowSize
825 GetLargestConsoleWindowSize(
826 HANDLE hConsoleOutput
830 COORD Coord
= {80,25};
838 /*--------------------------------------------------------------
839 * GetConsoleCursorInfo
844 GetConsoleCursorInfo(
845 HANDLE hConsoleOutput
,
846 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
849 DWORD dwBytesReturned
;
851 if (DeviceIoControl (hConsoleOutput
,
852 IOCTL_CONSOLE_GET_CURSOR_INFO
,
856 sizeof(CONSOLE_CURSOR_INFO
),
865 /*--------------------------------------------------------------
866 * GetNumberOfConsoleMouseButtons
871 GetNumberOfConsoleMouseButtons(
872 LPDWORD lpNumberOfMouseButtons
880 /*--------------------------------------------------------------
887 HANDLE hConsoleHandle
,
892 DWORD dwBytesReturned
;
894 Buffer
.dwMode
= dwMode
;
896 if (DeviceIoControl (hConsoleHandle
,
897 IOCTL_CONSOLE_SET_MODE
,
899 sizeof(CONSOLE_MODE
),
905 SetLastError (ERROR_SUCCESS
);
909 SetLastError(0); /* FIXME: What error code? */
914 /*--------------------------------------------------------------
915 * SetConsoleActiveScreenBuffer
920 SetConsoleActiveScreenBuffer(
921 HANDLE hConsoleOutput
929 /*--------------------------------------------------------------
930 * FlushConsoleInputBuffer
935 FlushConsoleInputBuffer(
944 /*--------------------------------------------------------------
945 * SetConsoleScreenBufferSize
950 SetConsoleScreenBufferSize(
951 HANDLE hConsoleOutput
,
959 /*--------------------------------------------------------------
960 * SetConsoleCursorInfo
965 SetConsoleCursorInfo(
966 HANDLE hConsoleOutput
,
967 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
970 DWORD dwBytesReturned
;
972 if (DeviceIoControl (hConsoleOutput
,
973 IOCTL_CONSOLE_SET_CURSOR_INFO
,
974 (PCONSOLE_CURSOR_INFO
)lpConsoleCursorInfo
,
975 sizeof(CONSOLE_CURSOR_INFO
),
986 /*--------------------------------------------------------------
987 * ScrollConsoleScreenBufferA
992 ScrollConsoleScreenBufferA(
993 HANDLE hConsoleOutput
,
994 CONST SMALL_RECT
*lpScrollRectangle
,
995 CONST SMALL_RECT
*lpClipRectangle
,
996 COORD dwDestinationOrigin
,
997 CONST CHAR_INFO
*lpFill
1005 /*--------------------------------------------------------------
1006 * ScrollConsoleScreenBufferW
1011 ScrollConsoleScreenBufferW(
1012 HANDLE hConsoleOutput
,
1013 CONST SMALL_RECT
*lpScrollRectangle
,
1014 CONST SMALL_RECT
*lpClipRectangle
,
1015 COORD dwDestinationOrigin
,
1016 CONST CHAR_INFO
*lpFill
1024 /*--------------------------------------------------------------
1025 * SetConsoleWindowInfo
1030 SetConsoleWindowInfo(
1031 HANDLE hConsoleOutput
,
1033 CONST SMALL_RECT
*lpConsoleWindow
1041 /*--------------------------------------------------------------
1042 * SetConsoleTextAttribute
1047 SetConsoleTextAttribute(
1048 HANDLE hConsoleOutput
,
1052 DWORD dwBytesReturned
;
1054 if (!DeviceIoControl (hConsoleOutput
,
1055 IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE
,
1067 /*--------------------------------------------------------------
1068 * SetConsoleCtrlHandler
1073 SetConsoleCtrlHandler(
1074 PHANDLER_ROUTINE HandlerRoutine
,
1083 /*--------------------------------------------------------------
1084 * GenerateConsoleCtrlEvent
1089 GenerateConsoleCtrlEvent(
1091 DWORD dwProcessGroupId
1099 /*--------------------------------------------------------------
1102 #define MAX_CONSOLE_TITLE_LENGTH 80
1108 LPWSTR lpConsoleTitle
,
1117 /*--------------------------------------------------------------
1126 LPSTR lpConsoleTitle
,
1130 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1131 DWORD nWideTitle
= sizeof WideTitle
;
1134 if (!lpConsoleTitle
|| !nSize
) return 0;
1135 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
1136 if (!nWideTitle
) return 0;
1138 if ( (nWritten
= WideCharToMultiByte(
1139 CP_ACP
, // ANSI code page
1140 0, // performance and mapping flags
1141 (LPWSTR
) WideTitle
, // address of wide-character string
1142 nWideTitle
, // number of characters in string
1143 lpConsoleTitle
, // address of buffer for new string
1144 nSize
, // size of buffer
1149 lpConsoleTitle
[nWritten
] = '\0';
1157 /*--------------------------------------------------------------
1164 LPCWSTR lpConsoleTitle
1172 /*--------------------------------------------------------------
1181 LPCSTR lpConsoleTitle
1184 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1185 char AnsiTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1188 if (!lpConsoleTitle
) return FALSE
;
1189 ZeroMemory( WideTitle
, sizeof WideTitle
);
1190 nWideTitle
= lstrlenA(lpConsoleTitle
);
1199 AnsiTitle
[nWideTitle
] = '\0';
1201 if ( MultiByteToWideChar(
1202 CP_ACP
, // ANSI code page
1203 MB_PRECOMPOSED
, // character-type options
1204 AnsiTitle
, // address of string to map
1205 nWideTitle
, // number of characters in string
1206 (LPWSTR
) WideTitle
, // address of wide-character buffer
1207 (-1) // size of buffer: -1=...\0
1210 return SetConsoleTitleW( (LPWSTR
) WideTitle
);
1217 /*--------------------------------------------------------------
1224 HANDLE hConsoleInput
,
1226 DWORD nNumberOfCharsToRead
,
1227 LPDWORD lpNumberOfCharsRead
,
1236 /*--------------------------------------------------------------
1243 HANDLE hConsoleOutput
,
1244 CONST VOID
*lpBuffer
,
1245 DWORD nNumberOfCharsToWrite
,
1246 LPDWORD lpNumberOfCharsWritten
,
1255 /*--------------------------------------------------------------
1256 * CreateConsoleScreenBuffer
1261 CreateConsoleScreenBuffer(
1262 DWORD dwDesiredAccess
,
1264 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1266 LPVOID lpScreenBufferData
1274 /*--------------------------------------------------------------
1280 GetConsoleCP( VOID
)
1283 return CP_OEMCP
; /* FIXME */
1287 /*--------------------------------------------------------------
1302 /*--------------------------------------------------------------
1303 * GetConsoleOutputCP
1308 GetConsoleOutputCP( VOID
)
1311 return 0; /* FIXME */
1315 /*--------------------------------------------------------------
1316 * SetConsoleOutputCP