Jacek Caban : kernel32: Use new IOCTL_CONDRV_SCROLL ioctl for FlushConsoleInputBuffer implementation.

Alexandre Julliard julliard at winehq.org
Thu Oct 15 15:41:10 CDT 2020


Module: wine
Branch: master
Commit: 6f05b299bce211ef11dd5b046da4247e111cb91d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6f05b299bce211ef11dd5b046da4247e111cb91d

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Oct 15 18:19:36 2020 +0200

kernel32: Use new IOCTL_CONDRV_SCROLL ioctl for FlushConsoleInputBuffer implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/console.c    | 28 +---------------------------
 include/wine/condrv.h      |  1 +
 programs/conhost/conhost.c | 10 ++++++++--
 3 files changed, 10 insertions(+), 29 deletions(-)

diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c
index 2b46fe5589f..f9d24f5c885 100644
--- a/dlls/kernel32/console.c
+++ b/dlls/kernel32/console.c
@@ -148,38 +148,12 @@ HANDLE WINAPI GetConsoleInputWaitHandle(void)
 }
 
 
-/******************************************************************************
- * read_console_input
- *
- * Helper function for ReadConsole, ReadConsoleInput and FlushConsoleInputBuffer
- *
- * Returns
- *      0 for error, 1 for no INPUT_RECORD ready, 2 with INPUT_RECORD ready
- */
-enum read_console_input_return {rci_error = 0, rci_timeout = 1, rci_gotone = 2};
-
-static enum read_console_input_return read_console_input(HANDLE handle, PINPUT_RECORD ir, DWORD timeout)
-{
-    int blocking = timeout != 0;
-    DWORD read_bytes;
-
-    if (!DeviceIoControl( handle, IOCTL_CONDRV_READ_INPUT, &blocking, sizeof(blocking), ir, sizeof(*ir), &read_bytes, NULL ))
-        return rci_error;
-    return read_bytes ? rci_gotone : rci_timeout;
-}
-
-
 /***********************************************************************
  *            FlushConsoleInputBuffer   (KERNEL32.@)
  */
 BOOL WINAPI FlushConsoleInputBuffer( HANDLE handle )
 {
-    enum read_console_input_return      last;
-    INPUT_RECORD                        ir;
-
-    while ((last = read_console_input(handle, &ir, 0)) == rci_gotone);
-
-    return last == rci_timeout;
+    return DeviceIoControl( handle, IOCTL_CONDRV_FLUSH, NULL, 0, NULL, 0, NULL, NULL );
 }
 
 
diff --git a/include/wine/condrv.h b/include/wine/condrv.h
index eed8bc5bfcf..cf2524edc66 100644
--- a/include/wine/condrv.h
+++ b/include/wine/condrv.h
@@ -39,6 +39,7 @@
 #define IOCTL_CONDRV_SET_TITLE             CTL_CODE(FILE_DEVICE_CONSOLE, 17, METHOD_BUFFERED, FILE_WRITE_ACCESS)
 #define IOCTL_CONDRV_CTRL_EVENT            CTL_CODE(FILE_DEVICE_CONSOLE, 18, METHOD_BUFFERED, FILE_WRITE_ACCESS)
 #define IOCTL_CONDRV_BEEP                  CTL_CODE(FILE_DEVICE_CONSOLE, 19, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_CONDRV_FLUSH                 CTL_CODE(FILE_DEVICE_CONSOLE, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
 /* console output ioctls */
 #define IOCTL_CONDRV_WRITE_CONSOLE         CTL_CODE(FILE_DEVICE_CONSOLE, 30, METHOD_BUFFERED, FILE_WRITE_ACCESS)
diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c
index a93f9be73b2..8fb28e18ba9 100644
--- a/programs/conhost/conhost.c
+++ b/programs/conhost/conhost.c
@@ -2321,8 +2321,8 @@ static NTSTATUS screen_buffer_ioctl( struct screen_buffer *screen_buffer, unsign
         return scroll_output( screen_buffer, in_data );
 
     default:
-        FIXME( "unsupported ioctl %x\n", code );
-        return STATUS_NOT_SUPPORTED;
+        WARN( "invalid ioctl %x\n", code );
+        return STATUS_INVALID_HANDLE;
     }
 }
 
@@ -2439,6 +2439,12 @@ static NTSTATUS console_input_ioctl( struct console *console, unsigned int code,
         }
         return STATUS_SUCCESS;
 
+    case IOCTL_CONDRV_FLUSH:
+        if (in_size || *out_size) return STATUS_INVALID_PARAMETER;
+        TRACE( "flush\n" );
+        console->record_count = 0;
+        return STATUS_SUCCESS;
+
     default:
         FIXME( "unsupported ioctl %x\n", code );
         return STATUS_NOT_SUPPORTED;




More information about the wine-cvs mailing list