Jacek Caban : kernelbase: Introduce console_ioctl helper.

Alexandre Julliard julliard at winehq.org
Fri Jul 10 16:30:31 CDT 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Jul 10 17:06:01 2020 +0200

kernelbase: Introduce console_ioctl helper.

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

---

 dlls/kernelbase/console.c | 50 ++++++++++++++++++++++++++++-------------------
 1 file changed, 30 insertions(+), 20 deletions(-)

diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index 37ca8b599b..606589339e 100644
--- a/dlls/kernelbase/console.c
+++ b/dlls/kernelbase/console.c
@@ -80,6 +80,28 @@ static inline obj_handle_t console_handle_unmap( HANDLE h )
     return wine_server_obj_handle( console_handle_map( h ) );
 }
 
+static BOOL console_ioctl( HANDLE handle, DWORD code, void *in_buff, DWORD in_count,
+                           void *out_buff, DWORD out_count, DWORD *read )
+{
+    IO_STATUS_BLOCK io;
+    NTSTATUS status;
+
+    status = NtDeviceIoControlFile( handle, NULL, NULL, NULL, &io, code, in_buff, in_count,
+                                    out_buff, out_count );
+    switch( status )
+    {
+    case STATUS_SUCCESS:
+        if (read) *read = io.Information;
+        return TRUE;
+    case STATUS_INVALID_PARAMETER:
+        break;
+    default:
+        status = STATUS_INVALID_HANDLE;
+        break;
+    }
+    return set_ntstatus( status );
+}
+
 /* map input records to ASCII */
 static void input_records_WtoA( INPUT_RECORD *buffer, int count )
 {
@@ -162,11 +184,8 @@ static COORD get_largest_console_window_size( HANDLE handle )
     struct condrv_output_info info;
     COORD c = { 0, 0 };
 
-    if (!DeviceIoControl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &info, sizeof(info), NULL, NULL ))
-    {
-        SetLastError( ERROR_INVALID_HANDLE );
+    if (!console_ioctl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &info, sizeof(info), NULL ))
         return c;
-    }
 
     c.X = info.max_width;
     c.Y = info.max_height;
@@ -543,11 +562,8 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetConsoleCursorInfo( HANDLE handle, CONSOLE_CURSO
 {
     struct condrv_output_info condrv_info;
 
-    if (!DeviceIoControl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &condrv_info, sizeof(condrv_info), NULL, NULL ))
-    {
-        SetLastError( ERROR_INVALID_HANDLE );
+    if (!console_ioctl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &condrv_info, sizeof(condrv_info), NULL ))
         return FALSE;
-    }
 
     if (!info)
     {
@@ -636,12 +652,9 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetConsoleScreenBufferInfo( HANDLE handle, CONSOLE
 {
     struct condrv_output_info condrv_info;
 
-    if (!DeviceIoControl( handle , IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0,
-                          &condrv_info, sizeof(condrv_info), NULL, NULL ))
-    {
-        SetLastError( ERROR_INVALID_HANDLE );
+    if (!console_ioctl( handle , IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0,
+                        &condrv_info, sizeof(condrv_info), NULL ))
         return FALSE;
-    }
 
     info->dwSize.X              = condrv_info.width;
     info->dwSize.Y              = condrv_info.height;
@@ -677,12 +690,9 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetConsoleScreenBufferInfoEx( HANDLE handle,
         return FALSE;
     }
 
-    if (!DeviceIoControl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &condrv_info,
-                          sizeof(condrv_info), NULL, NULL ))
-    {
-        SetLastError( ERROR_INVALID_HANDLE );
+    if (!console_ioctl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &condrv_info,
+                        sizeof(condrv_info), NULL ))
         return FALSE;
-    }
 
     info->dwSize.X              = condrv_info.width;
     info->dwSize.Y              = condrv_info.height;
@@ -755,7 +765,7 @@ COORD WINAPI DECLSPEC_HOTPATCH GetLargestConsoleWindowSize( HANDLE handle )
 BOOL WINAPI DECLSPEC_HOTPATCH GetNumberOfConsoleInputEvents( HANDLE handle, DWORD *count )
 {
     struct condrv_input_info info;
-    if (!DeviceIoControl( handle, IOCTL_CONDRV_GET_INPUT_INFO, NULL, 0, &info, sizeof(info), NULL, NULL ))
+    if (!console_ioctl( handle, IOCTL_CONDRV_GET_INPUT_INFO, NULL, 0, &info, sizeof(info), NULL ))
         return FALSE;
     *count = info.input_count;
     return TRUE;
@@ -784,7 +794,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH PeekConsoleInputW( HANDLE handle, INPUT_RECORD *bu
                                                  DWORD length, DWORD *count )
 {
     DWORD read;
-    if (!DeviceIoControl( handle, IOCTL_CONDRV_PEEK, NULL, 0, buffer, length * sizeof(*buffer), &read, NULL ))
+    if (!console_ioctl( handle, IOCTL_CONDRV_PEEK, NULL, 0, buffer, length * sizeof(*buffer), &read ))
         return FALSE;
     if (count) *count = read / sizeof(*buffer);
     return TRUE;




More information about the wine-cvs mailing list