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