Add method to flush console input buffer
authorHervé Poussineau <hpoussin@reactos.org>
Fri, 2 Nov 2007 12:37:50 +0000 (12:37 +0000)
committerHervé Poussineau <hpoussin@reactos.org>
Fri, 2 Nov 2007 12:37:50 +0000 (12:37 +0000)
svn path=/trunk/; revision=30067

reactos/base/setup/usetup/native/utils/console.c

index 15cc656..f3b6d65 100644 (file)
@@ -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;