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 ); } }