Commit a2feb0f8 authored by Alexandre Julliard's avatar Alexandre Julliard

mountmgr: Make the device type more specific than what is possible with the…

mountmgr: Make the device type more specific than what is possible with the standard Win32 drive types.
parent b901c8db
......@@ -43,13 +43,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(mountmgr);
static const WCHAR drive_types[][8] =
{
{ 0 }, /* DRIVE_UNKNOWN */
{ 0 }, /* DRIVE_NO_ROOT_DIR */
{'f','l','o','p','p','y',0}, /* DRIVE_REMOVABLE */
{'h','d',0}, /* DRIVE_FIXED */
{'n','e','t','w','o','r','k',0}, /* DRIVE_REMOTE */
{'c','d','r','o','m',0}, /* DRIVE_CDROM */
{'r','a','m','d','i','s','k',0} /* DRIVE_RAMDISK */
{ 0 }, /* DEVICE_UNKNOWN */
{ 0 }, /* DEVICE_HARDDISK */
{'h','d',0}, /* DEVICE_HARDDISK_VOL */
{'f','l','o','p','p','y',0}, /* DEVICE_FLOPPY */
{'c','d','r','o','m',0}, /* DEVICE_CDROM */
{'n','e','t','w','o','r','k',0}, /* DEVICE_NETWORK */
{'r','a','m','d','i','s','k',0} /* DEVICE_RAMDISK */
};
static const WCHAR drives_keyW[] = {'S','o','f','t','w','a','r','e','\\',
......@@ -60,7 +60,7 @@ struct dos_drive
struct list entry; /* entry in drives list */
char *udi; /* unique identifier for dynamic drives */
int drive; /* drive letter (0 = A: etc.) */
DWORD type; /* drive type */
enum device_type type; /* drive type */
DEVICE_OBJECT *device; /* disk device allocated for this drive */
UNICODE_STRING name; /* device name */
UNICODE_STRING symlink; /* device symlink if any */
......@@ -143,38 +143,42 @@ static void send_notify( int drive, int code )
}
/* create the disk device for a given drive */
static NTSTATUS create_disk_device( const char *udi, DWORD type, struct dos_drive **drive_ret )
static NTSTATUS create_disk_device( const char *udi, enum device_type type, struct dos_drive **drive_ret )
{
static const WCHAR harddiskvolW[] = {'\\','D','e','v','i','c','e',
'\\','H','a','r','d','d','i','s','k','V','o','l','u','m','e','%','u',0};
static const WCHAR harddiskW[] = {'\\','D','e','v','i','c','e','\\','H','a','r','d','d','i','s','k','%','u',0};
static const WCHAR cdromW[] = {'\\','D','e','v','i','c','e','\\','C','d','R','o','m','%','u',0};
static const WCHAR floppyW[] = {'\\','D','e','v','i','c','e','\\','F','l','o','p','p','y','%','u',0};
static const WCHAR ramdiskW[] = {'\\','D','e','v','i','c','e','\\','R','a','m','d','i','s','k','%','u',0};
static const WCHAR physdriveW[] = {'\\','?','?','\\','P','h','y','s','i','c','a','l','D','r','i','v','e','%','u',0};
UINT i, first = 0;
NTSTATUS status = 0;
const WCHAR *format;
const WCHAR *format = NULL;
UNICODE_STRING name;
DEVICE_OBJECT *dev_obj;
struct dos_drive *drive;
switch(type)
{
case DRIVE_REMOVABLE:
case DEVICE_UNKNOWN:
case DEVICE_HARDDISK:
case DEVICE_NETWORK: /* FIXME */
format = harddiskW;
break;
case DEVICE_HARDDISK_VOL:
format = harddiskvolW;
first = 1; /* harddisk volumes start counting from 1 */
break;
case DEVICE_FLOPPY:
format = floppyW;
break;
case DRIVE_CDROM:
case DEVICE_CDROM:
format = cdromW;
break;
case DRIVE_FIXED:
default: /* FIXME */
if (udi) format = harddiskW;
else
{
format = harddiskvolW;
first = 1; /* harddisk volumes start counting from 1 */
}
case DEVICE_RAMDISK:
format = ramdiskW;
break;
}
......@@ -211,20 +215,20 @@ static NTSTATUS create_disk_device( const char *udi, DWORD type, struct dos_driv
}
switch (type)
{
case DRIVE_REMOVABLE:
case DEVICE_FLOPPY:
case DEVICE_RAMDISK:
drive->devnum.DeviceType = FILE_DEVICE_DISK;
drive->devnum.DeviceNumber = i;
drive->devnum.PartitionNumber = ~0u;
break;
case DRIVE_CDROM:
case DEVICE_CDROM:
drive->devnum.DeviceType = FILE_DEVICE_CD_ROM;
drive->devnum.DeviceNumber = i;
drive->devnum.PartitionNumber = ~0u;
break;
case DRIVE_FIXED:
default: /* FIXME */
drive->devnum.DeviceType = FILE_DEVICE_DISK;
if (udi)
case DEVICE_UNKNOWN:
case DEVICE_HARDDISK:
case DEVICE_NETWORK: /* FIXME */
{
UNICODE_STRING symlink;
......@@ -235,14 +239,15 @@ static NTSTATUS create_disk_device( const char *udi, DWORD type, struct dos_driv
symlink.Length = strlenW(symlink.Buffer) * sizeof(WCHAR);
if (!IoCreateSymbolicLink( &symlink, &name )) drive->symlink = symlink;
}
drive->devnum.DeviceType = FILE_DEVICE_DISK;
drive->devnum.DeviceNumber = i;
drive->devnum.PartitionNumber = 0;
}
else
{
drive->devnum.DeviceNumber = 0;
drive->devnum.PartitionNumber = i;
}
break;
case DEVICE_HARDDISK_VOL:
drive->devnum.DeviceType = FILE_DEVICE_DISK;
drive->devnum.DeviceNumber = 0;
drive->devnum.PartitionNumber = i;
break;
}
list_add_tail( &drives_list, &drive->entry );
......@@ -307,7 +312,7 @@ static inline int is_valid_device( struct stat *st )
}
/* find or create a DOS drive for the corresponding device */
static int add_drive( const char *device, DWORD type )
static int add_drive( const char *device, enum device_type type )
{
char *path, *p;
char in_use[26];
......@@ -320,12 +325,20 @@ static int add_drive( const char *device, DWORD type )
memset( in_use, 0, sizeof(in_use) );
first = 2;
last = 26;
if (type == DRIVE_REMOVABLE)
switch (type)
{
case DEVICE_FLOPPY:
first = 0;
last = 2;
break;
case DEVICE_CDROM:
first = 3;
last = 26;
break;
default:
first = 2;
last = 26;
break;
}
while (avail != -1)
......@@ -415,7 +428,7 @@ static void create_drive_devices(void)
struct dos_drive *drive;
unsigned int i;
HKEY drives_key;
DWORD drive_type;
enum device_type drive_type;
WCHAR driveW[] = {'a',':',0};
if (!(path = get_dosdevices_path( &p ))) return;
......@@ -429,7 +442,7 @@ static void create_drive_devices(void)
p[2] = ':';
device = read_symlink( path );
drive_type = i < 2 ? DRIVE_REMOVABLE : DRIVE_FIXED;
drive_type = i < 2 ? DEVICE_FLOPPY : DEVICE_HARDDISK_VOL;
if (drives_key)
{
WCHAR buffer[32];
......@@ -445,6 +458,7 @@ static void create_drive_devices(void)
drive_type = j;
break;
}
if (drive_type == DEVICE_FLOPPY && i >= 2) drive_type = DEVICE_HARDDISK;
}
}
......@@ -466,7 +480,7 @@ static void create_drive_devices(void)
/* create a new dos drive */
NTSTATUS add_dos_device( int letter, const char *udi, const char *device,
const char *mount_point, DWORD type )
const char *mount_point, enum device_type type )
{
struct dos_drive *drive, *next;
......@@ -519,6 +533,7 @@ found:
WCHAR name[3] = {'a',':',0};
name[0] += drive->drive;
if (!type_name[0] && type == DEVICE_HARDDISK) type_name = drive_types[DEVICE_FLOPPY];
if (type_name[0])
RegSetValueExW( hkey, name, 0, REG_SZ, (const BYTE *)type_name,
(strlenW(type_name) + 1) * sizeof(WCHAR) );
......@@ -569,7 +584,8 @@ NTSTATUS remove_dos_device( int letter, const char *udi )
}
/* 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 )
NTSTATUS query_dos_device( int letter, enum device_type *type,
const char **device, const char **mount_point )
{
struct dos_drive *drive;
......@@ -641,7 +657,7 @@ NTSTATUS WINAPI harddisk_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *pa
driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = harddisk_ioctl;
/* create a harddisk0 device that isn't assigned to any drive */
create_disk_device( "harddisk0 placeholder", DRIVE_FIXED, &drive );
create_disk_device( "harddisk0 placeholder", DEVICE_HARDDISK, &drive );
create_drive_devices();
......
......@@ -42,7 +42,7 @@ static void appeared_callback( DADiskRef disk, void *context )
const void *ref;
char device[64];
char mount_point[PATH_MAX];
DWORD type = DRIVE_UNKNOWN;
enum device_type type = DEVICE_UNKNOWN;
if (!dict) return;
......@@ -64,7 +64,7 @@ static void appeared_callback( DADiskRef disk, void *context )
{
if (!CFStringCompare( ref, CFSTR("cd9660"), 0 ) ||
!CFStringCompare( ref, CFSTR("udf"), 0 ))
type = DRIVE_CDROM;
type = DEVICE_CDROM;
}
TRACE( "got mount notification for '%s' on '%s'\n", device, mount_point );
......
......@@ -113,7 +113,7 @@ static void new_device( LibHalContext *ctx, const char *udi )
char *mount_point = NULL;
char *device = NULL;
char *type = NULL;
DWORD drive_type;
enum device_type drive_type;
p_dbus_error_init( &error );
......@@ -132,8 +132,9 @@ static void new_device( LibHalContext *ctx, const char *udi )
if (!(type = p_libhal_device_get_property_string( ctx, parent, "storage.drive_type", &error )))
p_dbus_error_free( &error ); /* ignore error */
if (type && !strcmp( type, "cdrom" )) drive_type = DRIVE_CDROM;
else drive_type = DRIVE_REMOVABLE; /* FIXME: default to removable */
if (type && !strcmp( type, "cdrom" )) drive_type = DEVICE_CDROM;
else if (type && !strcmp( type, "floppy" )) drive_type = DEVICE_FLOPPY;
else drive_type = DEVICE_UNKNOWN;
add_dos_device( -1, udi, device, mount_point, drive_type );
......
......@@ -254,9 +254,18 @@ static NTSTATUS define_unix_drive( const void *in_buff, SIZE_T insize )
if (input->type != DRIVE_NO_ROOT_DIR)
{
enum device_type type = DEVICE_UNKNOWN;
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 );
switch (input->type)
{
case DRIVE_REMOVABLE: type = (letter >= 'c') ? DEVICE_HARDDISK : DEVICE_FLOPPY; break;
case DRIVE_REMOTE: type = DEVICE_NETWORK; break;
case DRIVE_CDROM: type = DEVICE_CDROM; break;
case DRIVE_RAMDISK: type = DEVICE_RAMDISK; break;
}
return add_dos_device( letter - 'a', NULL, device, mount_point, type );
}
else
{
......@@ -275,11 +284,22 @@ static NTSTATUS query_unix_drive( const void *in_buff, SIZE_T insize,
int letter = tolowerW( input->letter );
NTSTATUS status;
DWORD size, type;
enum device_type device_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;
if ((status = query_dos_device( letter - 'a', &device_type, &device, &mount_point ))) return status;
switch (device_type)
{
case DEVICE_UNKNOWN: type = DRIVE_UNKNOWN; break;
case DEVICE_HARDDISK: type = DRIVE_REMOVABLE; break;
case DEVICE_HARDDISK_VOL: type = DRIVE_FIXED; break;
case DEVICE_FLOPPY: type = DRIVE_REMOVABLE; break;
case DEVICE_CDROM: type = DRIVE_CDROM; break;
case DEVICE_NETWORK: type = DRIVE_REMOTE; break;
case DEVICE_RAMDISK: type = DRIVE_RAMDISK; break;
}
size = sizeof(*output);
if (device) size += strlen(device) + 1;
......
......@@ -40,10 +40,22 @@ extern void initialize_diskarbitration(void);
/* device functions */
enum device_type
{
DEVICE_UNKNOWN,
DEVICE_HARDDISK,
DEVICE_HARDDISK_VOL,
DEVICE_FLOPPY,
DEVICE_CDROM,
DEVICE_NETWORK,
DEVICE_RAMDISK
};
extern NTSTATUS add_dos_device( int letter, const char *udi, const char *device,
const char *mount_point, DWORD type );
const char *mount_point, enum device_type type );
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 query_dos_device( int letter, enum device_type *type,
const char **device, const char **mount_point );
extern NTSTATUS WINAPI harddisk_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path );
/* mount point functions */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment