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 *****************************************************************/
42 UNICODE_STRING ScreenName
= RTL_CONSTANT_STRING(L
"\\??\\BlueScreen");
43 UNICODE_STRING KeyboardName
= RTL_CONSTANT_STRING(L
"\\Device\\KeyboardClass0");
44 OBJECT_ATTRIBUTES ObjectAttributes
;
45 IO_STATUS_BLOCK IoStatusBlock
;
49 InitializeObjectAttributes(
61 FILE_SYNCHRONOUS_IO_ALERT
);
62 if (!NT_SUCCESS(Status
))
65 /* Open the keyboard */
66 InitializeObjectAttributes(
79 if (!NT_SUCCESS(Status
))
95 if (StdInput
!= INVALID_HANDLE_VALUE
)
98 if (StdOutput
!= INVALID_HANDLE_VALUE
)
106 IN HANDLE hConsoleOutput
,
107 IN
const VOID
* lpBuffer
,
108 IN DWORD nNumberOfCharsToWrite
,
109 OUT LPDWORD lpNumberOfCharsWritten
,
110 IN LPVOID lpReserved
)
112 IO_STATUS_BLOCK IoStatusBlock
;
115 Status
= NtWriteFile(
122 nNumberOfCharsToWrite
,
125 if (!NT_SUCCESS(Status
))
128 *lpNumberOfCharsWritten
= IoStatusBlock
.Information
;
138 case STD_INPUT_HANDLE
:
140 case STD_OUTPUT_HANDLE
:
143 return INVALID_HANDLE_VALUE
;
148 FlushConsoleInputBuffer(
149 IN HANDLE hConsoleInput
)
151 LARGE_INTEGER Offset
, Timeout
;
152 IO_STATUS_BLOCK IoStatusBlock
;
153 KEYBOARD_INPUT_DATA InputData
;
166 sizeof(KEYBOARD_INPUT_DATA
),
169 if (Status
== STATUS_PENDING
)
171 Timeout
.QuadPart
= -100;
172 Status
= NtWaitForSingleObject(hConsoleInput
, FALSE
, &Timeout
);
173 if (Status
== STATUS_TIMEOUT
)
175 NtCancelIoFile(hConsoleInput
, &IoStatusBlock
);
179 } while (NT_SUCCESS(Status
));
185 IN HANDLE hConsoleInput
,
186 OUT PINPUT_RECORD lpBuffer
,
188 OUT LPDWORD lpNumberOfEventsRead
)
190 LARGE_INTEGER Offset
;
191 IO_STATUS_BLOCK IoStatusBlock
;
192 KEYBOARD_INPUT_DATA InputData
;
203 sizeof(KEYBOARD_INPUT_DATA
),
206 if (Status
== STATUS_PENDING
)
208 Status
= NtWaitForSingleObject(hConsoleInput
, FALSE
, NULL
);
209 Status
= IoStatusBlock
.Status
;
211 if (!NT_SUCCESS(Status
))
214 lpBuffer
->EventType
= KEY_EVENT
;
215 Status
= IntTranslateKey(&InputData
, &lpBuffer
->Event
.KeyEvent
);
216 if (!NT_SUCCESS(Status
))
219 *lpNumberOfEventsRead
= 1;
224 WriteConsoleOutputCharacterA(
225 HANDLE hConsoleOutput
,
226 IN LPCSTR lpCharacter
,
228 IN COORD dwWriteCoord
,
229 OUT LPDWORD lpNumberOfCharsWritten
)
231 IO_STATUS_BLOCK IoStatusBlock
;
237 Buffer
= (CHAR
*) RtlAllocateHeap(
240 nLength
+ sizeof(COORD
));
241 pCoord
= (COORD
*)Buffer
;
242 pText
= (PCHAR
)(pCoord
+ 1);
244 *pCoord
= dwWriteCoord
;
245 memcpy(pText
, lpCharacter
, nLength
);
247 Status
= NtDeviceIoControlFile(
253 IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
,
257 nLength
+ sizeof(COORD
));
263 if (!NT_SUCCESS(Status
))
266 *lpNumberOfCharsWritten
= IoStatusBlock
.Information
;
271 WriteConsoleOutputCharacterW(
272 HANDLE hConsoleOutput
,
273 IN LPCWSTR lpCharacter
,
275 IN COORD dwWriteCoord
,
276 OUT LPDWORD lpNumberOfCharsWritten
)
278 IO_STATUS_BLOCK IoStatusBlock
;
285 Buffer
= (CHAR
*) RtlAllocateHeap(
288 nLength
+ sizeof(COORD
));
289 pCoord
= (COORD
*)Buffer
;
290 pText
= (PCHAR
)(pCoord
+ 1);
292 *pCoord
= dwWriteCoord
;
294 /* FIXME: use real unicode->oem conversion */
295 for (i
= 0; i
< nLength
; i
++)
296 pText
[i
] = (CHAR
)lpCharacter
[i
];
298 Status
= NtDeviceIoControlFile(
304 IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER
,
308 nLength
+ sizeof(COORD
));
314 if (!NT_SUCCESS(Status
))
317 *lpNumberOfCharsWritten
= IoStatusBlock
.Information
;
322 FillConsoleOutputAttribute(
323 IN HANDLE hConsoleOutput
,
326 IN COORD dwWriteCoord
,
327 OUT LPDWORD lpNumberOfAttrsWritten
)
329 IO_STATUS_BLOCK IoStatusBlock
;
330 OUTPUT_ATTRIBUTE Buffer
;
333 Buffer
.wAttribute
= wAttribute
;
334 Buffer
.nLength
= nLength
;
335 Buffer
.dwCoord
= dwWriteCoord
;
337 Status
= NtDeviceIoControlFile(
343 IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE
,
345 sizeof(OUTPUT_ATTRIBUTE
),
347 sizeof(OUTPUT_ATTRIBUTE
));
349 if (!NT_SUCCESS(Status
))
352 *lpNumberOfAttrsWritten
= Buffer
.dwTransfered
;
357 FillConsoleOutputCharacterA(
358 IN HANDLE hConsoleOutput
,
361 IN COORD dwWriteCoord
,
362 OUT LPDWORD lpNumberOfCharsWritten
)
364 IO_STATUS_BLOCK IoStatusBlock
;
365 OUTPUT_CHARACTER Buffer
;
368 Buffer
.cCharacter
= cCharacter
;
369 Buffer
.nLength
= nLength
;
370 Buffer
.dwCoord
= dwWriteCoord
;
372 Status
= NtDeviceIoControlFile(
378 IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER
,
380 sizeof(OUTPUT_CHARACTER
),
382 sizeof(OUTPUT_CHARACTER
));
383 if (!NT_SUCCESS(Status
))
386 *lpNumberOfCharsWritten
= Buffer
.dwTransfered
;
391 GetConsoleScreenBufferInfo(
392 IN HANDLE hConsoleOutput
,
393 OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
)
395 IO_STATUS_BLOCK IoStatusBlock
;
398 Status
= NtDeviceIoControlFile(
404 IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO
,
407 lpConsoleScreenBufferInfo
,
408 sizeof(CONSOLE_SCREEN_BUFFER_INFO
));
409 return NT_SUCCESS(Status
);
413 SetConsoleCursorInfo(
414 IN HANDLE hConsoleOutput
,
415 IN
const CONSOLE_CURSOR_INFO
* lpConsoleCursorInfo
)
417 IO_STATUS_BLOCK IoStatusBlock
;
420 Status
= NtDeviceIoControlFile(
426 IOCTL_CONSOLE_SET_CURSOR_INFO
,
427 (PCONSOLE_CURSOR_INFO
)lpConsoleCursorInfo
,
428 sizeof(CONSOLE_CURSOR_INFO
),
431 return NT_SUCCESS(Status
);
435 SetConsoleCursorPosition(
436 IN HANDLE hConsoleOutput
,
437 IN COORD dwCursorPosition
)
439 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo
;
440 IO_STATUS_BLOCK IoStatusBlock
;
443 Status
= GetConsoleScreenBufferInfo(hConsoleOutput
, &ConsoleScreenBufferInfo
);
444 if (!NT_SUCCESS(Status
))
447 ConsoleScreenBufferInfo
.dwCursorPosition
.X
= dwCursorPosition
.X
;
448 ConsoleScreenBufferInfo
.dwCursorPosition
.Y
= dwCursorPosition
.Y
;
450 Status
= NtDeviceIoControlFile(
456 IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO
,
457 &ConsoleScreenBufferInfo
,
458 sizeof(CONSOLE_SCREEN_BUFFER_INFO
),
462 return NT_SUCCESS(Status
);
466 SetConsoleTextAttribute(
467 IN HANDLE hConsoleOutput
,
470 IO_STATUS_BLOCK IoStatusBlock
;
473 Status
= NtDeviceIoControlFile(
479 IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE
,
484 return NT_SUCCESS(Status
);
491 HANDLE hConsoleOutput
;
492 IO_STATUS_BLOCK IoStatusBlock
;
495 hConsoleOutput
= GetStdHandle(STD_OUTPUT_HANDLE
);
497 Status
= NtDeviceIoControlFile(
503 IOCTL_CONSOLE_LOADFONT
,
508 return NT_SUCCESS(Status
);