Jacek Caban : server: Support FileFsDeviceInformation queries on console handles.

Alexandre Julliard julliard at winehq.org
Mon Nov 23 15:43:23 CST 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Nov 20 15:40:19 2020 +0100

server: Support FileFsDeviceInformation queries on console handles.

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

---

 dlls/kernel32/tests/console.c | 20 ++++++++++++++++++++
 server/console.c              | 27 +++++++++++++++++++++++++--
 2 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c
index 1a86aedbc82..0376d00892e 100644
--- a/dlls/kernel32/tests/console.c
+++ b/dlls/kernel32/tests/console.c
@@ -23,6 +23,7 @@
 #define WIN32_NO_STATUS
 #include <windows.h>
 #include <winternl.h>
+#include <winioctl.h>
 #include <stdio.h>
 
 #include "wine/test.h"
@@ -3945,8 +3946,10 @@ static void test_console_title(void)
 static void test_file_info(HANDLE input, HANDLE output)
 {
     FILE_STANDARD_INFORMATION std_info;
+    FILE_FS_DEVICE_INFORMATION fs_info;
     LARGE_INTEGER size;
     IO_STATUS_BLOCK io;
+    DWORD type;
     NTSTATUS status;
     BOOL ret;
 
@@ -3965,6 +3968,23 @@ static void test_file_info(HANDLE input, HANDLE output)
     ret = GetFileSizeEx(output, &size);
     ok(!ret && GetLastError() == ERROR_INVALID_FUNCTION,
        "GetFileSizeEx returned %x(%u)\n", ret, GetLastError());
+
+    status = NtQueryVolumeInformationFile(input, &io, &fs_info, sizeof(fs_info), FileFsDeviceInformation);
+    ok(!status, "NtQueryVolumeInformationFile failed: %#x\n", status);
+    ok(fs_info.DeviceType == FILE_DEVICE_CONSOLE, "DeviceType = %u\n", fs_info.DeviceType);
+    ok(fs_info.Characteristics == FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL,
+       "Characteristics = %x\n", fs_info.Characteristics);
+
+    status = NtQueryVolumeInformationFile(output, &io, &fs_info, sizeof(fs_info), FileFsDeviceInformation);
+    ok(!status, "NtQueryVolumeInformationFile failed: %#x\n", status);
+    ok(fs_info.DeviceType == FILE_DEVICE_CONSOLE, "DeviceType = %u\n", fs_info.DeviceType);
+    ok(fs_info.Characteristics == FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL,
+       "Characteristics = %x\n", fs_info.Characteristics);
+
+    type = GetFileType(input);
+    ok(type == FILE_TYPE_CHAR, "GetFileType returned %u\n", type);
+    type = GetFileType(output);
+    ok(type == FILE_TYPE_CHAR, "GetFileType returned %u\n", type);
 }
 
 static void test_AttachConsole_child(DWORD console_pid)
diff --git a/server/console.c b/server/console.c
index cecd1455d60..799d31c6fde 100644
--- a/server/console.c
+++ b/server/console.c
@@ -99,6 +99,7 @@ static const struct object_ops console_input_ops =
 
 static enum server_fd_type console_get_fd_type( struct fd *fd );
 static void console_get_file_info( struct fd *fd, obj_handle_t handle, unsigned int info_class );
+static void console_get_volume_info( struct fd *fd, unsigned int info_class );
 static int console_input_read( struct fd *fd, struct async *async, file_pos_t pos );
 static int console_input_flush( struct fd *fd, struct async *async );
 static int console_input_ioctl( struct fd *fd, ioctl_code_t code, struct async *async );
@@ -112,7 +113,7 @@ static const struct fd_ops console_input_fd_ops =
     no_fd_write,                  /* write */
     console_input_flush,          /* flush */
     console_get_file_info,        /* get_file_info */
-    no_fd_get_volume_info,        /* get_volume_info */
+    console_get_volume_info,      /* get_volume_info */
     console_input_ioctl,          /* ioctl */
     default_fd_queue_async,       /* queue_async */
     default_fd_reselect_async     /* reselect_async */
@@ -250,7 +251,7 @@ static const struct fd_ops screen_buffer_fd_ops =
     screen_buffer_write,          /* write */
     no_fd_flush,                  /* flush */
     console_get_file_info,        /* get_file_info */
-    no_fd_get_volume_info,        /* get_volume_info */
+    console_get_volume_info,      /* get_volume_info */
     screen_buffer_ioctl,          /* ioctl */
     default_fd_queue_async,       /* queue_async */
     default_fd_reselect_async     /* reselect_async */
@@ -426,6 +427,28 @@ static void console_get_file_info( struct fd *fd, obj_handle_t handle, unsigned
     set_error( STATUS_INVALID_DEVICE_REQUEST );
 }
 
+static void console_get_volume_info( struct fd *fd, unsigned int info_class )
+{
+    switch (info_class)
+    {
+    case FileFsDeviceInformation:
+        {
+            static const FILE_FS_DEVICE_INFORMATION device_info =
+            {
+                FILE_DEVICE_CONSOLE,
+                FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL
+            };
+            if (get_reply_max_size() >= sizeof(device_info))
+                set_reply_data( &device_info, sizeof(device_info) );
+            else
+                set_error( STATUS_BUFFER_TOO_SMALL );
+            break;
+        }
+    default:
+        set_error( STATUS_NOT_IMPLEMENTED );
+    }
+}
+
 static struct object *create_console_input(void)
 {
     struct console_input *console_input;




More information about the wine-cvs mailing list