diff --git a/programs/winecfg/drive.c b/programs/winecfg/drive.c
index b4015afddedd827fc4c06710ddfbca43cf710094..40dc57460d3c2dc8f2591e6cdc1d3d181226d753 100644
--- a/programs/winecfg/drive.c
+++ b/programs/winecfg/drive.c
@@ -41,44 +41,119 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(winecfg);
 
-/*******************************************************************/
-/*  the configuration properties affected by this code             */
-/*******************************************************************/
-static BOOL initialized = FALSE;
+static BOOL updatingUI = FALSE;
+static char editWindowLetter; /* drive letter of the drive we are currently editing */
 
-void initDriveDlg (HWND hDlg)
-{
-    int i;
-
-    /* Clear the listbox */
-    SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_RESETCONTENT, 0, 0);
-    for (i = 0; i < config.driveCount; i++) {
-	int itemIndex;
-	DRIVE_DESC *drive = DPA_GetPtr(config.pDrives, i);
-	char *title = malloc(MAX_NAME_LENGTH);
-	
-	WINE_TRACE("Iterating, item %d of %d, drive=%p\n", i, config.driveCount, drive);
-	assert(drive);
 
-	WINE_TRACE("Adding %s (%s) to the listbox\n", drive->szName, drive->szLabel);
+/* returns NULL on failure. caller is responsible for freeing result */
+char *getDriveValue(char letter, char *valueName) {
+  HKEY hkDrive = 0;
+  char *subKeyName;
+  char *result = NULL;
+  HRESULT hr;
+  DWORD bufferSize;
+  
+  WINE_TRACE("letter=%c, valueName=%s\n", letter, valueName);
 
-	/* the first SendMessage call adds the string and returns the index, the second associates that index with it */
-	snprintf(title, MAX_NAME_LENGTH, "Drive %s (%s)", drive->szName, drive->szLabel);
-	itemIndex = SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_ADDSTRING ,(WPARAM) -1, (LPARAM) title);
-	SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_SETITEMDATA, itemIndex, (LPARAM) itemIndex);
-	free(title);
-    }
-    
-    initialized = TRUE;
-}
+  subKeyName = malloc(strlen("Drive X"));
+  sprintf(subKeyName, "Drive %c", letter);
 
+  hr = RegOpenKeyEx(configKey, subKeyName, 0, KEY_READ, &hkDrive);
+  if (hr != ERROR_SUCCESS) goto end;
 
-void saveDriveDlgSettings (HWND hDlg)
-{
+  hr = RegQueryValueEx(hkDrive, valueName, NULL, NULL, NULL, &bufferSize);
+  if (hr != ERROR_SUCCESS) goto end;
 
+  result = malloc(bufferSize);
+  hr = RegQueryValueEx(hkDrive, valueName, NULL, NULL, result, &bufferSize);
+  if (hr != ERROR_SUCCESS) goto end;
+  
+end:
+  if (hkDrive) RegCloseKey(hkDrive);
+  free(subKeyName);
+  return result;
 }
 
+void initDriveDlg (HWND hDlg)
+{
+  int i;
+  char *subKeyName = malloc(MAX_NAME_LENGTH);
+  int driveCount = 0;
+  DWORD sizeOfSubKeyName;
+
+  WINE_TRACE("\n");
 
+  updatingUI = TRUE;
+
+  /* Clear the listbox */
+  SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_RESETCONTENT, 0, 0);
+  for (i = 0;
+       RegEnumKeyExA(configKey, i, subKeyName, &sizeOfSubKeyName, NULL, NULL, NULL, NULL ) != ERROR_NO_MORE_ITEMS;
+       ++i, sizeOfSubKeyName = 50) {
+    
+    HKEY hkDrive;
+    char returnBuffer[MAX_NAME_LENGTH];
+    DWORD sizeOfReturnBuffer = sizeof(returnBuffer);
+    LONG r;
+
+    if (!strncmp("Drive ", subKeyName, 5)) {
+      char driveLetter = '\0';
+      char *label;
+      char *title;
+      int titleLen;
+      const char *itemLabel = "Drive %s (%s)";
+      int itemIndex;
+      
+      if (RegOpenKeyExA (configKey, subKeyName, 0, KEY_READ, &hkDrive) != ERROR_SUCCESS)        {
+        WINE_ERR("unable to open drive registry key");
+        RegCloseKey(configKey);
+        return;
+      }
+      
+      /* extract the drive letter, force to upper case */
+      driveLetter = subKeyName[strlen(subKeyName)-1];
+      if(driveLetter) driveLetter = toupper(driveLetter);
+      
+      ZeroMemory(returnBuffer, sizeof(*returnBuffer));
+      sizeOfReturnBuffer = sizeof(returnBuffer);
+      r = RegQueryValueExA(hkDrive, "Label", NULL, NULL, returnBuffer, &sizeOfReturnBuffer);
+      if (r == ERROR_SUCCESS) {
+        label = malloc(sizeOfReturnBuffer);
+        strncpy(label, returnBuffer, sizeOfReturnBuffer);
+      } else {
+        WINE_WARN("label not loaded: %ld\n", r);
+        label = NULL;
+      }
+
+      /* We now know the label and drive letter, so we can add to the list. The list items will have the letter associated
+       * with them, which acts as the key. We can then use that letter to get/set the properties of the drive. */
+      WINE_TRACE("Adding %c (%s) to the listbox\n", driveLetter, label);
+      
+      if (!label) label = "no label";
+      titleLen = strlen(itemLabel) - 1 + strlen(label) - 2 + 1;
+      title = malloc(titleLen);
+      /* the %s in the item label will be replaced by the drive letter, so -1, then
+	 -2 for the second %s which will be expanded to the label, finally + 1 for terminating #0 */
+      snprintf(title, titleLen, "Drive %c (%s)", driveLetter, label);
+      
+      /* the first SendMessage call adds the string and returns the index, the second associates that index with it */
+      itemIndex = SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_ADDSTRING ,(WPARAM) -1, (LPARAM) title);
+      SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_SETITEMDATA, itemIndex, (LPARAM) driveLetter);
+      
+      free(title);
+      free(label);
+
+      driveCount++;
+	
+    }
+  }
+  
+  WINE_TRACE("loaded %d drives\n", driveCount);
+  
+  free(subKeyName);  
+  updatingUI = FALSE;
+  return;
+}
 
 /******************************************************************************/
 /*  The Drive Editing Dialog                                                  */
@@ -103,29 +178,11 @@ static code_desc_pair fs_pairs[] = {
   {"msdos", "MS-DOS 8 character file names"},
   {"unix", "UNIX file names"}
 };
+ 
 #define DRIVE_FS_DEFAULT 0
 
-long drive_available_mask(DRIVE_DESC *pCurrentDrive)
-{
-  int i;
-  DRIVE_DESC *pDrive;
-  long result = 0;
-  
-  for( i=0; i < config.pDrives->nItemCount; ++i) {
-    pDrive = (DRIVE_DESC *) DPA_GetPtr( config.pDrives, i );
-    if(pDrive) {
-      result |= DRIVE_MASK_BIT(pDrive->szName[0]);
-    }
-  }
-  
-  result = ~result; /*flag unused, not used*/
-  result |= DRIVE_MASK_BIT(pCurrentDrive->szName[0]);
-  WINE_TRACE( "finished drive letter loop with %ld\n", result );
 
-  return result;
-}
-
-void fill_drive_droplist(long mask, DRIVE_DESC *pCurrentDrive, HWND hDlg)
+void fill_drive_droplist(long mask, char currentLetter, HWND hDlg)
 {
   int i;
   int selection;
@@ -138,7 +195,7 @@ void fill_drive_droplist(long mask, DRIVE_DESC *pCurrentDrive, HWND hDlg)
       sName[0] = 'A' + i;
       SendDlgItemMessage( hDlg, IDC_COMBO_LETTER, CB_ADDSTRING, 0, (LPARAM) sName );
       
-      if( toupper(pCurrentDrive->szName[0]) == 'A' + i ) {
+      if( toupper(currentLetter) == 'A' + i ) {
 	selection = count;
       }
       
@@ -157,7 +214,6 @@ void fill_drive_droplist(long mask, DRIVE_DESC *pCurrentDrive, HWND hDlg)
   SendDlgItemMessage( hDlg, IDC_COMBO_LETTER, CB_SETCURSEL, selection, 0 );
 }
 
-
 /* if bEnable is 1 then we are editing a CDROM, so can enable all controls, otherwise we want to disable
  * "detect from device" and "serial number", but still allow the user to manually set the path. The UI
  * for this could be somewhat better -mike
@@ -172,263 +228,227 @@ void enable_labelserial_box(HWND hDlg, int bEnable)
   EnableWindow( GetDlgItem( hDlg, IDC_STATIC_LABEL ), bEnable );
 }
 
+/* This function produces a mask for each drive letter that isn't currently used. Each bit of the long result
+ * represents a letter, with A being the least significant bit, and Z being the most significant.
+ *
+ * To calculate this, we loop over each letter, and see if we can get a drive entry for it. If so, we
+ * set the appropriate bit. At the end, we flip each bit, to give the desired result.
+ *
+ * The letter parameter is always marked as being available. This is so the edit dialog can display the
+ * currently used drive letter alongside the available ones.
+ */
+long drive_available_mask(char letter)
+{
+  long result = 0;
+  char curLetter;
+  char *slop;
+  
+  WINE_TRACE("\n");
+ 
+  for (curLetter = 'A'; curLetter < 'Z'; curLetter++) {
+    slop = getDriveValue(curLetter, "Path");
+    if (slop != NULL) {
+      result |= DRIVE_MASK_BIT(curLetter);
+      free(slop);
+    }
+  }
+  
+  result = ~result; 
+  result |= DRIVE_MASK_BIT(letter);
+  
+  WINE_TRACE( "finished drive letter loop with %lx\n", result );
+  return result;
+}
+
+
+void refreshDriveEditDialog(HWND hDlg) {
+  char *path;
+  char *type;
+  char *fs;
+  char *serial;
+  char *label;
+  char *device;
+  int i, selection;
+
+  updatingUI = TRUE;
+  
+  /* Drive letters */
+  fill_drive_droplist( drive_available_mask( editWindowLetter ), editWindowLetter, hDlg );
+
+  /* path */
+  path = getDriveValue(editWindowLetter, "Path");
+  if (path) {
+    SetWindowText(GetDlgItem(hDlg, IDC_EDIT_PATH), path);
+  } else WINE_WARN("no Path field?\n");
+  
+  /* drive type */
+  type = getDriveValue(editWindowLetter, "Type");
+  if (type) {
+    for(i = 0, selection = -1; i < sizeof(type_pairs)/sizeof(code_desc_pair); i++) {
+      SendDlgItemMessage(hDlg, IDC_COMBO_TYPE, CB_ADDSTRING, 0,
+			 (LPARAM) type_pairs[i].sDesc);
+      if(strcasecmp(type_pairs[i].sCode, type) == 0){
+	selection = i;
+      }
+    }
+  
+    if( selection == -1 ) selection = DRIVE_TYPE_DEFAULT;
+    SendDlgItemMessage(hDlg, IDC_COMBO_TYPE, CB_SETCURSEL, selection, 0);
+  } else WINE_WARN("no Type field?\n");
+
+  
+  /* FileSystem name handling */
+  fs = getDriveValue(editWindowLetter, "FileSystem");
+  if (fs) {
+    for( i=0, selection=-1; i < sizeof(fs_pairs)/sizeof(code_desc_pair); i++) {
+      SendDlgItemMessage(hDlg, IDC_COMBO_NAMES, CB_ADDSTRING, 0,
+			 (LPARAM) fs_pairs[i].sDesc);
+      if(strcasecmp(fs_pairs[i].sCode, fs) == 0){
+	selection = i;
+      }
+    }
+  
+    if( selection == -1 ) selection = DRIVE_FS_DEFAULT;
+    SendDlgItemMessage(hDlg, IDC_COMBO_NAMES, CB_SETCURSEL, selection, 0);
+  } else WINE_WARN("no FileSystem field?\n");
+
+
+  /* removeable media properties */
+  serial = getDriveValue(editWindowLetter, "Serial");
+  if (serial) {
+    SendDlgItemMessage(hDlg, IDC_EDIT_SERIAL, WM_SETTEXT, 0,(LPARAM)serial);
+  } else WINE_WARN("no Serial field?\n");
+
+  label = getDriveValue(editWindowLetter, "Label");
+  if (label) {
+    SendDlgItemMessage(hDlg, IDC_EDIT_LABEL, WM_SETTEXT, 0,(LPARAM)label);
+  } else WINE_WARN("no Label field?\n");
+
+  device = getDriveValue(editWindowLetter, "Device");
+  if (device) {
+    SendDlgItemMessage(hDlg, IDC_EDIT_DEVICE, WM_SETTEXT, 0,(LPARAM)device);
+  } else WINE_WARN("no Device field?\n");
+
+  if( strcmp("cdrom", type) == 0 ||
+      strcmp("floppy", type) == 0) {
+    if( (strlen( device ) == 0) &&
+	((strlen( serial ) > 0) || (strlen( label ) > 0)) ) {
+      selection = IDC_RADIO_ASSIGN;
+    }
+    else {
+      selection = IDC_RADIO_AUTODETECT;
+    }
+    
+    enable_labelserial_box( hDlg, 1 );
+  }
+  else {
+    enable_labelserial_box( hDlg, 0 );
+    selection = IDC_RADIO_ASSIGN;
+  }
+
+  CheckRadioButton( hDlg, IDC_RADIO_AUTODETECT, IDC_RADIO_ASSIGN, selection );
+  SendDlgItemMessage(hDlg, IDC_EDIT_PATH, WM_SETTEXT, 0,(LPARAM)path);
+  
+  if (path) free(path);
+  if (type) free(type);
+  if (fs) free(fs);
+  if (serial) free(serial);
+  if (label) free(label);
+  if (device) free(device);
+  
+  updatingUI = FALSE;
+  
+  return;
+}
 
 INT_PTR CALLBACK DriveEditDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
-  int i;
   int selection;
 
   switch (uMsg)  {
-    case WM_INITDIALOG: {
-	DRIVE_DESC* pDrive = (DRIVE_DESC *)lParam;
-	
-	SetProp(hDlg, "PDRIVE", pDrive);
-
-	/* Fill in the list boxes */
-	/* Drive letters */
-	fill_drive_droplist( drive_available_mask( pDrive ), pDrive, hDlg );
-
-	/* drive type*/
-	for( i=0, selection=-1; i < sizeof(type_pairs)/sizeof(code_desc_pair); i++) {
-	  SendDlgItemMessage(hDlg, IDC_COMBO_TYPE, CB_ADDSTRING, 0,
-			     (LPARAM) type_pairs[i].sDesc);
-	  if(strcasecmp(type_pairs[i].sCode, pDrive->szType) == 0){
-	    selection = i;
-	  }
-	}
-	
-	if( selection == -1 ) {
-	  selection = DRIVE_TYPE_DEFAULT;
-	}
-	SendDlgItemMessage(hDlg, IDC_COMBO_TYPE, CB_SETCURSEL, selection, 0);
-
-	/* FileSystem name handling */
-	for( i=0, selection=-1; i < sizeof(fs_pairs)/sizeof(code_desc_pair); i++) {
-	  SendDlgItemMessage(hDlg, IDC_COMBO_NAMES, CB_ADDSTRING, 0,
-			     (LPARAM) fs_pairs[i].sDesc);
-	  if(strcasecmp(fs_pairs[i].sCode, pDrive->szFS) == 0){
-	    selection = i;
-	  }
-	}
-	
-	if( selection == -1 ) {
-	  selection = DRIVE_FS_DEFAULT;
-	}
-	SendDlgItemMessage(hDlg, IDC_COMBO_NAMES, CB_SETCURSEL, selection, 0);
-
-       
-	/* removeable media properties */
-	SendDlgItemMessage(hDlg, IDC_EDIT_SERIAL, WM_SETTEXT, 0,(LPARAM)pDrive->szSerial);
-	SendDlgItemMessage(hDlg, IDC_EDIT_LABEL, WM_SETTEXT, 0,(LPARAM)pDrive->szLabel);
-	SendDlgItemMessage(hDlg, IDC_EDIT_DEVICE, WM_SETTEXT, 0,(LPARAM)pDrive->szDevice);
-	if( strcmp("cdrom", pDrive->szType) == 0 ||
-	    strcmp("floppy", pDrive->szType) == 0) {
-	  if( (strlen( pDrive->szDevice ) == 0) &&
-	      ((strlen( pDrive->szSerial ) > 0) || (strlen( pDrive->szLabel ) > 0)) ) {
-	    selection = IDC_RADIO_ASSIGN;
-	  }
-	  else {
-	    selection = IDC_RADIO_AUTODETECT;
-	  }
-	
-	  enable_labelserial_box( hDlg, 1 );
-	}
-	else {
-	  enable_labelserial_box( hDlg, 0 );
-	  selection = IDC_RADIO_ASSIGN;
-	}
-	
-	CheckRadioButton( hDlg, IDC_RADIO_AUTODETECT, IDC_RADIO_ASSIGN, selection );
-	SendDlgItemMessage(hDlg, IDC_EDIT_PATH, WM_SETTEXT, 0,(LPARAM)pDrive->szPath);
-	break;
+      case WM_INITDIALOG: {
+	editWindowLetter = (char) lParam;
+	refreshDriveEditDialog(hDlg);
       }
 
     case WM_COMMAND:
-      switch (LOWORD(wParam))
-	{
-	case IDC_COMBO_TYPE:
-	  switch( HIWORD(wParam)) 
-	    {
-	    case CBN_SELCHANGE:
-	      selection = SendDlgItemMessage( hDlg, IDC_COMBO_TYPE, CB_GETCURSEL, 0, 0);
-	      if( selection == 2 || selection == 3 ) { /* cdrom or floppy */
-		enable_labelserial_box( hDlg, 1 );
-	      }
-	      else {
-		enable_labelserial_box( hDlg, 0 );
-	      }
-	      break;
-	    }
-	  break;
-
-	case ID_BUTTON_OK:
-	  {
-	    DRIVE_DESC *pDrive = GetProp(hDlg, "PDRIVE");
-	    char buffer[MAX_NAME_LENGTH];
-	    
-	    /* fixme: do it in a cleanup */
-	    RemoveProp(hDlg, "PDRIVE");
-
-	    ZeroMemory(&buffer[0], MAX_NAME_LENGTH);
-	    GetWindowText(GetDlgItem(hDlg, IDC_EDIT_PATH), buffer, MAX_NAME_LENGTH);
-	    if (strlen(buffer) > 0) {
-	      strncpy(pDrive->szPath, buffer, MAX_NAME_LENGTH);
-	      
-	      /* only fill in the other values if we have a path */
-	      selection = SendDlgItemMessage( hDlg, IDC_COMBO_TYPE, CB_GETCURSEL, 0, 0);
-	      strncpy(pDrive->szType, type_pairs[selection].sCode, MAX_NAME_LENGTH);
-	      
-	      selection = SendDlgItemMessage( hDlg, IDC_COMBO_NAMES, CB_GETCURSEL, 0, 0);
-	      strncpy(pDrive->szFS, fs_pairs[selection].sCode, MAX_NAME_LENGTH);
-	      
-	      selection = SendDlgItemMessage( hDlg, IDC_COMBO_LETTER, CB_GETCURSEL, 0, 0);
-	      SendDlgItemMessage( hDlg, IDC_COMBO_LETTER, CB_GETLBTEXT, selection, (WPARAM)buffer);
-	      strncpy(pDrive->szName, buffer, MAX_NAME_LENGTH);
-	      pDrive->szName[1] = 0; /* truncate to only the letter */
-
-	      if( strncmp( pDrive->szType, "cdrom", MAX_NAME_LENGTH ) == 0) {
-		if( IsDlgButtonChecked( hDlg, IDC_RADIO_ASSIGN ) == BST_CHECKED ) {
-		  GetWindowText(GetDlgItem(hDlg, IDC_EDIT_LABEL), buffer, 
-				MAX_NAME_LENGTH);
-		  strncpy(pDrive->szLabel, buffer, MAX_NAME_LENGTH);
-		  GetWindowText(GetDlgItem(hDlg, IDC_EDIT_SERIAL), buffer, 
-				MAX_NAME_LENGTH);
-		  strncpy(pDrive->szSerial, buffer, MAX_NAME_LENGTH);
-		  pDrive->szDevice[0] = 0;
-		}
-		else {
-		  GetWindowText(GetDlgItem(hDlg, IDC_EDIT_DEVICE), buffer, 
-				MAX_NAME_LENGTH);
-		  strncpy(pDrive->szDevice, buffer, MAX_NAME_LENGTH);
-		  pDrive->szLabel[0] = 0;
-		  pDrive->szSerial[0] = 0;
-		}
-	      }
-	      else {
-		GetWindowText(GetDlgItem(hDlg, IDC_EDIT_LABEL), pDrive->szLabel, MAX_NAME_LENGTH);
-		GetWindowText(GetDlgItem(hDlg, IDC_EDIT_SERIAL), pDrive->szSerial, MAX_NAME_LENGTH);
-		GetWindowText(GetDlgItem(hDlg, IDC_EDIT_DEVICE), pDrive->szDevice, MAX_NAME_LENGTH);
-	      }
-	      EndDialog(hDlg, wParam);
+      switch (LOWORD(wParam)) {
+	  case IDC_COMBO_TYPE:
+	    switch( HIWORD(wParam)) {
+		case CBN_SELCHANGE:
+		  selection = SendDlgItemMessage( hDlg, IDC_COMBO_TYPE, CB_GETCURSEL, 0, 0);
+		  if( selection == 2 || selection == 3 ) { /* cdrom or floppy */
+		    enable_labelserial_box( hDlg, 1 );
+		  }
+		  else {
+		    enable_labelserial_box( hDlg, 0 );
+		  }
+		  break;
 	    }
-	    else { /* missing a path */
-	      MessageBox( hDlg, "Please enter a valid path", "ERROR", MB_OK );
-	    }
-	    return TRUE;
+	    break;
 	    
-	  }
-
+	  case ID_BUTTON_OK: break;
 	  
 	  /* Fall through. */
 	  
-	case ID_BUTTON_CANCEL:
-	  /* fixme: do it in a cleanup */
-	  RemoveProp(hDlg, "PDRIVE");
-	  EndDialog(hDlg, wParam);
-	  return TRUE;
-	}
-    }
+	  case ID_BUTTON_CANCEL:
+	    EndDialog(hDlg, wParam);
+	    return TRUE;
+      }
+  }
   return FALSE;
 }
 
 
-/***************************************************************************/
-/*  The Actual Property Sheet Page                                         */
-/***************************************************************************/
-
 INT_PTR CALLBACK
 DriveDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
   int selection = -1;
 
-  switch (uMsg)
-    {
-    case WM_INITDIALOG:
-      break;
-      
-    case WM_COMMAND:
-      switch (LOWORD(wParam))
-	{
-	case IDC_LIST_DRIVES:
-	  switch( HIWORD( wParam ) )
-	    {
-	    case LBN_DBLCLK:
-	      selection = -1;
+  switch (uMsg) {
+      case WM_COMMAND:
+	switch (LOWORD(wParam)) {
+	    case IDC_LIST_DRIVES:
+	      switch(HIWORD( wParam )) {
+		  case LBN_DBLCLK:
+		    selection = -1;
+		    break;
+	      }
+
+	    case IDC_BUTTON_ADD:
+	      /* temporarily disabled, awaiting rewrite for transactional design (need to fill in defaults smartly, wizard?) */
+	      break;
+
+	    case IDC_BUTTON_REMOVE:
+	      /* temporarily disabled, awaiting rewrite */
+	      break;
+	      
+	    case IDC_BUTTON_EDIT:
+	      if (HIWORD(wParam) == BN_CLICKED) {
+		int nItem = SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES),  LB_GETCURSEL, 0, 0);
+		char letter = SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_GETITEMDATA, nItem, 0);
+		
+		DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_DRIVE_EDIT2), NULL, (DLGPROC) DriveEditDlgProc, (LPARAM) letter);
+	      }
 	      break;
-	    }
-	case IDC_BUTTON_ADD:
-	  if (HIWORD(wParam)==BN_CLICKED) {
-	    DRIVE_DESC* pDrive = malloc(sizeof(DRIVE_DESC));
-	    
-	    /* adding a new drive */
-	    ZeroMemory(pDrive, sizeof(*pDrive));
-	    DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_DRIVE_EDIT2),
-			   NULL, (DLGPROC) DriveEditDlgProc, (LPARAM) pDrive );
-	    /* if pDrive is blank, free the memory, otherwise, add the pointer to HDPA and add to listbox */
-	    if (!(pDrive->szName[0]))
-	      free(pDrive);
-	    else {
-	      char DRIVE_NAME[7];
-	      int pos;
 	      
-	      ZeroMemory(DRIVE_NAME,sizeof(DRIVE_NAME));
-	      strcat(DRIVE_NAME, "Drive \0");
-	      strncat(DRIVE_NAME, pDrive->szName, 1);
-	      pos = SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_ADDSTRING ,(WPARAM) -1, (LPARAM) DRIVE_NAME);
-	      SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_SETITEMDATA, pos, (LPARAM) pos);
-	      DPA_InsertPtr(config.pDrives, pos, pDrive);
-	    }
-	  }
-	  break;
-	case IDC_BUTTON_EDIT:
-	  if (HIWORD(wParam)==BN_CLICKED) {
-	    int nItem = SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES),  LB_GETCURSEL, 0, 0);
-	    int i = SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_GETITEMDATA, nItem, 0);
-	    DRIVE_DESC* pDrive = DPA_GetPtr(config.pDrives, i);
-	    
-	    if (pDrive != NULL) {
-	      DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_DRIVE_EDIT2),
-			     NULL, (DLGPROC) DriveEditDlgProc, (LPARAM) pDrive );
-	      SetProp(hDlg, "PDRIVE", pDrive);
-	      WINE_TRACE("refreshing main dialog\n");
-	      initDriveDlg(hDlg);
-	    }
-	  }
-	  break;
-	case IDC_BUTTON_REMOVE:
-	  if (HIWORD(wParam)==BN_CLICKED) {
-	    int nItem = SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_GETCURSEL, 0, 0);
-	    SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_DELETESTRING, (WPARAM) nItem, (LPARAM) 0 );
-	    free(DPA_GetPtr(config.pDrives, nItem));
-	  }
-
-	default:
-	  /** SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); */
-	  break;
-	}
-      break;
-
-    case WM_NOTIFY:
-      switch(((LPNMHDR)lParam)->code)
-	{
-	case PSN_KILLACTIVE: {
-	  /* validate user info.  Lets just assume everything is okay for now */
-	  SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
 	}
-	case PSN_APPLY: {
-	  /* should probably check everything is really all rosy :) */
-	  saveDriveDlgSettings (hDlg);
-	  SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
+	break;
+	
+      case WM_NOTIFY: switch(((LPNMHDR)lParam)->code) {
+	    case PSN_KILLACTIVE:
+	      SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
+	      break;
+	    case PSN_APPLY:
+	      SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
+	      break;
+	    case PSN_SETACTIVE:
+	      initDriveDlg (hDlg);
+	      break;
 	}
-	case PSN_SETACTIVE: {
-	  if (!initialized)
-	    initDriveDlg (hDlg);
+	break;
 
-	}
-	}
+  }
 
-    default:
-      break;
-    }
   return FALSE;
 }
diff --git a/programs/winecfg/main.c b/programs/winecfg/main.c
index 8f98132a0b3a605e9a593df7b9fb6b4f2ce969b3..085f0310da9dea4adb85f6a67671a0d3b2bba14e 100644
--- a/programs/winecfg/main.c
+++ b/programs/winecfg/main.c
@@ -36,8 +36,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(winecfg);
 
-WINECFG_DESC config;
-
 void CALLBACK
 PropSheetCallback (HWND hWnd, UINT uMsg, LPARAM lParam)
 {
diff --git a/programs/winecfg/properties.h b/programs/winecfg/properties.h
index 7e2d4bcbb73d024ab9fe0247ac3c532b8125f666..4fea71e01320a6e7c6d4ff1d4e7a29972c75ff9b 100644
--- a/programs/winecfg/properties.h
+++ b/programs/winecfg/properties.h
@@ -61,17 +61,6 @@ typedef struct
 } APP_DESC;
 
 
-typedef struct
-{
-    char szName[MAX_NAME_LENGTH];
-    char szPath[MAX_NAME_LENGTH];
-    char szType[MAX_NAME_LENGTH];
-    char szFS[MAX_NAME_LENGTH];
-    char szLabel[MAX_NAME_LENGTH];
-    char szDevice[MAX_NAME_LENGTH];
-    char szSerial[MAX_NAME_LENGTH];
-} DRIVE_DESC;
-
 typedef struct
 {
     char   szX11Display[MAX_NAME_LENGTH];
diff --git a/programs/winecfg/winecfg.c b/programs/winecfg/winecfg.c
index ed34fd4c9855b06b502a6c177f30063a9bc1c34d..4719e66164d94de72b1b3011d8243847e7cbdeba 100644
--- a/programs/winecfg/winecfg.c
+++ b/programs/winecfg/winecfg.c
@@ -179,157 +179,6 @@ HRESULT removeConfigValue(char *subkey, char *valueName) {
 }
 
 
-/*****************************************************************************
- * Name       : loadConfig
- * Description: Loads and populates a configuration structure
- * Parameters : pCfg
- * Returns    : 0 on success, -1 otherwise
- *
- */
-int loadConfig (WINECFG_DESC* pCfg)
-{
-    const DLL_DESC *pDllDefaults;
-    char buffer[MAX_PATH];
-    char subKeyName[51];
-    DWORD res, i, sizeOfSubKeyName = 50;
-
-    WINE_TRACE("\n");
-
-    return_if_fail( initialize() == 0 , 1 );
-
-    /* System Paths */
-/*  getConfigValue(configKey, "Wine", "Windows", pCfg->szWinDir, MAX_PATH, "c:\\Windows");
-    getConfigValue(configKey, "Wine", "System", pCfg->szWinSysDir, MAX_PATH, "c:\\Windows\\System");
-    getConfigValue(configKey, "Wine", "Temp", pCfg->szWinTmpDir, MAX_PATH, "c:\\Windows\\Temp");
-    getConfigValue(configKey, "Wine", "Profile", pCfg->szWinProfDir, MAX_PATH, "c:\\Windows\\Profiles\\Administrator");
-    getConfigValue(configKey, "Wine", "Path", pCfg->szWinPath, MAX_PATH, "c:\\Windows;c:\\Windows\\System");
-*/
-    /* Graphics driver */
-/*  getConfigValue(configKey, "Wine", "GraphicsDriver", pCfg->szGraphDriver, MAX_NAME_LENGTH, "x11drv");
- */    
-    /*
-     * DLL defaults for all applications is built using
-     * the default DLL structure
-     */
-/*    for (pDllDefaults = getDLLDefaults (); *pDllDefaults->szName; pDllDefaults++)
-    {
-        DLL_DESC *pDll = malloc(sizeof(DLL_DESC));
-	memcpy (pDll, pDllDefaults, sizeof(DLL_DESC));
-        DPA_InsertPtr(pCfg->pDlls, INT_MAX, pDll);
-    }
-*/
-
-    pCfg->sX11Drv.nTextCP = 0;
-    pCfg->sX11Drv.nXVideoPort = 43;
-    pCfg->sX11Drv.nDepth = 16;
-    pCfg->sX11Drv.nManaged = 1;
-    pCfg->sX11Drv.nDesktopSizeX = 640;
-    pCfg->sX11Drv.nDesktopSizeY = 480;
-    pCfg->sX11Drv.nDGA = 1;
-    pCfg->sX11Drv.nXVidMode = 1;
-    pCfg->sX11Drv.nTakeFocus = 1;
-    pCfg->sX11Drv.nDXGrab = 0;
-    pCfg->sX11Drv.nDoubleBuffered = 0;
-    pCfg->sX11Drv.nSynchronous = 1;
-
-
-    /*
-     * Drive mappings
-     */
-/*  pCfg->pDrives = DPA_Create(26);
-    for (i = 0;
-	 RegEnumKeyExA(configKey, i, subKeyName, &sizeOfSubKeyName, NULL, NULL, NULL, NULL ) != ERROR_NO_MORE_ITEMS;
-         ++i, sizeOfSubKeyName=50) {
-	HKEY hkDrive;
-	DWORD returnType;
-	char returnBuffer[MAX_NAME_LENGTH];
-	DWORD sizeOfReturnBuffer = sizeof(returnBuffer);
-	LONG r;
-
-	if (!strncmp("Drive ", subKeyName, 5)) {
-	    DRIVE_DESC *pDrive = malloc(sizeof(DRIVE_DESC));
-
-	    WINE_TRACE("Loading %s\n", subKeyName);
-	    
-	    ZeroMemory(pDrive, sizeof(*pDrive));
-	    sizeOfReturnBuffer = sizeof(returnBuffer);
-	    if (RegOpenKeyExA (configKey, subKeyName, 0, KEY_READ, &hkDrive) != ERROR_SUCCESS)	{
-		WINE_ERR("unable to open drive registry key");
-		RegCloseKey(configKey);
-		return 1;
-	    }
-	   
-	    strncpy(pDrive->szName, &subKeyName[strlen(subKeyName)-1],1);
-	    if(pDrive->szName) {
-		pDrive->szName[0] = toupper(pDrive->szName[0]);
-	    }
-	    
-	    ZeroMemory(returnBuffer, sizeof(*returnBuffer));
-	    sizeOfReturnBuffer = sizeof(returnBuffer);
-	    r = RegQueryValueExA(hkDrive, "Label", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer);
-	    if (r == ERROR_SUCCESS) {
-		strncpy(pDrive->szLabel, returnBuffer, sizeOfReturnBuffer);
-	    } else {
-		WINE_WARN("pDrive->szLabel not loaded: %ld\n", r);
-	    }
-	    
-	    ZeroMemory(returnBuffer, sizeof(*returnBuffer));
-	    sizeOfReturnBuffer = sizeof(returnBuffer);
-	    r = RegQueryValueExA(hkDrive, "Serial", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer);
-	    if (r == ERROR_SUCCESS) {
-		strncpy(pDrive->szSerial, returnBuffer, sizeOfReturnBuffer);
-	    } else {
-		WINE_WARN("pDrive->szSerial not loaded: %ld\n", r);
-	    }
-	    
-	    
-	    ZeroMemory(returnBuffer, sizeof(*returnBuffer));
-	    sizeOfReturnBuffer = sizeof(returnBuffer);
-	    r = RegQueryValueExA(hkDrive, "Type", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer);
-	    if (r == ERROR_SUCCESS) {
-		strncpy(pDrive->szType, returnBuffer, sizeOfReturnBuffer);
-	    } else {
-		WINE_WARN("pDrive->szType not loaded: %ld", r);
-	    }
-	    
-	    ZeroMemory(returnBuffer, sizeof(*returnBuffer));
-	    sizeOfReturnBuffer = sizeof(returnBuffer);
-	    if (RegQueryValueExA(hkDrive, "Path", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer) == ERROR_SUCCESS) {
-		strncpy(pDrive->szPath, returnBuffer, sizeOfReturnBuffer);
-	    } else {
-		WINE_WARN("pDrive->szPath not loaded: %ld\n", GetLastError());
-	    }
-	    
-	    ZeroMemory(returnBuffer, sizeof(*returnBuffer));
-	    sizeOfReturnBuffer = sizeof(returnBuffer);
-	    if (RegQueryValueExA(hkDrive, "FileSystem", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer) == ERROR_SUCCESS) {
-		strncpy(pDrive->szFS, returnBuffer, sizeOfReturnBuffer);
-	    } else {
-		WINE_WARN("pDrive->szFS not loaded: %ld\n", GetLastError());
-	    }
-
-	    ZeroMemory(returnBuffer, sizeof(*returnBuffer));
-	    sizeOfReturnBuffer = sizeof(returnBuffer);
-	    if (RegQueryValueExA(hkDrive, "Device", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer) == ERROR_SUCCESS) {
-		strncpy(pDrive->szDevice, returnBuffer, sizeOfReturnBuffer);
-	    } else {
-		WINE_WARN("pDrive->szDevice not found: %ld\n", GetLastError());
-	    }
-
-	    if (DPA_InsertPtr(pCfg->pDrives, pCfg->driveCount, pDrive) == -1)
-		WINE_ERR("Failed to insert pDrive into DPA\n");
-	    else
-		pCfg->driveCount++;
-	    
-	}
-    }
-    WINE_TRACE("loaded %d drives\n", pCfg->driveCount);
- */
-    return 0;
-}
-
-
-
 /* ========================================================================= */
 /* Transaction management code */
 
diff --git a/programs/winecfg/winecfg.h b/programs/winecfg/winecfg.h
index 43e438b4ba414e21fda27698faed839db59fd600..7bc36ddec573267cff39739c62aef2461c7759c2 100644
--- a/programs/winecfg/winecfg.h
+++ b/programs/winecfg/winecfg.h
@@ -79,48 +79,7 @@ void destroyTransaction(struct transaction *trans);
 
 /* Initializes the transaction system */
 int initialize(void);
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct structWineCfg
-{
-    char   szWinVer[MAX_VERSION_LENGTH];
-    char   szWinLook[MAX_VERSION_LENGTH];
-    char   szDOSVer[MAX_VERSION_LENGTH];
-
-    char   szWinDir[MAX_PATH];
-    char   szWinSysDir[MAX_PATH];
-    char   szWinPath[MAX_PATH];
-    char   szWinTmpDir[MAX_PATH];
-    char   szWinProfDir[MAX_PATH];
-
-    char   szGraphDriver[MAX_NAME_LENGTH];
-
-    HDPA   pDlls;
-    HDPA   pApps;
-    HDPA   pDrives;
-
-    int    driveCount;
-
-    X11DRV_DESC sX11Drv;
-} WINECFG_DESC;
-
-extern WINECFG_DESC config;
-
-WINECFG_DESC *allocConfig(void);
-int freeConfig(WINECFG_DESC *pCfg);
-
-int loadConfig(WINECFG_DESC *pCfg);
-int saveConfig(const WINECFG_DESC *pCfg);
+extern HKEY configKey;
 
 int setConfigValue (char *subkey, char *valueName, const char *value);
 char *getConfigValue (char *subkey, char *valueName, char *defaultResult);