From: Jacek Caban Subject: [PATCH 3/5] server: Support FileFsDeviceInformation queries on console handles. Message-Id: Date: Fri, 20 Nov 2020 15:40:19 +0100 Signed-off-by: Jacek Caban --- 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 #include +#include #include #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;