3 * Copyright (C) 2002 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS text-mode setup
22 * FILE: base/setup/usetup/console.c
23 * PURPOSE: Console support functions
24 * PROGRAMMER: Eric Kohl
27 /* INCLUDES ******************************************************************/
30 /* Blue Driver Header */
31 #include <blue/ntddblue.h>
37 /* FUNCTIONS *****************************************************************/
43 UNICODE_STRING ScreenName
= RTL_CONSTANT_STRING(L
"\\??\\BlueScreen");
44 UNICODE_STRING KeyboardName
= RTL_CONSTANT_STRING(L
"\\Device\\KeyboardClass0");
45 OBJECT_ATTRIBUTES ObjectAttributes
;
46 IO_STATUS_BLOCK IoStatusBlock
;
50 InitializeObjectAttributes(&ObjectAttributes
,
55 Status
= NtOpenFile(&StdOutput
,
60 FILE_SYNCHRONOUS_IO_ALERT
);
61 if (!NT_SUCCESS(Status
))
64 /* Open the keyboard */
65 InitializeObjectAttributes(&ObjectAttributes
,
70 Status
= NtOpenFile(&StdInput
,
76 if (!NT_SUCCESS(Status
))
96 if (StdInput
!= INVALID_HANDLE_VALUE
)
99 if (StdOutput
!= INVALID_HANDLE_VALUE
)
109 IN HANDLE hConsoleOutput
,
110 IN
const VOID
*lpBuffer
,
111 IN DWORD nNumberOfCharsToWrite
,
112 OUT LPDWORD lpNumberOfCharsWritten
,
113 IN LPVOID lpReserved
)
115 IO_STATUS_BLOCK IoStatusBlock
;
118 Status
= NtWriteFile(hConsoleOutput
,
124 nNumberOfCharsToWrite
,
127 if (!NT_SUCCESS(Status
))
130 *lpNumberOfCharsWritten
= IoStatusBlock
.Information
;
142 case STD_INPUT_HANDLE
:
144 case STD_OUTPUT_HANDLE
:
147 return INVALID_HANDLE_VALUE
;
154 FlushConsoleInputBuffer(
155 IN HANDLE hConsoleInput
)
157 LARGE_INTEGER Offset
, Timeout
;
158 IO_STATUS_BLOCK IoStatusBlock
;
159 KEYBOARD_INPUT_DATA InputData
;
165 Status
= NtReadFile(hConsoleInput
,
171 sizeof(KEYBOARD_INPUT_DATA
),
174 if (Status
== STATUS_PENDING
)
176 Timeout
.QuadPart
= -100;
177 Status
= NtWaitForSingleObject(hConsoleInput
, FALSE
, &Timeout
);
178 if (Status
== STATUS_TIMEOUT
)
180 NtCancelIoFile(hConsoleInput
, &IoStatusBlock
);
184 } while (NT_SUCCESS(Status
));
192 IN HANDLE hConsoleInput
,
193 OUT PINPUT_RECORD lpBuffer
,
195 OUT LPDWORD lpNumberOfEventsRead
)
197 LARGE_INTEGER Offset
;
198 IO_STATUS_BLOCK IoStatusBlock
;
199 KEYBOARD_INPUT_DATA InputData
;
203 Status
= NtReadFile(hConsoleInput
,
209 sizeof(KEYBOARD_INPUT_DATA
),
212 if (Status
== STATUS_PENDING
)
214 Status
= NtWaitForSingleObject(hConsoleInput
, FALSE
, NULL
);
215 Status
= IoStatusBlock
.Status
;
217 if (!NT_SUCCESS(Status
))
220 lpBuffer
->EventType
= KEY_EVENT
;
221 Status
= IntTranslateKey(hConsoleInput
, &InputData
, &lpBuffer
->Event
.KeyEvent
);
222 if (!NT_SUCCESS(Status
))
225 *lpNumberOfEventsRead
= 1;
232 WriteConsoleOutputCharacterA(
233 HANDLE hConsoleOutput
,
234 IN LPCSTR lpCharacter
,
236 IN COORD dwWriteCoord
,
237 OUT LPDWORD lpNumberOfCharsWritten
)
239 IO_STATUS_BLOCK IoStatusBlock
;
245 Buffer
= (CHAR
*)RtlAllocateHeap(ProcessHeap
,
247 nLength
+ sizeof(COORD
));
248 pCoord
= (COORD
*)Buffer
;
249 pText
= (PCHAR
)(pCoord
+ 1);
251 *pCoord
= dwWriteCoord
;
252 memcpy(pText
, lpCharacter
, nLength
);
254 Status
= NtDeviceIoControlFile(hConsoleOutput
,
259 IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
,
263 nLength
+ sizeof(COORD
));
265 RtlFreeHeap(ProcessHeap
, 0, Buffer
);
266 if (!NT_SUCCESS(Status
))
269 *lpNumberOfCharsWritten
= IoStatusBlock
.Information
;
276 WriteConsoleOutputCharacterW(
277 HANDLE hConsoleOutput
,
278 IN LPCWSTR lpCharacter
,
280 IN COORD dwWriteCoord
,
281 OUT LPDWORD lpNumberOfCharsWritten
)
283 IO_STATUS_BLOCK IoStatusBlock
;
290 UNICODE_STRING UnicodeString
;
291 OEM_STRING OemString
;
294 UnicodeString
.Length
= nLength
* sizeof(WCHAR
);
295 UnicodeString
.MaximumLength
= nLength
* sizeof(WCHAR
);
296 UnicodeString
.Buffer
= (LPWSTR
)lpCharacter
;
298 OemLength
= RtlUnicodeStringToOemSize(&UnicodeString
);
301 Buffer
= (CHAR
*)RtlAllocateHeap(ProcessHeap
,
303 OemLength
+ sizeof(COORD
));
304 // nLength + sizeof(COORD));
308 pCoord
= (COORD
*)Buffer
;
309 pText
= (PCHAR
)(pCoord
+ 1);
311 *pCoord
= dwWriteCoord
;
313 OemString
.Length
= 0;
314 OemString
.MaximumLength
= OemLength
;
315 OemString
.Buffer
= pText
;
317 Status
= RtlUnicodeStringToOemString(&OemString
,
320 if (!NT_SUCCESS(Status
))
323 /* FIXME: use real unicode->oem conversion */
324 // for (i = 0; i < nLength; i++)
325 // pText[i] = (CHAR)lpCharacter[i];
327 Status
= NtDeviceIoControlFile(hConsoleOutput
,
332 IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
,
336 nLength
+ sizeof(COORD
));
339 RtlFreeHeap(ProcessHeap
, 0, Buffer
);
340 if (!NT_SUCCESS(Status
))
343 *lpNumberOfCharsWritten
= IoStatusBlock
.Information
;
350 FillConsoleOutputAttribute(
351 IN HANDLE hConsoleOutput
,
354 IN COORD dwWriteCoord
,
355 OUT LPDWORD lpNumberOfAttrsWritten
)
357 IO_STATUS_BLOCK IoStatusBlock
;
358 OUTPUT_ATTRIBUTE Buffer
;
361 Buffer
.wAttribute
= wAttribute
;
362 Buffer
.nLength
= nLength
;
363 Buffer
.dwCoord
= dwWriteCoord
;
365 Status
= NtDeviceIoControlFile(hConsoleOutput
,
370 IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE
,
372 sizeof(OUTPUT_ATTRIBUTE
),
374 sizeof(OUTPUT_ATTRIBUTE
));
375 if (!NT_SUCCESS(Status
))
378 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
385 FillConsoleOutputCharacterA(
386 IN HANDLE hConsoleOutput
,
389 IN COORD dwWriteCoord
,
390 OUT LPDWORD lpNumberOfCharsWritten
)
392 IO_STATUS_BLOCK IoStatusBlock
;
393 OUTPUT_CHARACTER Buffer
;
396 Buffer
.cCharacter
= cCharacter
;
397 Buffer
.nLength
= nLength
;
398 Buffer
.dwCoord
= dwWriteCoord
;
400 Status
= NtDeviceIoControlFile(hConsoleOutput
,
405 IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER
,
407 sizeof(OUTPUT_CHARACTER
),
409 sizeof(OUTPUT_CHARACTER
));
410 if (!NT_SUCCESS(Status
))
413 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
420 GetConsoleScreenBufferInfo(
421 IN HANDLE hConsoleOutput
,
422 OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
424 IO_STATUS_BLOCK IoStatusBlock
;
427 Status
= NtDeviceIoControlFile(hConsoleOutput
,
432 IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO
,
435 lpConsoleScreenBufferInfo
,
436 sizeof(CONSOLE_SCREEN_BUFFER_INFO
));
437 return NT_SUCCESS(Status
);
443 SetConsoleCursorInfo(
444 IN HANDLE hConsoleOutput
,
445 IN
const CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
447 IO_STATUS_BLOCK IoStatusBlock
;
450 Status
= NtDeviceIoControlFile(hConsoleOutput
,
455 IOCTL_CONSOLE_SET_CURSOR_INFO
,
456 (PCONSOLE_CURSOR_INFO
)lpConsoleCursorInfo
,
457 sizeof(CONSOLE_CURSOR_INFO
),
460 return NT_SUCCESS(Status
);
466 SetConsoleCursorPosition(
467 IN HANDLE hConsoleOutput
,
468 IN COORD dwCursorPosition
)
470 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo
;
471 IO_STATUS_BLOCK IoStatusBlock
;
474 Status
= GetConsoleScreenBufferInfo(hConsoleOutput
, &ConsoleScreenBufferInfo
);
475 if (!NT_SUCCESS(Status
))
478 ConsoleScreenBufferInfo
.dwCursorPosition
.X
= dwCursorPosition
.X
;
479 ConsoleScreenBufferInfo
.dwCursorPosition
.Y
= dwCursorPosition
.Y
;
481 Status
= NtDeviceIoControlFile(hConsoleOutput
,
486 IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO
,
487 &ConsoleScreenBufferInfo
,
488 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
491 return NT_SUCCESS(Status
);
497 SetConsoleTextAttribute(
498 IN HANDLE hConsoleOutput
,
501 IO_STATUS_BLOCK IoStatusBlock
;
504 Status
= NtDeviceIoControlFile(hConsoleOutput
,
509 IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE
,
514 return NT_SUCCESS(Status
);
523 HANDLE hConsoleOutput
;
524 IO_STATUS_BLOCK IoStatusBlock
;
527 hConsoleOutput
= GetStdHandle(STD_OUTPUT_HANDLE
);
529 Status
= NtDeviceIoControlFile(hConsoleOutput
,
534 IOCTL_CONSOLE_LOADFONT
,
539 return NT_SUCCESS(Status
);