- Do only create a registry entry for partitions if the signature of the disk is non zero.  
- Do only mount partitions from a registry key if the signature is non zero.  
- Do delete all registry keys for non existing partitions.
Modified: trunk/reactos/ntoskrnl/io/disk.c

Modified: trunk/reactos/ntoskrnl/io/disk.c
--- trunk/reactos/ntoskrnl/io/disk.c	2005-09-21 21:54:52 UTC (rev 17974)
+++ trunk/reactos/ntoskrnl/io/disk.c	2005-09-21 22:16:17 UTC (rev 17975)
@@ -377,7 +377,7 @@
 }
 
 
-static VOID
+static BOOLEAN
 HalpAssignDrive(IN PUNICODE_STRING PartitionName,
 		IN ULONG DriveNumber,
 		IN UCHAR DriveType,
@@ -399,7 +399,7 @@
       if ((ObSystemDeviceMap->DriveMap & (1 << DriveNumber)) != 0)
 	{
 	  DbgPrint("Drive letter already used!\n");
-	  return;
+	  return FALSE;
 	}
     }
   else
@@ -419,7 +419,7 @@
       if (DriveNumber == AUTO_DRIVE)
 	{
 	  DbgPrint("No drive letter available!\n");
-	  return;
+	  return FALSE;
 	}
     }
 
@@ -444,7 +444,9 @@
   Status = IoCreateSymbolicLink(&DriveName,
 		                PartitionName);
 
-  if (DriveType == DOSDEVICE_DRIVE_FIXED && hKey)
+  if (hKey &&
+      DriveType == DOSDEVICE_DRIVE_FIXED && 
+      Signature)
     {
       DiskMountInfo.Signature = Signature;
       DiskMountInfo.StartingOffset = StartingOffset;
@@ -462,6 +464,7 @@
           DPRINT1("ZwCreateValueKey failed for %wZ, status=%x\n", &DriveName, Status);
         }
     }
+  return TRUE;
 }
 
 ULONG
@@ -806,41 +809,50 @@
             {
               DPRINT("%wZ => %08x:%08x%08x\n", &UnicodeString1, DiskMountInfo->Signature, 
                      DiskMountInfo->StartingOffset.u.HighPart, DiskMountInfo->StartingOffset.u.LowPart);
-              for (i = 0; i < ConfigInfo->DiskCount; i++)
                 {
-                  DPRINT("%x\n", LayoutArray[i]->Signature);
-                  if (LayoutArray[i] &&
-                      LayoutArray[i]->Signature == DiskMountInfo->Signature)
+                  BOOLEAN Found = FALSE;
+                  for (i = 0; i < ConfigInfo->DiskCount; i++)
                     {
-                      for (j = 0; j < LayoutArray[i]->PartitionCount; j++)
+                      DPRINT("%x\n", LayoutArray[i]->Signature);
+                      if (LayoutArray[i] &&
+                          LayoutArray[i]->Signature &&
+                          LayoutArray[i]->Signature == DiskMountInfo->Signature)
                         {
-                          if (LayoutArray[i]->PartitionEntry[j].StartingOffset.QuadPart == DiskMountInfo->StartingOffset.QuadPart)
+                          for (j = 0; j < LayoutArray[i]->PartitionCount; j++)
                             {
-                              if (IsRecognizedPartition(LayoutArray[i]->PartitionEntry[j].PartitionType))
+                              if (LayoutArray[i]->PartitionEntry[j].StartingOffset.QuadPart == DiskMountInfo->StartingOffset.QuadPart)
                                 {
-                    	          swprintf(Buffer2,
-		                           L"\\Device\\Harddisk%d\\Partition%d",
-                                           i,
-		                           LayoutArray[i]->PartitionEntry[j].PartitionNumber);
-	                          RtlInitUnicodeString(&UnicodeString2,
-				                       Buffer2);
+                                  if (IsRecognizedPartition(LayoutArray[i]->PartitionEntry[j].PartitionType) &&
+                                      LayoutArray[i]->PartitionEntry[j].RewritePartition == FALSE)
+                                    {
+                    	              swprintf(Buffer2,
+		                               L"\\Device\\Harddisk%d\\Partition%d",
+                                               i,
+		                               LayoutArray[i]->PartitionEntry[j].PartitionNumber);
+	                              RtlInitUnicodeString(&UnicodeString2,
+				                           Buffer2);
 
-	                          /* Assign drive */
-	                          DPRINT("  %wZ\n", &UnicodeString2);
-	                          HalpAssignDrive(&UnicodeString2,
-			                          k,
-			                          DOSDEVICE_DRIVE_FIXED,
-                                                  DiskMountInfo->Signature,
-                                                  DiskMountInfo->StartingOffset,
-                                                  NULL);
-                                  /* Mark the partition as assigned */
-                                  LayoutArray[i]->PartitionEntry[j].RewritePartition = TRUE;
+	                              /* Assign drive */
+	                              DPRINT("  %wZ\n", &UnicodeString2);
+	                              Found = HalpAssignDrive(&UnicodeString2,
+			                                      k,
+			                                      DOSDEVICE_DRIVE_FIXED,
+                                                              DiskMountInfo->Signature,
+                                                              DiskMountInfo->StartingOffset,
+                                                              NULL);
+                                      /* Mark the partition as assigned */
+                                      LayoutArray[i]->PartitionEntry[j].RewritePartition = TRUE;
+                                    }
+                                  break;
                                 }
-                              break;
                             }
                         }
-                      break;
                     }
+                  if (Found == FALSE)
+                    {
+                      /* We didn't find a partition for this entry, remove them. */
+                      Status = ZwDeleteValueKey(hKey, &UnicodeString1);
+                    }
                 }
             }
         }
@@ -871,7 +883,7 @@
 				           Buffer2);
 
                       /* Assign drive */
-                      DPRINT1("  %wZ\n", &UnicodeString2);
+                      DPRINT("  %wZ\n", &UnicodeString2);
 	              HalpAssignDrive(&UnicodeString2,
 			              AUTO_DRIVE,
 			              DOSDEVICE_DRIVE_FIXED,