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