mountmgr: Add a Wine-specific ioctl to query the Unix information about a drive.
This commit is contained in:
parent
8faceff2f9
commit
bc32b857ab
|
@ -568,6 +568,22 @@ NTSTATUS remove_dos_device( int letter, const char *udi )
|
||||||
return STATUS_NO_SUCH_DEVICE;
|
return STATUS_NO_SUCH_DEVICE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* query information about an existing dos drive, by letter or udi */
|
||||||
|
NTSTATUS query_dos_device( int letter, DWORD *type, const char **device, const char **mount_point )
|
||||||
|
{
|
||||||
|
struct dos_drive *drive;
|
||||||
|
|
||||||
|
LIST_FOR_EACH_ENTRY( drive, &drives_list, struct dos_drive, entry )
|
||||||
|
{
|
||||||
|
if (drive->drive != letter) continue;
|
||||||
|
if (type) *type = drive->type;
|
||||||
|
if (device) *device = drive->unix_device;
|
||||||
|
if (mount_point) *mount_point = drive->unix_mount;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
return STATUS_NO_SUCH_DEVICE;
|
||||||
|
}
|
||||||
|
|
||||||
/* handler for ioctls on the harddisk device */
|
/* handler for ioctls on the harddisk device */
|
||||||
static NTSTATUS WINAPI harddisk_ioctl( DEVICE_OBJECT *device, IRP *irp )
|
static NTSTATUS WINAPI harddisk_ioctl( DEVICE_OBJECT *device, IRP *irp )
|
||||||
{
|
{
|
||||||
|
|
|
@ -265,6 +265,61 @@ static NTSTATUS define_unix_drive( const void *in_buff, SIZE_T insize )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* implementation of IOCTL_MOUNTMGR_QUERY_UNIX_DRIVE */
|
||||||
|
static NTSTATUS query_unix_drive( const void *in_buff, SIZE_T insize,
|
||||||
|
void *out_buff, SIZE_T outsize, IO_STATUS_BLOCK *iosb )
|
||||||
|
{
|
||||||
|
const struct mountmgr_unix_drive *input = in_buff;
|
||||||
|
struct mountmgr_unix_drive *output = out_buff;
|
||||||
|
const char *device, *mount_point;
|
||||||
|
int letter = tolowerW( input->letter );
|
||||||
|
NTSTATUS status;
|
||||||
|
DWORD size, type;
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
if (letter < 'a' || letter > 'z') return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if ((status = query_dos_device( letter - 'a', &type, &device, &mount_point ))) return status;
|
||||||
|
|
||||||
|
size = sizeof(*output);
|
||||||
|
if (device) size += strlen(device) + 1;
|
||||||
|
if (mount_point) size += strlen(mount_point) + 1;
|
||||||
|
|
||||||
|
if (size > outsize)
|
||||||
|
{
|
||||||
|
if (size >= FIELD_OFFSET( struct mountmgr_unix_drive, size ) + sizeof(output->size))
|
||||||
|
output->size = size;
|
||||||
|
iosb->Information = FIELD_OFFSET( struct mountmgr_unix_drive, size ) + sizeof(output->size);
|
||||||
|
return STATUS_MORE_ENTRIES;
|
||||||
|
}
|
||||||
|
output->size = size;
|
||||||
|
output->letter = letter;
|
||||||
|
output->type = type;
|
||||||
|
ptr = (char *)(output + 1);
|
||||||
|
|
||||||
|
if (mount_point)
|
||||||
|
{
|
||||||
|
output->mount_point_offset = ptr - (char *)output;
|
||||||
|
strcpy( ptr, mount_point );
|
||||||
|
ptr += strlen(ptr) + 1;
|
||||||
|
}
|
||||||
|
else output->mount_point_offset = 0;
|
||||||
|
|
||||||
|
if (device)
|
||||||
|
{
|
||||||
|
output->device_offset = ptr - (char *)output;
|
||||||
|
strcpy( ptr, device );
|
||||||
|
ptr += strlen(ptr) + 1;
|
||||||
|
}
|
||||||
|
else output->device_offset = 0;
|
||||||
|
|
||||||
|
TRACE( "returning %c: dev %s mount %s type %u\n",
|
||||||
|
letter, debugstr_a(device), debugstr_a(mount_point), type );
|
||||||
|
|
||||||
|
iosb->Information = ptr - (char *)output;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/* handler for ioctls on the mount manager device */
|
/* handler for ioctls on the mount manager device */
|
||||||
static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp )
|
static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp )
|
||||||
{
|
{
|
||||||
|
@ -293,6 +348,15 @@ static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp )
|
||||||
irp->IoStatus.u.Status = define_unix_drive( irpsp->Parameters.DeviceIoControl.Type3InputBuffer,
|
irp->IoStatus.u.Status = define_unix_drive( irpsp->Parameters.DeviceIoControl.Type3InputBuffer,
|
||||||
irpsp->Parameters.DeviceIoControl.InputBufferLength );
|
irpsp->Parameters.DeviceIoControl.InputBufferLength );
|
||||||
break;
|
break;
|
||||||
|
case IOCTL_MOUNTMGR_QUERY_UNIX_DRIVE:
|
||||||
|
if (irpsp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct mountmgr_unix_drive))
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
irp->IoStatus.u.Status = query_unix_drive( irpsp->Parameters.DeviceIoControl.Type3InputBuffer,
|
||||||
|
irpsp->Parameters.DeviceIoControl.InputBufferLength,
|
||||||
|
irp->MdlAddress->StartVa,
|
||||||
|
irpsp->Parameters.DeviceIoControl.OutputBufferLength,
|
||||||
|
&irp->IoStatus );
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
FIXME( "ioctl %x not supported\n", irpsp->Parameters.DeviceIoControl.IoControlCode );
|
FIXME( "ioctl %x not supported\n", irpsp->Parameters.DeviceIoControl.IoControlCode );
|
||||||
irp->IoStatus.u.Status = STATUS_NOT_SUPPORTED;
|
irp->IoStatus.u.Status = STATUS_NOT_SUPPORTED;
|
||||||
|
|
|
@ -43,6 +43,7 @@ extern void initialize_diskarbitration(void);
|
||||||
extern NTSTATUS add_dos_device( int letter, const char *udi, const char *device,
|
extern NTSTATUS add_dos_device( int letter, const char *udi, const char *device,
|
||||||
const char *mount_point, DWORD type );
|
const char *mount_point, DWORD type );
|
||||||
extern NTSTATUS remove_dos_device( int letter, const char *udi );
|
extern NTSTATUS remove_dos_device( int letter, const char *udi );
|
||||||
|
extern NTSTATUS query_dos_device( int letter, DWORD *type, const char **device, const char **mount_point );
|
||||||
extern NTSTATUS WINAPI harddisk_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path );
|
extern NTSTATUS WINAPI harddisk_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path );
|
||||||
|
|
||||||
/* mount point functions */
|
/* mount point functions */
|
||||||
|
|
|
@ -53,6 +53,7 @@ static const WCHAR MOUNTMGR_DOS_DEVICE_NAME[] = {'\\','\\','.','\\','M','o','u',
|
||||||
#ifdef WINE_MOUNTMGR_EXTENSIONS
|
#ifdef WINE_MOUNTMGR_EXTENSIONS
|
||||||
|
|
||||||
#define IOCTL_MOUNTMGR_DEFINE_UNIX_DRIVE CTL_CODE(MOUNTMGRCONTROLTYPE, 32, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
#define IOCTL_MOUNTMGR_DEFINE_UNIX_DRIVE CTL_CODE(MOUNTMGRCONTROLTYPE, 32, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||||
|
#define IOCTL_MOUNTMGR_QUERY_UNIX_DRIVE CTL_CODE(MOUNTMGRCONTROLTYPE, 33, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||||
|
|
||||||
struct mountmgr_unix_drive
|
struct mountmgr_unix_drive
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue