Alexandre Julliard : mountmgr: Create a PhysicalDrive symlink for all harddisk devices.
Alexandre Julliard
julliard at winehq.org
Wed Oct 22 07:59:52 CDT 2008
Module: wine
Branch: master
Commit: bb13bbe13d6f76330c9a726bf69ac005d7b094cb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bb13bbe13d6f76330c9a726bf69ac005d7b094cb
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Oct 21 16:08:51 2008 +0200
mountmgr: Create a PhysicalDrive symlink for all harddisk devices.
---
dlls/mountmgr.sys/device.c | 17 +++++++++++++++++
1 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/dlls/mountmgr.sys/device.c b/dlls/mountmgr.sys/device.c
index 21e0b2c..4a1a795 100644
--- a/dlls/mountmgr.sys/device.c
+++ b/dlls/mountmgr.sys/device.c
@@ -63,6 +63,7 @@ struct dos_drive
DWORD type; /* drive type */
DEVICE_OBJECT *device; /* disk device allocated for this drive */
UNICODE_STRING name; /* device name */
+ UNICODE_STRING symlink; /* device symlink if any */
STORAGE_DEVICE_NUMBER devnum; /* device number info */
struct mount_point *dosdev; /* DosDevices mount point */
struct mount_point *volume; /* Volume{xxx} mount point */
@@ -139,6 +140,7 @@ static NTSTATUS create_disk_device( const char *udi, DWORD type, struct dos_driv
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 physdriveW[] = {'\\','?','?','\\','P','h','y','s','i','c','a','l','D','r','i','v','e','%','u',0};
UINT i, first = 0;
NTSTATUS status = 0;
@@ -185,6 +187,7 @@ static NTSTATUS create_disk_device( const char *udi, DWORD type, struct dos_driv
drive->dosdev = NULL;
drive->volume = NULL;
drive->unix_mount = NULL;
+ drive->symlink.Buffer = NULL;
if (udi)
{
if (!(drive->udi = HeapAlloc( GetProcessHeap(), 0, strlen(udi)+1 )))
@@ -212,6 +215,15 @@ static NTSTATUS create_disk_device( const char *udi, DWORD type, struct dos_driv
drive->devnum.DeviceType = FILE_DEVICE_DISK;
if (udi)
{
+ UNICODE_STRING symlink;
+
+ symlink.MaximumLength = sizeof(physdriveW) + 10 * sizeof(WCHAR);
+ if ((symlink.Buffer = RtlAllocateHeap( GetProcessHeap(), 0, symlink.MaximumLength)))
+ {
+ sprintfW( symlink.Buffer, physdriveW, i );
+ symlink.Length = strlenW(symlink.Buffer) * sizeof(WCHAR);
+ if (!IoCreateSymbolicLink( &symlink, &name )) drive->symlink = symlink;
+ }
drive->devnum.DeviceNumber = i;
drive->devnum.PartitionNumber = 0;
}
@@ -241,6 +253,11 @@ static void delete_disk_device( struct dos_drive *drive )
list_remove( &drive->entry );
if (drive->dosdev) delete_mount_point( drive->dosdev );
if (drive->volume) delete_mount_point( drive->volume );
+ if (drive->symlink.Buffer)
+ {
+ IoDeleteSymbolicLink( &drive->symlink );
+ RtlFreeUnicodeString( &drive->symlink );
+ }
RtlFreeHeap( GetProcessHeap(), 0, drive->unix_mount );
RtlFreeHeap( GetProcessHeap(), 0, drive->udi );
RtlFreeUnicodeString( &drive->name );
More information about the wine-cvs
mailing list