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 /*--------------------------------------------------------------
40 HANDLE STDCALL
GetStdHandle(DWORD nStdHandle
)
42 DPRINT("GetStdHandle(nStdHandle %d)\n",nStdHandle
);
44 SetLastError(ERROR_SUCCESS
); /* OK */
47 case STD_INPUT_HANDLE
: return StdInput
;
48 case STD_OUTPUT_HANDLE
: return StdOutput
;
49 case STD_ERROR_HANDLE
: return StdError
;
50 #ifdef EXTENDED_CONSOLE
51 case STD_AUX_HANDLE
: return StdError
;
52 case STD_PRINT_HANDLE
: return StdError
;
55 SetLastError(0); /* FIXME: What error code? */
56 return INVALID_HANDLE_VALUE
;
60 /*--------------------------------------------------------------
71 /* More checking needed? */
72 if (hHandle
== INVALID_HANDLE_VALUE
)
74 SetLastError(0); /* FIXME: What error code? */
77 SetLastError(ERROR_SUCCESS
); /* OK */
80 case STD_INPUT_HANDLE
:
83 case STD_OUTPUT_HANDLE
:
86 case STD_ERROR_HANDLE
:
89 #ifdef EXTENDED_CONSOLE
93 case STD_PRINT_HANDLE
:
98 SetLastError(0); /* FIXME: What error code? */
103 /*--------------------------------------------------------------
109 HANDLE hConsoleOutput
,
110 CONST VOID
*lpBuffer
,
111 DWORD nNumberOfCharsToWrite
,
112 LPDWORD lpNumberOfCharsWritten
,
116 return WriteFile(hConsoleOutput
, lpBuffer
, nNumberOfCharsToWrite
,lpNumberOfCharsWritten
, lpReserved
);
120 /*--------------------------------------------------------------
125 ReadConsoleA(HANDLE hConsoleInput
,
127 DWORD nNumberOfCharsToRead
,
128 LPDWORD lpNumberOfCharsRead
,
131 KEY_EVENT_RECORD KeyEventRecord
;
133 PCHAR Buffer
= (PCHAR
)lpBuffer
;
137 for (i
=0; (stat
&& i
<nNumberOfCharsToRead
);)
139 stat
= ReadFile(hConsoleInput
,
141 sizeof(KEY_EVENT_RECORD
),
144 if (stat
&& KeyEventRecord
.bKeyDown
&& KeyEventRecord
.uChar
.AsciiChar
!= 0)
146 Buffer
[i
] = KeyEventRecord
.uChar
.AsciiChar
;
150 if (lpNumberOfCharsRead
!= NULL
)
152 *lpNumberOfCharsRead
= i
;
158 /*--------------------------------------------------------------
165 /* FIXME: add CreateFile error checking */
166 StdInput
= CreateFile("\\\\.\\Keyboard",
174 StdOutput
= CreateFile("\\\\.\\BlueScreen",
175 FILE_GENERIC_WRITE
|FILE_GENERIC_READ
,
182 StdError
= StdOutput
;
188 /*--------------------------------------------------------------
195 if (StdInput
== INVALID_HANDLE_VALUE
)
197 SetLastError(0); /* FIXME: What error code? */
200 SetLastError(ERROR_SUCCESS
);
201 CloseHandle(StdInput
);
203 if (StdError
!= INVALID_HANDLE_VALUE
)
205 if (StdError
!= StdOutput
)
206 CloseHandle(StdError
);
207 StdError
= INVALID_HANDLE_VALUE
;
210 CloseHandle(StdOutput
);
212 #ifdef EXTENDED_CONSOLE
214 CloseHandle(StdPrint
);
216 return TRUE
; /* FIXME: error check needed? */
220 /*--------------------------------------------------------------
221 * GetConsoleScreenBufferInfo
225 GetConsoleScreenBufferInfo(
226 HANDLE hConsoleOutput
,
227 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
230 DWORD dwBytesReturned
;
232 if ( !DeviceIoControl(
234 IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO
,
237 lpConsoleScreenBufferInfo
,
238 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
244 SetLastError(0); /* FIXME: What error code? */
247 SetLastError(ERROR_SUCCESS
); /* OK */
252 /*--------------------------------------------------------------
253 * SetConsoleCursorPosition
257 SetConsoleCursorPosition(
258 HANDLE hConsoleOutput
,
259 COORD dwCursorPosition
262 DWORD dwBytesReturned
;
263 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo
;
265 if( !GetConsoleScreenBufferInfo(hConsoleOutput
,&ConsoleScreenBufferInfo
) )
267 SetLastError(0); /* FIXME: What error code? */
270 ConsoleScreenBufferInfo
.dwCursorPosition
.X
= dwCursorPosition
.X
;
271 ConsoleScreenBufferInfo
.dwCursorPosition
.Y
= dwCursorPosition
.Y
;
273 if( !DeviceIoControl(
275 IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO
,
276 &ConsoleScreenBufferInfo
,
277 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
288 /*--------------------------------------------------------------
289 * FillConsoleOutputCharacterA
293 FillConsoleOutputCharacterA(
294 HANDLE hConsoleOutput
,
298 LPDWORD lpNumberOfCharsWritten
301 DWORD dwBytesReturned
;
302 OUTPUT_CHARACTER Buffer
;
304 Buffer
.cCharacter
= cCharacter
;
305 Buffer
.nLength
= nLength
;
306 Buffer
.dwCoord
= dwWriteCoord
;
308 if (DeviceIoControl (hConsoleOutput
,
309 IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER
,
311 sizeof(OUTPUT_CHARACTER
),
313 sizeof(OUTPUT_CHARACTER
),
317 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
321 *lpNumberOfCharsWritten
= 0;
326 /*--------------------------------------------------------------
327 * FillConsoleOutputCharacterW
331 FillConsoleOutputCharacterW(
332 HANDLE hConsoleOutput
,
336 LPDWORD lpNumberOfCharsWritten
344 /*--------------------------------------------------------------
351 HANDLE hConsoleInput
,
352 PINPUT_RECORD lpBuffer
,
354 LPDWORD lpNumberOfEventsRead
362 /*--------------------------------------------------------------
369 HANDLE hConsoleInput
,
370 PINPUT_RECORD lpBuffer
,
372 LPDWORD lpNumberOfEventsRead
380 /*--------------------------------------------------------------
387 HANDLE hConsoleInput
,
388 PINPUT_RECORD lpBuffer
,
390 LPDWORD lpNumberOfEventsRead
397 for (i
=0; (stat
&& i
< nLength
);)
399 stat
= ReadFile(hConsoleInput
,
400 &lpBuffer
[i
].Event
.KeyEvent
,
401 sizeof(KEY_EVENT_RECORD
),
406 lpBuffer
[i
].EventType
= KEY_EVENT
;
410 if (lpNumberOfEventsRead
!= NULL
)
412 *lpNumberOfEventsRead
= i
;
418 /*--------------------------------------------------------------
425 HANDLE hConsoleInput
,
426 PINPUT_RECORD lpBuffer
,
428 LPDWORD lpNumberOfEventsRead
436 /*--------------------------------------------------------------
443 HANDLE hConsoleInput
,
444 CONST INPUT_RECORD
*lpBuffer
,
446 LPDWORD lpNumberOfEventsWritten
454 /*--------------------------------------------------------------
461 HANDLE hConsoleInput
,
462 CONST INPUT_RECORD
*lpBuffer
,
464 LPDWORD lpNumberOfEventsWritten
472 /*--------------------------------------------------------------
479 HANDLE hConsoleOutput
,
483 PSMALL_RECT lpReadRegion
491 /*--------------------------------------------------------------
498 HANDLE hConsoleOutput
,
502 PSMALL_RECT lpReadRegion
509 /*--------------------------------------------------------------
510 * WriteConsoleOutputA
516 HANDLE hConsoleOutput
,
517 CONST CHAR_INFO
*lpBuffer
,
520 PSMALL_RECT lpWriteRegion
528 /*--------------------------------------------------------------
529 * WriteConsoleOutputW
535 HANDLE hConsoleOutput
,
536 CONST CHAR_INFO
*lpBuffer
,
539 PSMALL_RECT lpWriteRegion
547 /*--------------------------------------------------------------
548 * ReadConsoleOutputCharacterA
553 ReadConsoleOutputCharacterA(
554 HANDLE hConsoleOutput
,
558 LPDWORD lpNumberOfCharsRead
561 DWORD dwBytesReturned
;
562 OUTPUT_CHARACTER Buffer
;
564 Buffer
.dwCoord
= dwReadCoord
;
566 if (DeviceIoControl (hConsoleOutput
,
567 IOCTL_CONSOLE_READ_OUTPUT_CHARACTER
,
569 sizeof(OUTPUT_CHARACTER
),
575 *lpNumberOfCharsRead
= Buffer
.dwTransfered
;
579 *lpNumberOfCharsRead
= 0;
584 /*--------------------------------------------------------------
585 * ReadConsoleOutputCharacterW
590 ReadConsoleOutputCharacterW(
591 HANDLE hConsoleOutput
,
595 LPDWORD lpNumberOfCharsRead
603 /*--------------------------------------------------------------
604 * ReadConsoleOutputAttribute
609 ReadConsoleOutputAttribute(
610 HANDLE hConsoleOutput
,
614 LPDWORD lpNumberOfAttrsRead
617 DWORD dwBytesReturned
;
618 OUTPUT_ATTRIBUTE Buffer
;
620 Buffer
.dwCoord
= dwReadCoord
;
622 if (DeviceIoControl (hConsoleOutput
,
623 IOCTL_CONSOLE_READ_OUTPUT_ATTRIBUTE
,
625 sizeof(OUTPUT_ATTRIBUTE
),
631 *lpNumberOfAttrsRead
= Buffer
.dwTransfered
;
635 *lpNumberOfAttrsRead
= 0;
641 /*--------------------------------------------------------------
642 * WriteConsoleOutputCharacterA
647 WriteConsoleOutputCharacterA(
648 HANDLE hConsoleOutput
,
652 LPDWORD lpNumberOfCharsWritten
655 DWORD dwBytesReturned
;
656 OUTPUT_CHARACTER Buffer
;
658 Buffer
.dwCoord
= dwWriteCoord
;
660 if (DeviceIoControl (hConsoleOutput
,
661 IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
,
663 sizeof(OUTPUT_CHARACTER
),
669 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
673 *lpNumberOfCharsWritten
= 0;
678 /*--------------------------------------------------------------
679 * WriteConsoleOutputCharacterW
684 WriteConsoleOutputCharacterW(
685 HANDLE hConsoleOutput
,
689 LPDWORD lpNumberOfCharsWritten
698 /*--------------------------------------------------------------
699 * WriteConsoleOutputAttribute
704 WriteConsoleOutputAttribute(
705 HANDLE hConsoleOutput
,
706 CONST WORD
*lpAttribute
,
709 LPDWORD lpNumberOfAttrsWritten
712 DWORD dwBytesReturned
;
713 OUTPUT_ATTRIBUTE Buffer
;
715 Buffer
.dwCoord
= dwWriteCoord
;
717 if (DeviceIoControl (hConsoleOutput
,
718 IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE
,
720 sizeof(OUTPUT_ATTRIBUTE
),
726 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
730 *lpNumberOfAttrsWritten
= 0;
736 /*--------------------------------------------------------------
737 * FillConsoleOutputAttribute
742 FillConsoleOutputAttribute(
743 HANDLE hConsoleOutput
,
747 LPDWORD lpNumberOfAttrsWritten
750 DWORD dwBytesReturned
;
751 OUTPUT_ATTRIBUTE Buffer
;
753 Buffer
.wAttribute
= wAttribute
;
754 Buffer
.nLength
= nLength
;
755 Buffer
.dwCoord
= dwWriteCoord
;
757 if (DeviceIoControl (hConsoleOutput
,
758 IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE
,
760 sizeof(OUTPUT_ATTRIBUTE
),
762 sizeof(OUTPUT_ATTRIBUTE
),
766 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
770 *lpNumberOfAttrsWritten
= 0;
776 /*--------------------------------------------------------------
783 HANDLE hConsoleHandle
,
788 DWORD dwBytesReturned
;
790 if (DeviceIoControl (hConsoleHandle
,
791 IOCTL_CONSOLE_GET_MODE
,
795 sizeof(CONSOLE_MODE
),
799 *lpMode
= Buffer
.dwMode
;
800 SetLastError (ERROR_SUCCESS
);
804 SetLastError(0); /* FIXME: What error code? */
809 /*--------------------------------------------------------------
810 * GetNumberOfConsoleInputEvents
815 GetNumberOfConsoleInputEvents(
816 HANDLE hConsoleInput
,
817 LPDWORD lpNumberOfEvents
825 /*--------------------------------------------------------------
826 * GetLargestConsoleWindowSize
831 GetLargestConsoleWindowSize(
832 HANDLE hConsoleOutput
836 COORD Coord
= {80,25};
844 /*--------------------------------------------------------------
845 * GetConsoleCursorInfo
850 GetConsoleCursorInfo(
851 HANDLE hConsoleOutput
,
852 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
855 DWORD dwBytesReturned
;
857 if (DeviceIoControl (hConsoleOutput
,
858 IOCTL_CONSOLE_GET_CURSOR_INFO
,
862 sizeof(CONSOLE_CURSOR_INFO
),
871 /*--------------------------------------------------------------
872 * GetNumberOfConsoleMouseButtons
877 GetNumberOfConsoleMouseButtons(
878 LPDWORD lpNumberOfMouseButtons
886 /*--------------------------------------------------------------
893 HANDLE hConsoleHandle
,
898 DWORD dwBytesReturned
;
900 Buffer
.dwMode
= dwMode
;
902 if (DeviceIoControl (hConsoleHandle
,
903 IOCTL_CONSOLE_SET_MODE
,
905 sizeof(CONSOLE_MODE
),
911 SetLastError (ERROR_SUCCESS
);
915 SetLastError(0); /* FIXME: What error code? */
920 /*--------------------------------------------------------------
921 * SetConsoleActiveScreenBuffer
926 SetConsoleActiveScreenBuffer(
927 HANDLE hConsoleOutput
935 /*--------------------------------------------------------------
936 * FlushConsoleInputBuffer
941 FlushConsoleInputBuffer(
950 /*--------------------------------------------------------------
951 * SetConsoleScreenBufferSize
956 SetConsoleScreenBufferSize(
957 HANDLE hConsoleOutput
,
965 /*--------------------------------------------------------------
966 * SetConsoleCursorInfo
971 SetConsoleCursorInfo(
972 HANDLE hConsoleOutput
,
973 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
976 DWORD dwBytesReturned
;
978 if (DeviceIoControl (hConsoleOutput
,
979 IOCTL_CONSOLE_SET_CURSOR_INFO
,
980 (PCONSOLE_CURSOR_INFO
)lpConsoleCursorInfo
,
981 sizeof(CONSOLE_CURSOR_INFO
),
992 /*--------------------------------------------------------------
993 * ScrollConsoleScreenBufferA
998 ScrollConsoleScreenBufferA(
999 HANDLE hConsoleOutput
,
1000 CONST SMALL_RECT
*lpScrollRectangle
,
1001 CONST SMALL_RECT
*lpClipRectangle
,
1002 COORD dwDestinationOrigin
,
1003 CONST CHAR_INFO
*lpFill
1011 /*--------------------------------------------------------------
1012 * ScrollConsoleScreenBufferW
1017 ScrollConsoleScreenBufferW(
1018 HANDLE hConsoleOutput
,
1019 CONST SMALL_RECT
*lpScrollRectangle
,
1020 CONST SMALL_RECT
*lpClipRectangle
,
1021 COORD dwDestinationOrigin
,
1022 CONST CHAR_INFO
*lpFill
1030 /*--------------------------------------------------------------
1031 * SetConsoleWindowInfo
1036 SetConsoleWindowInfo(
1037 HANDLE hConsoleOutput
,
1039 CONST SMALL_RECT
*lpConsoleWindow
1047 /*--------------------------------------------------------------
1048 * SetConsoleTextAttribute
1053 SetConsoleTextAttribute(
1054 HANDLE hConsoleOutput
,
1058 DWORD dwBytesReturned
;
1060 if (!DeviceIoControl (hConsoleOutput
,
1061 IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE
,
1073 /*--------------------------------------------------------------
1074 * SetConsoleCtrlHandler
1079 SetConsoleCtrlHandler(
1080 PHANDLER_ROUTINE HandlerRoutine
,
1089 /*--------------------------------------------------------------
1090 * GenerateConsoleCtrlEvent
1095 GenerateConsoleCtrlEvent(
1097 DWORD dwProcessGroupId
1105 /*--------------------------------------------------------------
1108 #define MAX_CONSOLE_TITLE_LENGTH 80
1114 LPWSTR lpConsoleTitle
,
1123 /*--------------------------------------------------------------
1132 LPSTR lpConsoleTitle
,
1136 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1137 DWORD nWideTitle
= sizeof WideTitle
;
1140 if (!lpConsoleTitle
|| !nSize
) return 0;
1141 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
1142 if (!nWideTitle
) return 0;
1144 if ( (nWritten
= WideCharToMultiByte(
1145 CP_ACP
, // ANSI code page
1146 0, // performance and mapping flags
1147 (LPWSTR
) WideTitle
, // address of wide-character string
1148 nWideTitle
, // number of characters in string
1149 lpConsoleTitle
, // address of buffer for new string
1150 nSize
, // size of buffer
1155 lpConsoleTitle
[nWritten
] = '\0';
1163 /*--------------------------------------------------------------
1170 LPCWSTR lpConsoleTitle
1178 /*--------------------------------------------------------------
1187 LPCSTR lpConsoleTitle
1190 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1191 char AnsiTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1194 if (!lpConsoleTitle
) return FALSE
;
1195 ZeroMemory( WideTitle
, sizeof WideTitle
);
1196 nWideTitle
= lstrlenA(lpConsoleTitle
);
1205 AnsiTitle
[nWideTitle
] = '\0';
1207 if ( MultiByteToWideChar(
1208 CP_ACP
, // ANSI code page
1209 MB_PRECOMPOSED
, // character-type options
1210 AnsiTitle
, // address of string to map
1211 nWideTitle
, // number of characters in string
1212 (LPWSTR
) WideTitle
, // address of wide-character buffer
1213 (-1) // size of buffer: -1=...\0
1216 return SetConsoleTitleW( (LPWSTR
) WideTitle
);
1223 /*--------------------------------------------------------------
1230 HANDLE hConsoleInput
,
1232 DWORD nNumberOfCharsToRead
,
1233 LPDWORD lpNumberOfCharsRead
,
1242 /*--------------------------------------------------------------
1249 HANDLE hConsoleOutput
,
1250 CONST VOID
*lpBuffer
,
1251 DWORD nNumberOfCharsToWrite
,
1252 LPDWORD lpNumberOfCharsWritten
,
1261 /*--------------------------------------------------------------
1262 * CreateConsoleScreenBuffer
1267 CreateConsoleScreenBuffer(
1268 DWORD dwDesiredAccess
,
1270 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1272 LPVOID lpScreenBufferData
1280 /*--------------------------------------------------------------
1286 GetConsoleCP( VOID
)
1289 return CP_OEMCP
; /* FIXME */
1293 /*--------------------------------------------------------------
1308 /*--------------------------------------------------------------
1309 * GetConsoleOutputCP
1314 GetConsoleOutputCP( VOID
)
1317 return 0; /* FIXME */
1321 /*--------------------------------------------------------------
1322 * SetConsoleOutputCP