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 /* INCLUDES ******************************************************************/
15 #include <ddk/ntddk.h>
16 #include <ddk/ntddblue.h>
21 #include <csrss/csrss.h>
22 #include <ntdll/csr.h>
25 #include <kernel32/kernel32.h>
27 /* GLOBALS ******************************************************************/
29 static HANDLE StdInput
= INVALID_HANDLE_VALUE
;
30 static HANDLE StdOutput
= INVALID_HANDLE_VALUE
;
31 static HANDLE StdError
= INVALID_HANDLE_VALUE
;
33 /* FUNCTIONS *****************************************************************/
35 WINBOOL STDCALL
CloseConsoleHandle(HANDLE Handle
)
39 BOOLEAN
IsConsoleHandle(HANDLE Handle
)
41 if ((((ULONG
)Handle
) & 0x10000003) == 0x3)
49 /*--------------------------------------------------------------
52 HANDLE STDCALL
GetStdHandle(DWORD nStdHandle
)
54 DPRINT("GetStdHandle(nStdHandle %d)\n",nStdHandle
);
56 SetLastError(ERROR_SUCCESS
); /* OK */
59 case STD_INPUT_HANDLE
: return StdInput
;
60 case STD_OUTPUT_HANDLE
: return StdOutput
;
61 case STD_ERROR_HANDLE
: return StdError
;
63 SetLastError(0); /* FIXME: What error code? */
64 return INVALID_HANDLE_VALUE
;
68 /*--------------------------------------------------------------
71 WINBASEAPI BOOL WINAPI
SetStdHandle(DWORD nStdHandle
,
74 /* More checking needed? */
75 if (hHandle
== INVALID_HANDLE_VALUE
)
77 SetLastError(0); /* FIXME: What error code? */
81 SetLastError(ERROR_SUCCESS
); /* OK */
84 case STD_INPUT_HANDLE
:
87 case STD_OUTPUT_HANDLE
:
90 case STD_ERROR_HANDLE
:
94 SetLastError(0); /* FIXME: What error code? */
99 /*--------------------------------------------------------------
102 WINBOOL STDCALL
WriteConsoleA(HANDLE hConsoleOutput
,
103 CONST VOID
*lpBuffer
,
104 DWORD nNumberOfCharsToWrite
,
105 LPDWORD lpNumberOfCharsWritten
,
108 PCSRSS_API_REQUEST Request
;
109 CSRSS_API_REPLY Reply
;
112 Request
= HeapAlloc(GetProcessHeap(),
114 sizeof(CSRSS_API_REQUEST
) + nNumberOfCharsToWrite
);
120 Request
->Type
= CSRSS_WRITE_CONSOLE
;
121 Request
->Data
.WriteConsoleRequest
.ConsoleHandle
= hConsoleOutput
;
122 Request
->Data
.WriteConsoleRequest
.NrCharactersToWrite
=
123 nNumberOfCharsToWrite
;
124 // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite);
125 // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer);
126 memcpy(Request
->Data
.WriteConsoleRequest
.Buffer
,
128 nNumberOfCharsToWrite
);
130 Status
= CsrClientCallServer(Request
,
132 sizeof(CSRSS_API_REQUEST
) +
133 nNumberOfCharsToWrite
,
134 sizeof(CSRSS_API_REPLY
));
135 if (!NT_SUCCESS(Status
))
140 if (lpNumberOfCharsWritten
!= NULL
)
142 *lpNumberOfCharsWritten
=
143 Reply
.Data
.WriteConsoleReply
.NrCharactersWritten
;
150 /*--------------------------------------------------------------
153 WINBOOL STDCALL
ReadConsoleA(HANDLE hConsoleInput
,
155 DWORD nNumberOfCharsToRead
,
156 LPDWORD lpNumberOfCharsRead
,
159 CSRSS_API_REQUEST Request
;
160 PCSRSS_API_REPLY Reply
;
163 Reply
= HeapAlloc(GetProcessHeap(),
165 sizeof(CSRSS_API_REPLY
) + nNumberOfCharsToRead
);
171 Request
.Type
= CSRSS_READ_CONSOLE
;
172 Request
.Data
.ReadConsoleRequest
.ConsoleHandle
= hConsoleInput
;
173 Request
.Data
.ReadConsoleRequest
.NrCharactersToRead
=
174 nNumberOfCharsToRead
;
176 Status
= CsrClientCallServer(&Request
,
178 sizeof(CSRSS_API_REQUEST
),
179 sizeof(CSRSS_API_REPLY
) +
180 nNumberOfCharsToRead
);
181 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(Reply
->Status
))
186 if (lpNumberOfCharsRead
!= NULL
)
188 *lpNumberOfCharsRead
=
189 Reply
->Data
.ReadConsoleReply
.NrCharactersRead
;
192 Reply
->Data
.ReadConsoleReply
.Buffer
,
193 Reply
->Data
.ReadConsoleReply
.NrCharactersRead
);
199 /*--------------------------------------------------------------
202 WINBOOL STDCALL
AllocConsole(VOID
)
204 DbgPrint("AllocConsole() is unimplemented\n");
208 /*--------------------------------------------------------------
211 WINBOOL STDCALL
FreeConsole(VOID
)
213 DbgPrint("FreeConsole() is unimplemented");
217 /*--------------------------------------------------------------
218 * GetConsoleScreenBufferInfo
222 GetConsoleScreenBufferInfo(
223 HANDLE hConsoleOutput
,
224 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
227 DWORD dwBytesReturned
;
229 if ( !DeviceIoControl(
231 IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO
,
234 lpConsoleScreenBufferInfo
,
235 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
241 SetLastError(0); /* FIXME: What error code? */
244 SetLastError(ERROR_SUCCESS
); /* OK */
249 /*--------------------------------------------------------------
250 * SetConsoleCursorPosition
254 SetConsoleCursorPosition(
255 HANDLE hConsoleOutput
,
256 COORD dwCursorPosition
259 DWORD dwBytesReturned
;
260 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo
;
262 if( !GetConsoleScreenBufferInfo(hConsoleOutput
,&ConsoleScreenBufferInfo
) )
264 SetLastError(0); /* FIXME: What error code? */
267 ConsoleScreenBufferInfo
.dwCursorPosition
.X
= dwCursorPosition
.X
;
268 ConsoleScreenBufferInfo
.dwCursorPosition
.Y
= dwCursorPosition
.Y
;
270 if( !DeviceIoControl(
272 IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO
,
273 &ConsoleScreenBufferInfo
,
274 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
285 /*--------------------------------------------------------------
286 * FillConsoleOutputCharacterA
290 FillConsoleOutputCharacterA(
291 HANDLE hConsoleOutput
,
295 LPDWORD lpNumberOfCharsWritten
298 DWORD dwBytesReturned
;
299 OUTPUT_CHARACTER Buffer
;
301 Buffer
.cCharacter
= cCharacter
;
302 Buffer
.nLength
= nLength
;
303 Buffer
.dwCoord
= dwWriteCoord
;
305 if (DeviceIoControl (hConsoleOutput
,
306 IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER
,
308 sizeof(OUTPUT_CHARACTER
),
310 sizeof(OUTPUT_CHARACTER
),
314 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
318 *lpNumberOfCharsWritten
= 0;
323 /*--------------------------------------------------------------
324 * FillConsoleOutputCharacterW
328 FillConsoleOutputCharacterW(
329 HANDLE hConsoleOutput
,
333 LPDWORD lpNumberOfCharsWritten
341 /*--------------------------------------------------------------
348 HANDLE hConsoleInput
,
349 PINPUT_RECORD lpBuffer
,
351 LPDWORD lpNumberOfEventsRead
359 /*--------------------------------------------------------------
366 HANDLE hConsoleInput
,
367 PINPUT_RECORD lpBuffer
,
369 LPDWORD lpNumberOfEventsRead
377 /*--------------------------------------------------------------
384 HANDLE hConsoleInput
,
385 PINPUT_RECORD lpBuffer
,
387 LPDWORD lpNumberOfEventsRead
394 for (i
=0; (stat
&& i
< nLength
);)
396 stat
= ReadFile(hConsoleInput
,
397 &lpBuffer
[i
].Event
.KeyEvent
,
398 sizeof(KEY_EVENT_RECORD
),
403 lpBuffer
[i
].EventType
= KEY_EVENT
;
407 if (lpNumberOfEventsRead
!= NULL
)
409 *lpNumberOfEventsRead
= i
;
415 /*--------------------------------------------------------------
422 HANDLE hConsoleInput
,
423 PINPUT_RECORD lpBuffer
,
425 LPDWORD lpNumberOfEventsRead
433 /*--------------------------------------------------------------
440 HANDLE hConsoleInput
,
441 CONST INPUT_RECORD
*lpBuffer
,
443 LPDWORD lpNumberOfEventsWritten
451 /*--------------------------------------------------------------
458 HANDLE hConsoleInput
,
459 CONST INPUT_RECORD
*lpBuffer
,
461 LPDWORD lpNumberOfEventsWritten
469 /*--------------------------------------------------------------
476 HANDLE hConsoleOutput
,
480 PSMALL_RECT lpReadRegion
488 /*--------------------------------------------------------------
495 HANDLE hConsoleOutput
,
499 PSMALL_RECT lpReadRegion
506 /*--------------------------------------------------------------
507 * WriteConsoleOutputA
513 HANDLE hConsoleOutput
,
514 CONST CHAR_INFO
*lpBuffer
,
517 PSMALL_RECT lpWriteRegion
525 /*--------------------------------------------------------------
526 * WriteConsoleOutputW
532 HANDLE hConsoleOutput
,
533 CONST CHAR_INFO
*lpBuffer
,
536 PSMALL_RECT lpWriteRegion
544 /*--------------------------------------------------------------
545 * ReadConsoleOutputCharacterA
550 ReadConsoleOutputCharacterA(
551 HANDLE hConsoleOutput
,
555 LPDWORD lpNumberOfCharsRead
558 DWORD dwBytesReturned
;
559 OUTPUT_CHARACTER Buffer
;
561 Buffer
.dwCoord
= dwReadCoord
;
563 if (DeviceIoControl (hConsoleOutput
,
564 IOCTL_CONSOLE_READ_OUTPUT_CHARACTER
,
566 sizeof(OUTPUT_CHARACTER
),
572 *lpNumberOfCharsRead
= Buffer
.dwTransfered
;
576 *lpNumberOfCharsRead
= 0;
581 /*--------------------------------------------------------------
582 * ReadConsoleOutputCharacterW
587 ReadConsoleOutputCharacterW(
588 HANDLE hConsoleOutput
,
592 LPDWORD lpNumberOfCharsRead
600 /*--------------------------------------------------------------
601 * ReadConsoleOutputAttribute
606 ReadConsoleOutputAttribute(
607 HANDLE hConsoleOutput
,
611 LPDWORD lpNumberOfAttrsRead
614 DWORD dwBytesReturned
;
615 OUTPUT_ATTRIBUTE Buffer
;
617 Buffer
.dwCoord
= dwReadCoord
;
619 if (DeviceIoControl (hConsoleOutput
,
620 IOCTL_CONSOLE_READ_OUTPUT_ATTRIBUTE
,
622 sizeof(OUTPUT_ATTRIBUTE
),
628 *lpNumberOfAttrsRead
= Buffer
.dwTransfered
;
632 *lpNumberOfAttrsRead
= 0;
638 /*--------------------------------------------------------------
639 * WriteConsoleOutputCharacterA
644 WriteConsoleOutputCharacterA(
645 HANDLE hConsoleOutput
,
649 LPDWORD lpNumberOfCharsWritten
652 DWORD dwBytesReturned
;
653 OUTPUT_CHARACTER Buffer
;
655 Buffer
.dwCoord
= dwWriteCoord
;
657 if (DeviceIoControl (hConsoleOutput
,
658 IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
,
660 sizeof(OUTPUT_CHARACTER
),
666 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
670 *lpNumberOfCharsWritten
= 0;
675 /*--------------------------------------------------------------
676 * WriteConsoleOutputCharacterW
681 WriteConsoleOutputCharacterW(
682 HANDLE hConsoleOutput
,
686 LPDWORD lpNumberOfCharsWritten
695 /*--------------------------------------------------------------
696 * WriteConsoleOutputAttribute
701 WriteConsoleOutputAttribute(
702 HANDLE hConsoleOutput
,
703 CONST WORD
*lpAttribute
,
706 LPDWORD lpNumberOfAttrsWritten
709 DWORD dwBytesReturned
;
710 OUTPUT_ATTRIBUTE Buffer
;
712 Buffer
.dwCoord
= dwWriteCoord
;
714 if (DeviceIoControl (hConsoleOutput
,
715 IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE
,
717 sizeof(OUTPUT_ATTRIBUTE
),
723 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
727 *lpNumberOfAttrsWritten
= 0;
733 /*--------------------------------------------------------------
734 * FillConsoleOutputAttribute
739 FillConsoleOutputAttribute(
740 HANDLE hConsoleOutput
,
744 LPDWORD lpNumberOfAttrsWritten
747 DWORD dwBytesReturned
;
748 OUTPUT_ATTRIBUTE Buffer
;
750 Buffer
.wAttribute
= wAttribute
;
751 Buffer
.nLength
= nLength
;
752 Buffer
.dwCoord
= dwWriteCoord
;
754 if (DeviceIoControl (hConsoleOutput
,
755 IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE
,
757 sizeof(OUTPUT_ATTRIBUTE
),
759 sizeof(OUTPUT_ATTRIBUTE
),
763 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
767 *lpNumberOfAttrsWritten
= 0;
773 /*--------------------------------------------------------------
780 HANDLE hConsoleHandle
,
785 DWORD dwBytesReturned
;
787 if (DeviceIoControl (hConsoleHandle
,
788 IOCTL_CONSOLE_GET_MODE
,
792 sizeof(CONSOLE_MODE
),
796 *lpMode
= Buffer
.dwMode
;
797 SetLastError (ERROR_SUCCESS
);
801 SetLastError(0); /* FIXME: What error code? */
806 /*--------------------------------------------------------------
807 * GetNumberOfConsoleInputEvents
812 GetNumberOfConsoleInputEvents(
813 HANDLE hConsoleInput
,
814 LPDWORD lpNumberOfEvents
822 /*--------------------------------------------------------------
823 * GetLargestConsoleWindowSize
828 GetLargestConsoleWindowSize(
829 HANDLE hConsoleOutput
833 COORD Coord
= {80,25};
841 /*--------------------------------------------------------------
842 * GetConsoleCursorInfo
847 GetConsoleCursorInfo(
848 HANDLE hConsoleOutput
,
849 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
852 DWORD dwBytesReturned
;
854 if (DeviceIoControl (hConsoleOutput
,
855 IOCTL_CONSOLE_GET_CURSOR_INFO
,
859 sizeof(CONSOLE_CURSOR_INFO
),
868 /*--------------------------------------------------------------
869 * GetNumberOfConsoleMouseButtons
874 GetNumberOfConsoleMouseButtons(
875 LPDWORD lpNumberOfMouseButtons
883 /*--------------------------------------------------------------
890 HANDLE hConsoleHandle
,
895 DWORD dwBytesReturned
;
897 Buffer
.dwMode
= dwMode
;
899 if (DeviceIoControl (hConsoleHandle
,
900 IOCTL_CONSOLE_SET_MODE
,
902 sizeof(CONSOLE_MODE
),
908 SetLastError (ERROR_SUCCESS
);
912 SetLastError(0); /* FIXME: What error code? */
917 /*--------------------------------------------------------------
918 * SetConsoleActiveScreenBuffer
923 SetConsoleActiveScreenBuffer(
924 HANDLE hConsoleOutput
932 /*--------------------------------------------------------------
933 * FlushConsoleInputBuffer
938 FlushConsoleInputBuffer(
947 /*--------------------------------------------------------------
948 * SetConsoleScreenBufferSize
953 SetConsoleScreenBufferSize(
954 HANDLE hConsoleOutput
,
962 /*--------------------------------------------------------------
963 * SetConsoleCursorInfo
968 SetConsoleCursorInfo(
969 HANDLE hConsoleOutput
,
970 CONST CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
973 DWORD dwBytesReturned
;
975 if (DeviceIoControl (hConsoleOutput
,
976 IOCTL_CONSOLE_SET_CURSOR_INFO
,
977 (PCONSOLE_CURSOR_INFO
)lpConsoleCursorInfo
,
978 sizeof(CONSOLE_CURSOR_INFO
),
989 /*--------------------------------------------------------------
990 * ScrollConsoleScreenBufferA
995 ScrollConsoleScreenBufferA(
996 HANDLE hConsoleOutput
,
997 CONST SMALL_RECT
*lpScrollRectangle
,
998 CONST SMALL_RECT
*lpClipRectangle
,
999 COORD dwDestinationOrigin
,
1000 CONST CHAR_INFO
*lpFill
1008 /*--------------------------------------------------------------
1009 * ScrollConsoleScreenBufferW
1014 ScrollConsoleScreenBufferW(
1015 HANDLE hConsoleOutput
,
1016 CONST SMALL_RECT
*lpScrollRectangle
,
1017 CONST SMALL_RECT
*lpClipRectangle
,
1018 COORD dwDestinationOrigin
,
1019 CONST CHAR_INFO
*lpFill
1027 /*--------------------------------------------------------------
1028 * SetConsoleWindowInfo
1033 SetConsoleWindowInfo(
1034 HANDLE hConsoleOutput
,
1036 CONST SMALL_RECT
*lpConsoleWindow
1044 /*--------------------------------------------------------------
1045 * SetConsoleTextAttribute
1050 SetConsoleTextAttribute(
1051 HANDLE hConsoleOutput
,
1055 DWORD dwBytesReturned
;
1057 if (!DeviceIoControl (hConsoleOutput
,
1058 IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE
,
1070 /*--------------------------------------------------------------
1071 * SetConsoleCtrlHandler
1076 SetConsoleCtrlHandler(
1077 PHANDLER_ROUTINE HandlerRoutine
,
1086 /*--------------------------------------------------------------
1087 * GenerateConsoleCtrlEvent
1092 GenerateConsoleCtrlEvent(
1094 DWORD dwProcessGroupId
1102 /*--------------------------------------------------------------
1105 #define MAX_CONSOLE_TITLE_LENGTH 80
1111 LPWSTR lpConsoleTitle
,
1120 /*--------------------------------------------------------------
1129 LPSTR lpConsoleTitle
,
1133 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1134 DWORD nWideTitle
= sizeof WideTitle
;
1137 if (!lpConsoleTitle
|| !nSize
) return 0;
1138 nWideTitle
= GetConsoleTitleW( (LPWSTR
) WideTitle
, nWideTitle
);
1139 if (!nWideTitle
) return 0;
1141 if ( (nWritten
= WideCharToMultiByte(
1142 CP_ACP
, // ANSI code page
1143 0, // performance and mapping flags
1144 (LPWSTR
) WideTitle
, // address of wide-character string
1145 nWideTitle
, // number of characters in string
1146 lpConsoleTitle
, // address of buffer for new string
1147 nSize
, // size of buffer
1152 lpConsoleTitle
[nWritten
] = '\0';
1160 /*--------------------------------------------------------------
1167 LPCWSTR lpConsoleTitle
1175 /*--------------------------------------------------------------
1184 LPCSTR lpConsoleTitle
1187 wchar_t WideTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1188 char AnsiTitle
[MAX_CONSOLE_TITLE_LENGTH
];
1191 if (!lpConsoleTitle
) return FALSE
;
1192 ZeroMemory( WideTitle
, sizeof WideTitle
);
1193 nWideTitle
= lstrlenA(lpConsoleTitle
);
1202 AnsiTitle
[nWideTitle
] = '\0';
1204 if ( MultiByteToWideChar(
1205 CP_ACP
, // ANSI code page
1206 MB_PRECOMPOSED
, // character-type options
1207 AnsiTitle
, // address of string to map
1208 nWideTitle
, // number of characters in string
1209 (LPWSTR
) WideTitle
, // address of wide-character buffer
1210 (-1) // size of buffer: -1=...\0
1213 return SetConsoleTitleW( (LPWSTR
) WideTitle
);
1220 /*--------------------------------------------------------------
1227 HANDLE hConsoleInput
,
1229 DWORD nNumberOfCharsToRead
,
1230 LPDWORD lpNumberOfCharsRead
,
1239 /*--------------------------------------------------------------
1246 HANDLE hConsoleOutput
,
1247 CONST VOID
*lpBuffer
,
1248 DWORD nNumberOfCharsToWrite
,
1249 LPDWORD lpNumberOfCharsWritten
,
1258 /*--------------------------------------------------------------
1259 * CreateConsoleScreenBuffer
1264 CreateConsoleScreenBuffer(
1265 DWORD dwDesiredAccess
,
1267 CONST SECURITY_ATTRIBUTES
*lpSecurityAttributes
,
1269 LPVOID lpScreenBufferData
1277 /*--------------------------------------------------------------
1283 GetConsoleCP( VOID
)
1286 return CP_OEMCP
; /* FIXME */
1290 /*--------------------------------------------------------------
1305 /*--------------------------------------------------------------
1306 * GetConsoleOutputCP
1311 GetConsoleOutputCP( VOID
)
1314 return 0; /* FIXME */
1318 /*--------------------------------------------------------------
1319 * SetConsoleOutputCP