From 666c5b6e20e3b9e1e34d10b88372406f494699f2 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 14 Sep 2020 18:46:48 +0200 Subject: [PATCH] kernel32: Use IOCTL_CONDRV_READ_CONSOLE in ReadConsoleW when possible. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/kernel32/console.c | 7 +++++++ server/console.c | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c index afac9be7605..47083b27af0 100644 --- a/dlls/kernel32/console.c +++ b/dlls/kernel32/console.c @@ -541,6 +541,13 @@ BOOL WINAPI ReadConsoleW(HANDLE hConsoleInput, LPVOID lpBuffer, return FALSE; } + if (DeviceIoControl(hConsoleInput, IOCTL_CONDRV_READ_CONSOLE, NULL, 0, lpBuffer, + nNumberOfCharsToRead * sizeof(WCHAR), lpNumberOfCharsRead, NULL)) + { + *lpNumberOfCharsRead /= sizeof(WCHAR); + return TRUE; + } + if (!GetConsoleMode(hConsoleInput, &mode)) return FALSE; if ((fd = get_console_bare_fd(hConsoleInput)) != -1) diff --git a/server/console.c b/server/console.c index c9db27935e6..c2328f9da97 100644 --- a/server/console.c +++ b/server/console.c @@ -1693,7 +1693,7 @@ static struct object *create_console_server( void ) static int is_blocking_read_ioctl( unsigned int code ) { - return code == IOCTL_CONDRV_READ_INPUT; + return code == IOCTL_CONDRV_READ_INPUT || code == IOCTL_CONDRV_READ_CONSOLE; } static int console_input_ioctl( struct fd *fd, ioctl_code_t code, struct async *async ) @@ -1898,8 +1898,12 @@ static int console_input_ioctl( struct fd *fd, ioctl_code_t code, struct async * } default: - set_error( STATUS_INVALID_HANDLE ); - return 0; + if (!console->server || code >> 16 != FILE_DEVICE_CONSOLE) + { + set_error( STATUS_INVALID_HANDLE ); + return 0; + } + return queue_host_ioctl( console->server, code, 0, async, &console->ioctl_q ); } }