kernel32: Use IOCTL_CONDRV_READ_CONSOLE in ReadConsoleW when possible.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2020-09-14 18:46:48 +02:00 committed by Alexandre Julliard
parent 0cdb070b76
commit 666c5b6e20
2 changed files with 14 additions and 3 deletions

View File

@ -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)

View File

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