Alexandre Julliard : mountmgr: Store the contents of the device symlink in the drive object.

Alexandre Julliard julliard at winehq.org
Fri Oct 24 08:12:20 CDT 2008


Module: wine
Branch: master
Commit: 5f2d2c7df07249b8128d9626bb8b67f72c47ac92
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5f2d2c7df07249b8128d9626bb8b67f72c47ac92

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Oct 23 15:43:46 2008 +0200

mountmgr: Store the contents of the device symlink in the drive object.

---

 dlls/mountmgr.sys/device.c |   30 +++++++++++++++++++++++++-----
 1 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/dlls/mountmgr.sys/device.c b/dlls/mountmgr.sys/device.c
index dd98c16..3ed689f 100644
--- a/dlls/mountmgr.sys/device.c
+++ b/dlls/mountmgr.sys/device.c
@@ -67,6 +67,7 @@ struct dos_drive
     STORAGE_DEVICE_NUMBER devnum;      /* device number info */
     struct mount_point   *dosdev;      /* DosDevices mount point */
     struct mount_point   *volume;      /* Volume{xxx} mount point */
+    char                 *unix_device; /* unix device path */
     char                 *unix_mount;  /* unix mount point path */
 };
 
@@ -88,6 +89,15 @@ static char *get_dosdevices_path( char **drive )
     return path;
 }
 
+static char *strdupA( const char *str )
+{
+    char *ret;
+
+    if (!str) return NULL;
+    if ((ret = RtlAllocateHeap( GetProcessHeap(), 0, strlen(str) + 1 ))) strcpy( ret, str );
+    return ret;
+}
+
 /* read a Unix symlink; returned buffer must be freed by caller */
 static char *read_symlink( const char *path )
 {
@@ -186,7 +196,8 @@ static NTSTATUS create_disk_device( const char *udi, DWORD type, struct dos_driv
         drive->type   = type;
         drive->dosdev = NULL;
         drive->volume = NULL;
-        drive->unix_mount = NULL;
+        drive->unix_device = NULL;
+        drive->unix_mount  = NULL;
         drive->symlink.Buffer = NULL;
         if (udi)
         {
@@ -258,6 +269,7 @@ static void delete_disk_device( struct dos_drive *drive )
         IoDeleteSymbolicLink( &drive->symlink );
         RtlFreeUnicodeString( &drive->symlink );
     }
+    RtlFreeHeap( GetProcessHeap(), 0, drive->unix_device );
     RtlFreeHeap( GetProcessHeap(), 0, drive->unix_mount );
     RtlFreeHeap( GetProcessHeap(), 0, drive->udi );
     RtlFreeUnicodeString( &drive->name );
@@ -379,8 +391,7 @@ static BOOL set_unix_mount_point( struct dos_drive *drive, const char *mount_poi
             modified = TRUE;
         }
         RtlFreeHeap( GetProcessHeap(), 0, drive->unix_mount );
-        if ((drive->unix_mount = RtlAllocateHeap( GetProcessHeap(), 0, strlen(mount_point) + 1 )))
-            strcpy( drive->unix_mount, mount_point );
+        drive->unix_mount = strdupA( mount_point );
         if (drive->dosdev) set_mount_point_id( drive->dosdev, mount_point, strlen(mount_point) + 1 );
         if (drive->volume) set_mount_point_id( drive->volume, mount_point, strlen(mount_point) + 1 );
     }
@@ -400,7 +411,7 @@ static BOOL set_unix_mount_point( struct dos_drive *drive, const char *mount_poi
 /* create devices for mapped drives */
 static void create_drive_devices(void)
 {
-    char *path, *p, *link;
+    char *path, *p, *link, *device;
     struct dos_drive *drive;
     unsigned int i;
     HKEY drives_key;
@@ -415,6 +426,8 @@ static void create_drive_devices(void)
         p[0] = 'a' + i;
         p[2] = 0;
         if (!(link = read_symlink( path ))) continue;
+        p[2] = ':';
+        device = read_symlink( path );
 
         drive_type = i < 2 ? DRIVE_REMOVABLE : DRIVE_FIXED;
         if (drives_key)
@@ -438,9 +451,14 @@ static void create_drive_devices(void)
         if (!create_disk_device( NULL, drive_type, &drive ))
         {
             drive->unix_mount = link;
+            drive->unix_device = device;
             set_drive_letter( drive, i );
         }
-        else RtlFreeHeap( GetProcessHeap(), 0, link );
+        else
+        {
+            RtlFreeHeap( GetProcessHeap(), 0, link );
+            RtlFreeHeap( GetProcessHeap(), 0, device );
+        }
     }
     RegCloseKey( drives_key );
     RtlFreeHeap( GetProcessHeap(), 0, path );
@@ -467,6 +485,8 @@ BOOL add_dos_device( const char *udi, const char *device, const char *mount_poin
     if (create_disk_device( udi, type, &drive )) return FALSE;
 
 found:
+    RtlFreeHeap( GetProcessHeap(), 0, drive->unix_device );
+    drive->unix_device = strdupA( device );
     set_drive_letter( drive, letter );
     set_unix_mount_point( drive, mount_point );
 




More information about the wine-cvs mailing list