Jacek Caban : kernelbase: Move Unicode conversion from WriteConsoleA to conhost.
Alexandre Julliard
julliard at winehq.org
Tue Nov 17 15:04:08 CST 2020
Module: wine
Branch: master
Commit: 4cc4ea449be5bdc78971556829b2dc83d06d74d8
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4cc4ea449be5bdc78971556829b2dc83d06d74d8
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Nov 17 18:58:02 2020 +0100
kernelbase: Move Unicode conversion from WriteConsoleA to conhost.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernelbase/console.c | 13 ++++---------
include/wine/condrv.h | 15 ++++++++-------
programs/conhost/conhost.c | 16 ++++++++++++++++
3 files changed, 28 insertions(+), 16 deletions(-)
diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index 9fc34e3c9bc..47329886f07 100644
--- a/dlls/kernelbase/console.c
+++ b/dlls/kernelbase/console.c
@@ -1634,17 +1634,12 @@ BOOL WINAPI ReadConsoleW( HANDLE handle, void *buffer, DWORD length, DWORD *coun
BOOL WINAPI DECLSPEC_HOTPATCH WriteConsoleA( HANDLE handle, const void *buffer, DWORD length,
DWORD *written, void *reserved )
{
- UINT cp = GetConsoleOutputCP();
- LPWSTR strW;
- DWORD lenW;
BOOL ret;
- if (written) *written = 0;
- lenW = MultiByteToWideChar( cp, 0, buffer, length, NULL, 0 );
- if (!(strW = HeapAlloc( GetProcessHeap(), 0, lenW * sizeof(WCHAR) ))) return FALSE;
- MultiByteToWideChar( cp, 0, buffer, length, strW, lenW );
- ret = WriteConsoleW( handle, strW, lenW, written, 0 );
- HeapFree( GetProcessHeap(), 0, strW );
+ TRACE( "(%p,%s,%d,%p,%p)\n", handle, debugstr_an(buffer, length), length, written, reserved );
+
+ ret = console_ioctl( handle, IOCTL_CONDRV_WRITE_FILE, (void *)buffer, length, NULL, 0, NULL );
+ if (written) *written = ret ? length : 0;
return ret;
}
diff --git a/include/wine/condrv.h b/include/wine/condrv.h
index cf2524edc66..711341a2f6c 100644
--- a/include/wine/condrv.h
+++ b/include/wine/condrv.h
@@ -43,13 +43,14 @@
/* console output ioctls */
#define IOCTL_CONDRV_WRITE_CONSOLE CTL_CODE(FILE_DEVICE_CONSOLE, 30, METHOD_BUFFERED, FILE_WRITE_ACCESS)
-#define IOCTL_CONDRV_READ_OUTPUT CTL_CODE(FILE_DEVICE_CONSOLE, 31, METHOD_BUFFERED, FILE_READ_ACCESS)
-#define IOCTL_CONDRV_WRITE_OUTPUT CTL_CODE(FILE_DEVICE_CONSOLE, 32, METHOD_BUFFERED, FILE_WRITE_ACCESS)
-#define IOCTL_CONDRV_GET_OUTPUT_INFO CTL_CODE(FILE_DEVICE_CONSOLE, 33, METHOD_BUFFERED, FILE_READ_ACCESS)
-#define IOCTL_CONDRV_SET_OUTPUT_INFO CTL_CODE(FILE_DEVICE_CONSOLE, 34, METHOD_BUFFERED, FILE_WRITE_ACCESS)
-#define IOCTL_CONDRV_ACTIVATE CTL_CODE(FILE_DEVICE_CONSOLE, 35, METHOD_BUFFERED, FILE_WRITE_ACCESS)
-#define IOCTL_CONDRV_FILL_OUTPUT CTL_CODE(FILE_DEVICE_CONSOLE, 36, METHOD_BUFFERED, FILE_WRITE_ACCESS)
-#define IOCTL_CONDRV_SCROLL CTL_CODE(FILE_DEVICE_CONSOLE, 37, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+#define IOCTL_CONDRV_WRITE_FILE CTL_CODE(FILE_DEVICE_CONSOLE, 31, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+#define IOCTL_CONDRV_READ_OUTPUT CTL_CODE(FILE_DEVICE_CONSOLE, 32, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CONDRV_WRITE_OUTPUT CTL_CODE(FILE_DEVICE_CONSOLE, 33, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+#define IOCTL_CONDRV_GET_OUTPUT_INFO CTL_CODE(FILE_DEVICE_CONSOLE, 34, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_CONDRV_SET_OUTPUT_INFO CTL_CODE(FILE_DEVICE_CONSOLE, 35, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+#define IOCTL_CONDRV_ACTIVATE CTL_CODE(FILE_DEVICE_CONSOLE, 36, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+#define IOCTL_CONDRV_FILL_OUTPUT CTL_CODE(FILE_DEVICE_CONSOLE, 37, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+#define IOCTL_CONDRV_SCROLL CTL_CODE(FILE_DEVICE_CONSOLE, 38, METHOD_BUFFERED, FILE_WRITE_ACCESS)
/* console connection ioctls */
#define IOCTL_CONDRV_BIND_PID CTL_CODE(FILE_DEVICE_CONSOLE, 51, METHOD_BUFFERED, FILE_ANY_ACCESS)
diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c
index c7562974222..edd5fd97b40 100644
--- a/programs/conhost/conhost.c
+++ b/programs/conhost/conhost.c
@@ -2292,6 +2292,22 @@ static NTSTATUS screen_buffer_ioctl( struct screen_buffer *screen_buffer, unsign
if (in_size % sizeof(WCHAR) || *out_size) return STATUS_INVALID_PARAMETER;
return write_console( screen_buffer, in_data, in_size / sizeof(WCHAR) );
+ case IOCTL_CONDRV_WRITE_FILE:
+ {
+ unsigned int len;
+ WCHAR *buf;
+ NTSTATUS status;
+
+ len = MultiByteToWideChar( screen_buffer->console->output_cp, 0, in_data, in_size,
+ NULL, 0 );
+ if (!len) return STATUS_SUCCESS;
+ if (!(buf = malloc( len * sizeof(WCHAR) ))) return STATUS_NO_MEMORY;
+ MultiByteToWideChar( screen_buffer->console->output_cp, 0, in_data, in_size, buf, len );
+ status = write_console( screen_buffer, buf, len );
+ free( buf );
+ return status;
+ }
+
case IOCTL_CONDRV_WRITE_OUTPUT:
if ((*out_size != sizeof(DWORD) && *out_size != sizeof(SMALL_RECT)) ||
in_size < sizeof(struct condrv_output_params))
More information about the wine-cvs
mailing list