[PATCH] mountmgr: Add SCSI addresses of udisks2 devices to the registry.

Esme Povirk esme at codeweavers.com
Sat Nov 7 11:14:50 CST 2020


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49788
Signed-off-by: Esme Povirk <esme at codeweavers.com>
---
 dlls/mountmgr.sys/dbus.c | 54 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 50 insertions(+), 4 deletions(-)

diff --git a/dlls/mountmgr.sys/dbus.c b/dlls/mountmgr.sys/dbus.c
index 98b2a47ba6d..ebe0152bf1c 100644
--- a/dlls/mountmgr.sys/dbus.c
+++ b/dlls/mountmgr.sys/dbus.c
@@ -385,7 +385,8 @@ static const char *udisks2_string_from_array( DBusMessageIter *iter )
 
 /* find the drive entry in the dictionary and get its parameters */
 static void udisks2_get_drive_info( const char *drive_name, DBusMessageIter *dict,
-                                    enum device_type *drive_type, int *removable, const char **serial )
+                                    enum device_type *drive_type, int *removable, const char **serial,
+                                    int *optical, const char **model )
 {
     DBusMessageIter iter, drive, variant;
     const char *name;
@@ -405,11 +406,49 @@ static void udisks2_get_drive_info( const char *drive_name, DBusMessageIter *dic
                     *drive_type = udisks_parse_media_compatibility( &variant );
                 else if (!strcmp( name, "Id" ))
                     p_dbus_message_iter_get_basic( &variant, serial );
+                else if (!strcmp( name, "Optical" ))
+                    p_dbus_message_iter_get_basic( &variant, optical );
+                else if (!strcmp( name, "Model" ))
+                    p_dbus_message_iter_get_basic( &variant, model );
             }
         }
     }
 }
 
+static void udisks2_add_scsi_device( const char *unix_device, int optical,
+    const char *model, UNICODE_STRING *devname )
+{
+    WCHAR *name;
+    HANDLE handle;
+    SCSI_ADDRESS scsi_addr;
+    DWORD size;
+
+    if (!unix_device)
+        return;
+
+    if (!(name = wine_get_dos_file_name( unix_device )))
+    {
+        ERR("Failed to convert %s to NT, err %u\n", debugstr_a(unix_device), GetLastError());
+        return;
+    }
+    handle = CreateFileW( name, GENERIC_READ | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+                          NULL, OPEN_EXISTING, 0, 0 );
+    RtlFreeHeap( GetProcessHeap(), 0, name );
+    if (handle == INVALID_HANDLE_VALUE)
+    {
+        WARN("Failed to open %s, err %u\n", debugstr_a(unix_device), GetLastError());
+        return;
+    }
+
+    if (DeviceIoControl( handle, IOCTL_SCSI_GET_ADDRESS, NULL, 0, &scsi_addr, sizeof(scsi_addr), &size, 0 ))
+    {
+        create_scsi_entry( &scsi_addr, 255, optical ? "atapi" : "WINE SCSI",
+            optical ? SCSI_CDROM_PERIPHERAL : SCSI_DISK_PERIPHERAL, model, devname );
+    }
+
+    CloseHandle( handle );
+}
+
 static void udisks2_add_device( const char *udi, DBusMessageIter *dict, DBusMessageIter *block )
 {
     DBusMessageIter iter, variant, paths, string;
@@ -418,9 +457,10 @@ static void udisks2_add_device( const char *udi, DBusMessageIter *dict, DBusMess
     const char *type = NULL;
     const char *drive = NULL;
     const char *id = NULL;
+    const char *model = NULL;
     GUID guid, *guid_ptr = NULL;
     const char *iface, *name;
-    int removable = FALSE;
+    int removable = FALSE, optical = FALSE;
     enum device_type drive_type = DEVICE_UNKNOWN;
 
     while ((iface = udisks_next_dict_entry( block, &iter )))
@@ -451,7 +491,7 @@ static void udisks2_add_device( const char *udi, DBusMessageIter *dict, DBusMess
                 else if (!strcmp( name, "Drive" ))
                 {
                     p_dbus_message_iter_get_basic( &variant, &drive );
-                    udisks2_get_drive_info( drive, dict, &drive_type, &removable, &id );
+                    udisks2_get_drive_info( drive, dict, &drive_type, &removable, &id, &optical, &model );
                 }
                 else if (!strcmp( name, "IdUUID" ))
                 {
@@ -485,7 +525,13 @@ static void udisks2_add_device( const char *udi, DBusMessageIter *dict, DBusMess
     }
     if (device)
     {
-        if (removable) add_dos_device( -1, udi, device, mount_point, drive_type, guid_ptr, NULL );
+        if (removable)
+        {
+            UNICODE_STRING devname;
+            devname.Buffer = NULL;
+            add_dos_device( -1, udi, device, mount_point, drive_type, guid_ptr, &devname );
+            udisks2_add_scsi_device( device, optical, model, &devname );
+        }
         else if (guid_ptr) add_volume( udi, device, mount_point, DEVICE_HARDDISK_VOL, guid_ptr, id );
     }
 }
-- 
2.17.1




More information about the wine-devel mailing list