Module: wine Branch: master Commit: 98bee7881a30eb01fb3d633f008957919a4aa71b URL: https://source.winehq.org/git/wine.git/?a=commit;h=98bee7881a30eb01fb3d633f0...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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; }