Module: wine Branch: master Commit: 8faceff2f9db704a3ca411da7c4be7c124b5bc22 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8faceff2f9db704a3ca411da7c...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Oct 23 15:48:08 2008 +0200
mountmgr: Add a Wine-specific ioctl to define a drive for a Unix path.
---
dlls/mountmgr.sys/mountmgr.c | 49 ++++++++++++++++++++++++++++++++++++++++++ dlls/mountmgr.sys/mountmgr.h | 1 + include/ddk/mountmgr.h | 16 +++++++++++++ 3 files changed, 66 insertions(+), 0 deletions(-)
diff --git a/dlls/mountmgr.sys/mountmgr.c b/dlls/mountmgr.sys/mountmgr.c index 79418cc..c633588 100644 --- a/dlls/mountmgr.sys/mountmgr.c +++ b/dlls/mountmgr.sys/mountmgr.c @@ -223,6 +223,48 @@ static NTSTATUS query_mount_points( const void *in_buff, SIZE_T insize, return STATUS_SUCCESS; }
+/* implementation of IOCTL_MOUNTMGR_DEFINE_UNIX_DRIVE */ +static NTSTATUS define_unix_drive( const void *in_buff, SIZE_T insize ) +{ + const struct mountmgr_unix_drive *input = in_buff; + const char *mount_point = NULL, *device = NULL; + unsigned int i; + WCHAR letter = tolowerW( input->letter ); + + if (letter < 'a' || letter > 'z') return STATUS_INVALID_PARAMETER; + if (input->type > DRIVE_RAMDISK) return STATUS_INVALID_PARAMETER; + if (input->mount_point_offset > insize || input->device_offset > insize) + return STATUS_INVALID_PARAMETER; + + /* make sure string are null-terminated */ + if (input->mount_point_offset) + { + mount_point = (const char *)in_buff + input->mount_point_offset; + for (i = input->mount_point_offset; i < insize; i++) + if (!*((const char *)in_buff + i)) break; + if (i >= insize) return STATUS_INVALID_PARAMETER; + } + if (input->device_offset) + { + device = (const char *)in_buff + input->device_offset; + for (i = input->device_offset; i < insize; i++) + if (!*((const char *)in_buff + i)) break; + if (i >= insize) return STATUS_INVALID_PARAMETER; + } + + if (input->type != DRIVE_NO_ROOT_DIR) + { + TRACE( "defining %c: dev %s mount %s type %u\n", + letter, debugstr_a(device), debugstr_a(mount_point), input->type ); + return add_dos_device( letter - 'a', NULL, device, mount_point, input->type ); + } + else + { + TRACE( "removing %c:\n", letter ); + return remove_dos_device( letter - 'a', NULL ); + } +} + /* handler for ioctls on the mount manager device */ static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp ) { @@ -244,6 +286,13 @@ static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp ) irpsp->Parameters.DeviceIoControl.OutputBufferLength, &irp->IoStatus ); break; + case IOCTL_MOUNTMGR_DEFINE_UNIX_DRIVE: + if (irpsp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct mountmgr_unix_drive)) + return STATUS_INVALID_PARAMETER; + irp->IoStatus.Information = 0; + irp->IoStatus.u.Status = define_unix_drive( irpsp->Parameters.DeviceIoControl.Type3InputBuffer, + irpsp->Parameters.DeviceIoControl.InputBufferLength ); + break; default: FIXME( "ioctl %x not supported\n", irpsp->Parameters.DeviceIoControl.IoControlCode ); irp->IoStatus.u.Status = STATUS_NOT_SUPPORTED; diff --git a/dlls/mountmgr.sys/mountmgr.h b/dlls/mountmgr.sys/mountmgr.h index 57c7b38..1b4b3f6 100644 --- a/dlls/mountmgr.sys/mountmgr.h +++ b/dlls/mountmgr.sys/mountmgr.h @@ -32,6 +32,7 @@ #include "ntddstor.h" #include "ntddcdrm.h" #include "ddk/wdm.h" +#define WINE_MOUNTMGR_EXTENSIONS #include "ddk/mountmgr.h"
extern void initialize_hal(void); diff --git a/include/ddk/mountmgr.h b/include/ddk/mountmgr.h index db0f21c..05eeeac 100644 --- a/include/ddk/mountmgr.h +++ b/include/ddk/mountmgr.h @@ -49,6 +49,22 @@ static const WCHAR MOUNTMGR_DOS_DEVICE_NAME[] = {'\','\','.','\','M','o','u', #define IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES CTL_CODE(MOUNTMGRCONTROLTYPE, 10, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION CTL_CODE(MOUNTMGRCONTROLTYPE, 11, METHOD_BUFFERED, FILE_READ_ACCESS)
+/* Wine extensions */ +#ifdef WINE_MOUNTMGR_EXTENSIONS + +#define IOCTL_MOUNTMGR_DEFINE_UNIX_DRIVE CTL_CODE(MOUNTMGRCONTROLTYPE, 32, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +struct mountmgr_unix_drive +{ + ULONG size; + ULONG type; + WCHAR letter; + USHORT mount_point_offset; + USHORT device_offset; +}; + +#endif + typedef struct _MOUNTMGR_CREATE_POINT_INPUT { USHORT SymbolicLinkNameOffset;