Alexandre Julliard : winecfg: Use an ioctl to the mount manager to define drives.
Alexandre Julliard
julliard at winehq.org
Fri Oct 24 08:12:21 CDT 2008
Module: wine
Branch: master
Commit: eb65f6a212658a0554a8ffe7b6bb0645a7aee28a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=eb65f6a212658a0554a8ffe7b6bb0645a7aee28a
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Oct 23 16:00:00 2008 +0200
winecfg: Use an ioctl to the mount manager to define drives.
---
programs/winecfg/drive.c | 111 +++++++++++++++++++---------------------------
1 files changed, 45 insertions(+), 66 deletions(-)
diff --git a/programs/winecfg/drive.c b/programs/winecfg/drive.c
index bc3766c..35f013b 100644
--- a/programs/winecfg/drive.c
+++ b/programs/winecfg/drive.c
@@ -29,8 +29,12 @@
#include <stdio.h>
#include <string.h>
+#include <ntstatus.h>
+#define WIN32_NO_STATUS
#include <windef.h>
#include <winbase.h>
+#include <winternl.h>
+#include <winioctl.h>
#include <winreg.h>
#include <wine/debug.h>
#include <shellapi.h>
@@ -38,6 +42,8 @@
#include <shlguid.h>
#include <shlwapi.h>
#include <shlobj.h>
+#define WINE_MOUNTMGR_EXTENSIONS
+#include <ddk/mountmgr.h>
#include <wine/library.h>
#include "winecfg.h"
@@ -120,36 +126,6 @@ void delete_drive(struct drive *d)
d->modified = TRUE;
}
-static void set_drive_type( char letter, DWORD type )
-{
- HKEY hKey;
- char driveValue[4];
- const char *typeText = NULL;
-
- sprintf(driveValue, "%c:", letter);
-
- /* Set the drive type in the registry */
- if (type == DRIVE_FIXED)
- typeText = "hd";
- else if (type == DRIVE_REMOTE)
- typeText = "network";
- else if (type == DRIVE_REMOVABLE)
- typeText = "floppy";
- else if (type == DRIVE_CDROM)
- typeText = "cdrom";
-
- if (RegCreateKey(HKEY_LOCAL_MACHINE, "Software\\Wine\\Drives", &hKey) != ERROR_SUCCESS)
- WINE_TRACE(" Unable to open '%s'\n", "Software\\Wine\\Drives");
- else
- {
- if (typeText)
- RegSetValueEx( hKey, driveValue, 0, REG_SZ, (const BYTE *)typeText, strlen(typeText) + 1 );
- else
- RegDeleteValue( hKey, driveValue );
- RegCloseKey(hKey);
- }
-}
-
static DWORD get_drive_type( char letter )
{
HKEY hKey;
@@ -263,6 +239,17 @@ BOOL moveDrive(struct drive *pSrc, struct drive *pDst)
#endif
+static HANDLE open_mountmgr(void)
+{
+ HANDLE ret;
+
+ if ((ret = CreateFileW( MOUNTMGR_DOS_DEVICE_NAME, GENERIC_READ|GENERIC_WRITE,
+ FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ 0, 0 )) == INVALID_HANDLE_VALUE)
+ WINE_ERR( "failed to open mount manager err %u\n", GetLastError() );
+ return ret;
+}
+
/* Load currently defined drives into the drives array */
void load_drives(void)
{
@@ -386,55 +373,47 @@ void load_drives(void)
void apply_drive_changes(void)
{
int i;
- CHAR devicename[4];
- CHAR targetpath[256];
+ HANDLE mgr;
+ DWORD len;
+ struct mountmgr_unix_drive *ioctl;
WINE_TRACE("\n");
+ if ((mgr = open_mountmgr()) == INVALID_HANDLE_VALUE) return;
+
/* add each drive and remove as we go */
for(i = 0; i < 26; i++)
{
if (!drives[i].modified) continue;
drives[i].modified = FALSE;
- snprintf(devicename, sizeof(devicename), "%c:", 'A' + i);
-
+ len = sizeof(*ioctl);
+ if (drives[i].in_use) len += strlen(drives[i].unixpath) + 1;
+ if (!(ioctl = HeapAlloc( GetProcessHeap(), 0, len ))) continue;
+ ioctl->size = len;
+ ioctl->letter = 'a' + i;
+ ioctl->device_offset = 0;
if (drives[i].in_use)
{
- /* define this drive */
- /* DefineDosDevice() requires that NO trailing slash be present */
- if(!DefineDosDevice(DDD_RAW_TARGET_PATH, devicename, drives[i].unixpath))
- {
- WINE_ERR(" unable to define devicename of '%s', targetpath of '%s'\n",
- devicename, drives[i].unixpath);
- PRINTERROR();
- }
- else
- {
- WINE_TRACE(" added devicename of '%s', targetpath of '%s'\n",
- devicename, drives[i].unixpath);
- }
- set_drive_label( drives[i].letter, drives[i].label );
- set_drive_serial( drives[i].letter, drives[i].serial );
- set_drive_type( drives[i].letter, drives[i].type );
+ ioctl->type = drives[i].type;
+ ioctl->mount_point_offset = sizeof(*ioctl);
+ strcpy( (char *)(ioctl + 1), drives[i].unixpath );
+ }
+ else
+ {
+ ioctl->type = DRIVE_NO_ROOT_DIR;
+ ioctl->mount_point_offset = 0;
}
- else if (QueryDosDevice(devicename, targetpath, sizeof(targetpath)))
+
+ if (DeviceIoControl( mgr, IOCTL_MOUNTMGR_DEFINE_UNIX_DRIVE, ioctl, len, NULL, 0, NULL, NULL ))
{
- /* remove this drive */
- if(!DefineDosDevice(DDD_REMOVE_DEFINITION, devicename, drives[i].unixpath))
- {
- WINE_ERR("unable to remove devicename of '%s', targetpath of '%s'\n",
- devicename, drives[i].unixpath);
- PRINTERROR();
- }
- else
- {
- WINE_TRACE("removed devicename of '%s', targetpath of '%s'\n",
- devicename, drives[i].unixpath);
- }
-
- set_drive_type( drives[i].letter, DRIVE_UNKNOWN );
- continue;
+ set_drive_label( drives[i].letter, drives[i].label );
+ if (drives[i].in_use) set_drive_serial( drives[i].letter, drives[i].serial );
+ WINE_TRACE( "set drive %c: to %s type %u\n", 'a' + i,
+ wine_dbgstr_a(drives[i].unixpath), drives[i].type );
}
+ else WINE_WARN( "failed to set drive %c: to %s type %u err %u\n", 'a' + i,
+ wine_dbgstr_a(drives[i].unixpath), drives[i].type, GetLastError() );
}
+ CloseHandle( mgr );
}
More information about the wine-cvs
mailing list