Jacek Caban : kernel32: Use IOCTL_CONDRV_WRITE_CONSOLE in WriteConsoleW when possible.
Alexandre Julliard
julliard at winehq.org
Fri Sep 11 14:51:45 CDT 2020
Module: wine
Branch: master
Commit: ab6056d6774310162ef268ca6af5e3ad2e556a4e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ab6056d6774310162ef268ca6af5e3ad2e556a4e
Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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);
More information about the wine-cvs
mailing list