Index: fstub/disksup.c =================================================================== --- fstub/disksup.c (revision 34991) +++ fstub/disksup.c (working copy) @@ -43,7 +43,7 @@ static BOOLEAN HalpAssignDrive(IN PUNICODE_STRING PartitionName, - IN ULONG DriveNumber, + IN PULONG DriveNumber, IN UCHAR DriveType, IN ULONG Signature, IN LARGE_INTEGER StartingOffset, @@ -57,10 +57,10 @@ DPRINT("HalpAssignDrive()\n"); - if ((DriveNumber != AUTO_DRIVE) && (DriveNumber < 26)) + if ((*DriveNumber != AUTO_DRIVE) && (*DriveNumber < 26)) { /* Force assignment */ - if ((ObSystemDeviceMap->DriveMap & (1 << DriveNumber)) != 0) + if ((ObSystemDeviceMap->DriveMap & (1 << *DriveNumber)) != 0) { DbgPrint("Drive letter already used!\n"); return FALSE; @@ -69,34 +69,34 @@ else { /* Automatic assignment */ - DriveNumber = AUTO_DRIVE; + *DriveNumber = AUTO_DRIVE; for (i = 2; i < 26; i++) { if ((ObSystemDeviceMap->DriveMap & (1 << i)) == 0) { - DriveNumber = i; + *DriveNumber = i; break; } } - if (DriveNumber == AUTO_DRIVE) + if (*DriveNumber == AUTO_DRIVE) { DbgPrint("No drive letter available!\n"); return FALSE; } } - DPRINT("DriveNumber %d\n", DriveNumber); + DPRINT("*DriveNumber %d\n", *DriveNumber); /* Update the System Device Map */ - ObSystemDeviceMap->DriveMap |= (1 << DriveNumber); - ObSystemDeviceMap->DriveType[DriveNumber] = DriveType; + ObSystemDeviceMap->DriveMap |= (1 << *DriveNumber); + ObSystemDeviceMap->DriveType[*DriveNumber] = DriveType; /* Build drive name */ swprintf(DriveNameBuffer, L"\\??\\%C:", - 'A' + DriveNumber); + 'A' + *DriveNumber); RtlInitUnicodeString(&DriveName, DriveNameBuffer); @@ -114,7 +114,7 @@ { DiskMountInfo.Signature = Signature; DiskMountInfo.StartingOffset = StartingOffset; - swprintf(DriveNameBuffer, DiskMountString, L'A' + DriveNumber); + swprintf(DriveNameBuffer, DiskMountString, L'A' + *DriveNumber); RtlInitUnicodeString(&DriveName, DriveNameBuffer); Status = ZwSetValueKey(hKey, @@ -420,6 +420,8 @@ PKEY_VALUE_PARTIAL_INFORMATION PartialInformation; PREG_DISK_MOUNT_INFO DiskMountInfo; ULONG RDiskCount; + ULONG DriveNumber; + UNICODE_STRING BootDevice; DPRINT("xHalIoAssignDriveLetters()\n"); @@ -608,7 +610,7 @@ /* Assign drive */ DPRINT(" %wZ\n", &UnicodeString2); Found = HalpAssignDrive(&UnicodeString2, - k, + &k, DOSDEVICE_DRIVE_FIXED, DiskMountInfo->Signature, DiskMountInfo->StartingOffset, @@ -655,10 +657,11 @@ RtlInitUnicodeString(&UnicodeString2, Buffer2); + DriveNumber = AUTO_DRIVE; /* Assign drive */ DPRINT(" %wZ\n", &UnicodeString2); HalpAssignDrive(&UnicodeString2, - AUTO_DRIVE, + &DriveNumber, DOSDEVICE_DRIVE_FIXED, LayoutArray[DiskNumber]->Signature, LayoutArray[DiskNumber]->PartitionEntry[j].StartingOffset, @@ -694,11 +697,12 @@ RtlInitUnicodeString(&UnicodeString2, Buffer2); + DriveNumber = AUTO_DRIVE; /* Assign drive */ DPRINT(" %wZ\n", &UnicodeString2); HalpAssignDrive(&UnicodeString2, - AUTO_DRIVE, + &DriveNumber, DOSDEVICE_DRIVE_FIXED, LayoutArray[DiskNumber]->Signature, LayoutArray[DiskNumber]->PartitionEntry[j].StartingOffset, @@ -733,11 +737,12 @@ RtlInitUnicodeString(&UnicodeString2, Buffer2); + DriveNumber = AUTO_DRIVE; /* Assign drive */ DPRINT(" %wZ\n", &UnicodeString2); HalpAssignDrive(&UnicodeString2, - AUTO_DRIVE, + &DriveNumber, DOSDEVICE_DRIVE_FIXED, LayoutArray[DiskNumber]->Signature, LayoutArray[DiskNumber]->PartitionEntry[j].StartingOffset, @@ -768,11 +773,12 @@ RtlInitUnicodeString(&UnicodeString2, Buffer2); + DriveNumber = AUTO_DRIVE; /* Assign drive */ DPRINT(" %wZ\n", &UnicodeString2); HalpAssignDrive(&UnicodeString2, - AUTO_DRIVE, + &DriveNumber, DOSDEVICE_DRIVE_FIXED, LayoutArray[DiskNumber]->Signature, LayoutArray[DiskNumber]->PartitionEntry[j].StartingOffset, @@ -804,11 +810,12 @@ RtlInitUnicodeString(&UnicodeString2, Buffer2); + DriveNumber = AUTO_DRIVE; /* Assign drive */ DPRINT(" %wZ\n", &UnicodeString2); HalpAssignDrive(&UnicodeString2, - AUTO_DRIVE, + &DriveNumber, DOSDEVICE_DRIVE_FIXED, LayoutArray[DiskNumber]->Signature, LayoutArray[DiskNumber]->PartitionEntry[j].StartingOffset, @@ -835,12 +842,13 @@ i); RtlInitUnicodeString(&UnicodeString2, Buffer2); + DriveNumber = AUTO_DRIVE; /* Assign drive */ DPRINT(" %wZ\n", &UnicodeString2); HalpAssignDrive(&UnicodeString2, - AUTO_DRIVE, + &DriveNumber, DOSDEVICE_DRIVE_REMOVABLE, 0, RtlConvertLongToLargeInteger(0), @@ -866,18 +874,23 @@ i); RtlInitUnicodeString(&UnicodeString1, Buffer1); + DriveNumber = (i < 2) ? i : AUTO_DRIVE; /* Assign drive letters A: or B: or first free drive letter */ DPRINT(" %wZ\n", &UnicodeString1); HalpAssignDrive(&UnicodeString1, - (i < 2) ? i : AUTO_DRIVE, + &DriveNumber, DOSDEVICE_DRIVE_REMOVABLE, 0, RtlConvertLongToLargeInteger(0), hKey); } + Status = RtlAnsiStringToUnicodeString(&BootDevice, + NtDeviceName, + TRUE); + /* Assign cdrom drives */ DPRINT("CD-Rom drives: %d\n", ConfigInfo->CdRomCount); for (i = 0; i < ConfigInfo->CdRomCount; i++) @@ -885,17 +898,24 @@ swprintf(Buffer1, L"\\Device\\CdRom%d", i); + RtlInitUnicodeString(&UnicodeString1, Buffer1); + DriveNumber = AUTO_DRIVE; /* Assign first free drive letter */ DPRINT(" %wZ\n", &UnicodeString1); HalpAssignDrive(&UnicodeString1, - AUTO_DRIVE, + &DriveNumber, DOSDEVICE_DRIVE_CDROM, 0, RtlConvertLongToLargeInteger(0), hKey); + + if (RtlCompareUnicodeString(&UnicodeString1,&BootDevice,FALSE) == 0) + { + *NtSystemPath = 'A' + DriveNumber; + } } /* Anything else to do? */ Index: io/iomgr/arcname.c =================================================================== --- io/iomgr/arcname.c (revision 34991) +++ io/iomgr/arcname.c (working copy) @@ -33,7 +33,6 @@ FILE_BASIC_INFORMATION FileInfo; NTSTATUS Status; PCHAR p, q; - PCONFIGURATION_INFORMATION ConfigInfo = IoGetConfigurationInformation(); extern BOOLEAN InitIsWinPEMode, ExpInTextModeSetup; /* Only ARC Name left - Build full ARC Name */ @@ -106,13 +105,10 @@ } /* OK, how many disks are there? */ - DeviceNumber += ConfigInfo->DiskCount; /* Return whether this is the CD or not */ if ((InitIsWinPEMode) || (ExpInTextModeSetup)) { - /* Hack until IoAssignDriveLetters is fixed */ - swprintf(SharedUserData->NtSystemRoot, L"%c:\\reactos", 'C' + DeviceNumber); return TRUE; }