- 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,