Jacek Caban : kernel32: Use IOCTL_CONDRV_WRITE_CONSOLE in WriteConsoleW when possible.
Module: wine Branch: master Commit: ab6056d6774310162ef268ca6af5e3ad2e556a4e URL: https://source.winehq.org/git/wine.git/?a=commit;h=ab6056d6774310162ef268ca6... Author: Jacek Caban <jacek(a)codeweavers.com> Date: Fri Sep 11 14:31:07 2020 +0200 kernel32: Use IOCTL_CONDRV_WRITE_CONSOLE in WriteConsoleW when possible. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/console.c | 7 +++++++ server/console.c | 9 +++++++-- server/trace.c | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c index 5b5722847f..afac9be760 100644 --- a/dlls/kernel32/console.c +++ b/dlls/kernel32/console.c @@ -794,6 +794,13 @@ BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumber if (lpNumberOfCharsWritten) *lpNumberOfCharsWritten = 0; + if (DeviceIoControl(hConsoleOutput, IOCTL_CONDRV_WRITE_CONSOLE, (void *)lpBuffer, + nNumberOfCharsToWrite * sizeof(WCHAR), NULL, 0, NULL, NULL)) + { + if (lpNumberOfCharsWritten) *lpNumberOfCharsWritten = nNumberOfCharsToWrite; + return TRUE; + } + if ((fd = get_console_bare_fd(hConsoleOutput)) != -1) { char* ptr; diff --git a/server/console.c b/server/console.c index 6a4a0b60d5..c9db27935e 100644 --- a/server/console.c +++ b/server/console.c @@ -2106,8 +2106,13 @@ static int screen_buffer_ioctl( struct fd *fd, ioctl_code_t code, struct async * } default: - set_error( STATUS_INVALID_HANDLE ); - return 0; + if (!screen_buffer->input || !screen_buffer->input->server || code >> 16 != FILE_DEVICE_CONSOLE) + { + set_error( STATUS_INVALID_HANDLE ); + return 0; + } + return queue_host_ioctl( screen_buffer->input->server, code, screen_buffer->id, + async, &screen_buffer->ioctl_q ); } } diff --git a/server/trace.c b/server/trace.c index a0174a1bd6..c93e4fe3b4 100644 --- a/server/trace.c +++ b/server/trace.c @@ -128,6 +128,7 @@ static void dump_ioctl_code( const char *prefix, const ioctl_code_t *code ) CASE(IOCTL_CONDRV_READ_OUTPUT); CASE(IOCTL_CONDRV_SET_MODE); CASE(IOCTL_CONDRV_SET_OUTPUT_INFO); + CASE(IOCTL_CONDRV_WRITE_CONSOLE); CASE(IOCTL_CONDRV_WRITE_INPUT); CASE(IOCTL_CONDRV_WRITE_OUTPUT); CASE(FSCTL_DISMOUNT_VOLUME);
participants (1)
-
Alexandre Julliard