Jacek Caban : kernel32: Use NtDeviceIoControlFile directly for IOCTL_CONDRV_READ_CONSOLE and IOCTL_CONDRV_WRITE_CONSOLE.

Alexandre Julliard julliard at winehq.org
Tue Sep 15 15:40:12 CDT 2020


Module: wine
Branch: master
Commit: 2fd27f0a04a54136acc0cf138e1a6a6b7a47a1e0
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2fd27f0a04a54136acc0cf138e1a6a6b7a47a1e0

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Sep 15 17:07:38 2020 +0200

kernel32: Use NtDeviceIoControlFile directly for IOCTL_CONDRV_READ_CONSOLE and IOCTL_CONDRV_WRITE_CONSOLE.

Avoids messing last error for non-conhost consoles.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/console.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c
index 47083b27af..55c6ce4417 100644
--- a/dlls/kernel32/console.c
+++ b/dlls/kernel32/console.c
@@ -526,6 +526,7 @@ BOOL WINAPI ReadConsoleA( HANDLE handle, LPVOID buffer, DWORD length, DWORD *ret
 BOOL WINAPI ReadConsoleW(HANDLE hConsoleInput, LPVOID lpBuffer,
 			 DWORD nNumberOfCharsToRead, LPDWORD lpNumberOfCharsRead, LPVOID lpReserved)
 {
+    IO_STATUS_BLOCK io;
     DWORD	charsread;
     LPWSTR	xbuf = lpBuffer;
     DWORD	mode;
@@ -541,10 +542,10 @@ BOOL WINAPI ReadConsoleW(HANDLE hConsoleInput, LPVOID lpBuffer,
         return FALSE;
     }
 
-    if (DeviceIoControl(hConsoleInput, IOCTL_CONDRV_READ_CONSOLE, NULL, 0, lpBuffer,
-                        nNumberOfCharsToRead * sizeof(WCHAR), lpNumberOfCharsRead, NULL))
+    if (!NtDeviceIoControlFile(hConsoleInput, NULL, NULL, NULL, &io, IOCTL_CONDRV_READ_CONSOLE, NULL, 0, lpBuffer,
+                               nNumberOfCharsToRead * sizeof(WCHAR)))
     {
-        *lpNumberOfCharsRead /= sizeof(WCHAR);
+        if (lpNumberOfCharsRead) *lpNumberOfCharsRead = io.Information / sizeof(WCHAR);
         return TRUE;
     }
 
@@ -794,6 +795,7 @@ BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumber
     const WCHAR*		psz = lpBuffer;
     CONSOLE_SCREEN_BUFFER_INFO	csbi;
     int				k, first = 0, fd;
+    IO_STATUS_BLOCK io;
 
     TRACE("%p %s %d %p %p\n",
 	  hConsoleOutput, debugstr_wn(lpBuffer, nNumberOfCharsToWrite),
@@ -801,8 +803,8 @@ 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 (!NtDeviceIoControlFile(hConsoleOutput, NULL, NULL, NULL, &io, IOCTL_CONDRV_WRITE_CONSOLE, (void *)lpBuffer,
+                               nNumberOfCharsToWrite * sizeof(WCHAR), NULL, 0))
     {
         if (lpNumberOfCharsWritten) *lpNumberOfCharsWritten = nNumberOfCharsToWrite;
         return TRUE;




More information about the wine-cvs mailing list