From 4885fbac2a0be163eb6fe5b770887cb378b5c826 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Fri, 2 Nov 2007 12:37:50 +0000 Subject: [PATCH] Add method to flush console input buffer svn path=/trunk/; revision=30067 --- .../base/setup/usetup/native/utils/console.c | 56 ++++++++++++++++--- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/reactos/base/setup/usetup/native/utils/console.c b/reactos/base/setup/usetup/native/utils/console.c index 15cc656b65f..f3b6d658a71 100644 --- a/reactos/base/setup/usetup/native/utils/console.c +++ b/reactos/base/setup/usetup/native/utils/console.c @@ -57,7 +57,7 @@ AllocConsole(VOID) FILE_ALL_ACCESS, &ObjectAttributes, &IoStatusBlock, - 0, + FILE_OPEN, FILE_SYNCHRONOUS_IO_ALERT); if (!NT_SUCCESS(Status)) return FALSE; @@ -74,8 +74,8 @@ AllocConsole(VOID) FILE_ALL_ACCESS, &ObjectAttributes, &IoStatusBlock, - 0, - FILE_SYNCHRONOUS_IO_ALERT); + FILE_OPEN, + 0); if (!NT_SUCCESS(Status)) return FALSE; @@ -92,15 +92,12 @@ AttachConsole( BOOL WINAPI FreeConsole(VOID) { - DPRINT("FreeConsole() called\n"); - if (StdInput != INVALID_HANDLE_VALUE) NtClose(StdInput); if (StdOutput != INVALID_HANDLE_VALUE) NtClose(StdOutput); - DPRINT("FreeConsole() done\n"); return TRUE; } @@ -147,6 +144,42 @@ GetStdHandle( } } +BOOL WINAPI +FlushConsoleInputBuffer( + IN HANDLE hConsoleInput) +{ + LARGE_INTEGER Offset, Timeout; + IO_STATUS_BLOCK IoStatusBlock; + KEYBOARD_INPUT_DATA InputData; + NTSTATUS Status; + + do + { + Offset.QuadPart = 0; + Status = NtReadFile( + hConsoleInput, + NULL, + NULL, + NULL, + &IoStatusBlock, + &InputData, + sizeof(KEYBOARD_INPUT_DATA), + &Offset, + 0); + if (Status == STATUS_PENDING) + { + Timeout.QuadPart = -100; + Status = NtWaitForSingleObject(hConsoleInput, FALSE, &Timeout); + if (Status == STATUS_TIMEOUT) + { + NtCancelIoFile(hConsoleInput, &IoStatusBlock); + return TRUE; + } + } + } while (NT_SUCCESS(Status)); + return FALSE; +} + BOOL WINAPI ReadConsoleInput( IN HANDLE hConsoleInput, @@ -154,11 +187,12 @@ ReadConsoleInput( IN DWORD nLength, OUT LPDWORD lpNumberOfEventsRead) { + LARGE_INTEGER Offset; IO_STATUS_BLOCK IoStatusBlock; KEYBOARD_INPUT_DATA InputData; NTSTATUS Status; - lpBuffer->EventType = KEY_EVENT; + Offset.QuadPart = 0; Status = NtReadFile( hConsoleInput, NULL, @@ -167,11 +201,17 @@ ReadConsoleInput( &IoStatusBlock, &InputData, sizeof(KEYBOARD_INPUT_DATA), - NULL, + &Offset, 0); + if (Status == STATUS_PENDING) + { + Status = NtWaitForSingleObject(hConsoleInput, FALSE, NULL); + Status = IoStatusBlock.Status; + } if (!NT_SUCCESS(Status)) return FALSE; + lpBuffer->EventType = KEY_EVENT; Status = IntTranslateKey(&InputData, &lpBuffer->Event.KeyEvent); if (!NT_SUCCESS(Status)) return FALSE;