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: subsys/system/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(&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 Buffer
= (CHAR
*)RtlAllocateHeap(ProcessHeap
,
292 nLength
+ sizeof(COORD
));
293 pCoord
= (COORD
*)Buffer
;
294 pText
= (PCHAR
)(pCoord
+ 1);
296 *pCoord
= dwWriteCoord
;
298 /* FIXME: use real unicode->oem conversion */
299 for (i
= 0; i
< nLength
; i
++)
300 pText
[i
] = (CHAR
)lpCharacter
[i
];
302 Status
= NtDeviceIoControlFile(hConsoleOutput
,
307 IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
,
311 nLength
+ sizeof(COORD
));
313 RtlFreeHeap(ProcessHeap
, 0, Buffer
);
314 if (!NT_SUCCESS(Status
))
317 *lpNumberOfCharsWritten
= IoStatusBlock
.Information
;
324 FillConsoleOutputAttribute(
325 IN HANDLE hConsoleOutput
,
328 IN COORD dwWriteCoord
,
329 OUT LPDWORD lpNumberOfAttrsWritten
)
331 IO_STATUS_BLOCK IoStatusBlock
;
332 OUTPUT_ATTRIBUTE Buffer
;
335 Buffer
.wAttribute
= wAttribute
;
336 Buffer
.nLength
= nLength
;
337 Buffer
.dwCoord
= dwWriteCoord
;
339 Status
= NtDeviceIoControlFile(hConsoleOutput
,
344 IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE
,
346 sizeof(OUTPUT_ATTRIBUTE
),
348 sizeof(OUTPUT_ATTRIBUTE
));
349 if (!NT_SUCCESS(Status
))
352 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
359 FillConsoleOutputCharacterA(
360 IN HANDLE hConsoleOutput
,
363 IN COORD dwWriteCoord
,
364 OUT LPDWORD lpNumberOfCharsWritten
)
366 IO_STATUS_BLOCK IoStatusBlock
;
367 OUTPUT_CHARACTER Buffer
;
370 Buffer
.cCharacter
= cCharacter
;
371 Buffer
.nLength
= nLength
;
372 Buffer
.dwCoord
= dwWriteCoord
;
374 Status
= NtDeviceIoControlFile(hConsoleOutput
,
379 IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER
,
381 sizeof(OUTPUT_CHARACTER
),
383 sizeof(OUTPUT_CHARACTER
));
384 if (!NT_SUCCESS(Status
))
387 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
394 GetConsoleScreenBufferInfo(
395 IN HANDLE hConsoleOutput
,
396 OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
398 IO_STATUS_BLOCK IoStatusBlock
;
401 Status
= NtDeviceIoControlFile(hConsoleOutput
,
406 IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO
,
409 lpConsoleScreenBufferInfo
,
410 sizeof(CONSOLE_SCREEN_BUFFER_INFO
));
411 return NT_SUCCESS(Status
);
417 SetConsoleCursorInfo(
418 IN HANDLE hConsoleOutput
,
419 IN
const CONSOLE_CURSOR_INFO
*lpConsoleCursorInfo
)
421 IO_STATUS_BLOCK IoStatusBlock
;
424 Status
= NtDeviceIoControlFile(hConsoleOutput
,
429 IOCTL_CONSOLE_SET_CURSOR_INFO
,
430 (PCONSOLE_CURSOR_INFO
)lpConsoleCursorInfo
,
431 sizeof(CONSOLE_CURSOR_INFO
),
434 return NT_SUCCESS(Status
);
440 SetConsoleCursorPosition(
441 IN HANDLE hConsoleOutput
,
442 IN COORD dwCursorPosition
)
444 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo
;
445 IO_STATUS_BLOCK IoStatusBlock
;
448 Status
= GetConsoleScreenBufferInfo(hConsoleOutput
, &ConsoleScreenBufferInfo
);
449 if (!NT_SUCCESS(Status
))
452 ConsoleScreenBufferInfo
.dwCursorPosition
.X
= dwCursorPosition
.X
;
453 ConsoleScreenBufferInfo
.dwCursorPosition
.Y
= dwCursorPosition
.Y
;
455 Status
= NtDeviceIoControlFile(hConsoleOutput
,
460 IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO
,
461 &ConsoleScreenBufferInfo
,
462 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
465 return NT_SUCCESS(Status
);
471 SetConsoleTextAttribute(
472 IN HANDLE hConsoleOutput
,
475 IO_STATUS_BLOCK IoStatusBlock
;
478 Status
= NtDeviceIoControlFile(hConsoleOutput
,
483 IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE
,
488 return NT_SUCCESS(Status
);
497 HANDLE hConsoleOutput
;
498 IO_STATUS_BLOCK IoStatusBlock
;
501 hConsoleOutput
= GetStdHandle(STD_OUTPUT_HANDLE
);
503 Status
= NtDeviceIoControlFile(hConsoleOutput
,
508 IOCTL_CONSOLE_LOADFONT
,
513 return NT_SUCCESS(Status
);