mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-14 15:20:47 +00:00
server: Support FileFsDeviceInformation queries on console handles.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
a055f41286
commit
8ca9b44fd1
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue