Jacek Caban : kernel32: Use IOCTL_CONDRV_WRITE_OUTPUT in CONSOLE_WriteChars.
Alexandre Julliard
julliard at winehq.org
Thu Jul 23 16:36:57 CDT 2020
Module: wine
Branch: master
Commit: 98bee7881a30eb01fb3d633f008957919a4aa71b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=98bee7881a30eb01fb3d633f008957919a4aa71b
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jul 23 17:31:56 2020 +0200
kernel32: Use IOCTL_CONDRV_WRITE_OUTPUT in CONSOLE_WriteChars.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/console.c | 37 ++++++++++++++++++-------------------
1 file changed, 18 insertions(+), 19 deletions(-)
diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c
index f75a894717..8fc158ac22 100644
--- a/dlls/kernel32/console.c
+++ b/dlls/kernel32/console.c
@@ -689,25 +689,24 @@ LONG CALLBACK CONSOLE_HandleCtrlC( EXCEPTION_POINTERS *eptr )
* WriteConsoleOutput helper: hides server call semantics
* writes a string at a given pos with standard attribute
*/
-static int CONSOLE_WriteChars(HANDLE hCon, LPCWSTR lpBuffer, int nc, COORD* pos)
-{
- int written = -1;
-
- if (!nc) return 0;
-
- SERVER_START_REQ( write_console_output )
- {
- req->handle = console_handle_unmap(hCon);
- req->x = pos->X;
- req->y = pos->Y;
- req->mode = CHAR_INFO_MODE_TEXTSTDATTR;
- req->wrap = FALSE;
- wine_server_add_data( req, lpBuffer, nc * sizeof(WCHAR) );
- if (!wine_server_call_err( req )) written = reply->written;
- }
- SERVER_END_REQ;
-
- if (written > 0) pos->X += written;
+static int CONSOLE_WriteChars(HANDLE handle, const WCHAR *str, size_t length, COORD *coord)
+{
+ struct condrv_write_output_params *params;
+ DWORD written = 0, size;
+
+ if (!length) return 0;
+
+ size = sizeof(*params) + length * sizeof(WCHAR);
+ if (!(params = HeapAlloc( GetProcessHeap(), 0, size ))) return FALSE;
+ params->mode = CHAR_INFO_MODE_TEXTSTDATTR;
+ params->x = coord->X;
+ params->y = coord->Y;
+ params->width = 0;
+ memcpy( params + 1, str, length * sizeof(*str) );
+ if (DeviceIoControl( handle, IOCTL_CONDRV_WRITE_OUTPUT, params, size,
+ &written, sizeof(written), NULL, NULL ))
+ coord->X += written;
+ HeapFree( GetProcessHeap(), 0, params );
return written;
}
More information about the wine-cvs
mailing list