* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS text-mode setup
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
PLIST_ENTRY Entry1;
- PLIST_ENTRY Entry2;
+ //PLIST_ENTRY Entry2;
CHAR Letter;
+ UCHAR i;
Letter = 'C';
PARTENTRY,
ListEntry);
- PartEntry->DriveLetter = 0;
+ for (i=0; i<3; i++)
+ PartEntry->DriveLetter[i] = 0;
- if (PartEntry->Unpartitioned == FALSE &&
- !IsContainerPartition (PartEntry->PartInfo[0].PartitionType))
+ if (PartEntry->Unpartitioned == FALSE)
{
- if (IsRecognizedPartition (PartEntry->PartInfo[0].PartitionType) ||
- (PartEntry->PartInfo[0].PartitionType == PARTITION_ENTRY_UNUSED &&
- PartEntry->PartInfo[0].PartitionLength.QuadPart != 0LL))
+ for (i=0; i<3; i++)
{
- if (Letter <= 'Z')
+ if (IsContainerPartition (PartEntry->PartInfo[i].PartitionType))
+ continue;
+
+ if (IsRecognizedPartition (PartEntry->PartInfo[i].PartitionType) ||
+ (PartEntry->PartInfo[i].PartitionType == PARTITION_ENTRY_UNUSED &&
+ PartEntry->PartInfo[i].PartitionLength.QuadPart != 0LL))
{
- PartEntry->DriveLetter = Letter;
- Letter++;
+ if (Letter <= 'Z')
+ {
+ PartEntry->DriveLetter[i] = Letter;
+ Letter++;
+ }
}
}
}
Entry1 = Entry1->Flink;
}
-
/* Assign drive letters to logical drives */
+#if 0
Entry1 = List->DiskListHead.Flink;
while (Entry1 != &List->DiskListHead)
{
Entry1 = Entry1->Flink;
}
+#endif
}
ULONG i;
PLIST_ENTRY ListEntry;
PBIOSDISKENTRY BiosDiskEntry;
+ ULONG LayoutBufferSize;
Status = NtDeviceIoControlFile (FileHandle,
NULL,
}
Checksum = ~Checksum + 1;
- RtlFreeHeap (ProcessHeap,
- 0,
- Mbr);
-
swprintf(Identifier, L"%08x-%08x-A", Checksum, Signature);
DPRINT("Identifier: %S\n", Identifier);
}
DiskEntry->BiosFound = FALSE;
+ /* Check if this disk has a valid MBR */
+ if (Mbr->BootCode[0] == 0 && Mbr->BootCode[1] == 0)
+ DiskEntry->NoMbr = TRUE;
+ else
+ DiskEntry->NoMbr = FALSE;
+
+ /* Free Mbr sector buffer */
+ RtlFreeHeap (ProcessHeap,
+ 0,
+ Mbr);
+
ListEntry = List->BiosDiskListHead.Flink;
while(ListEntry != &List->BiosDiskListHead)
{
DiskEntry->SectorsPerTrack = DiskGeometry.SectorsPerTrack;
DiskEntry->BytesPerSector = DiskGeometry.BytesPerSector;
- DPRINT ("Cylinders %d\n", DiskEntry->Cylinders);
- DPRINT ("TracksPerCylinder %d\n", DiskEntry->TracksPerCylinder);
- DPRINT ("SectorsPerTrack %d\n", DiskEntry->SectorsPerTrack);
- DPRINT ("BytesPerSector %d\n", DiskEntry->BytesPerSector);
+ DPRINT ("Cylinders %I64u\n", DiskEntry->Cylinders);
+ DPRINT ("TracksPerCylinder %I64u\n", DiskEntry->TracksPerCylinder);
+ DPRINT ("SectorsPerTrack %I64u\n", DiskEntry->SectorsPerTrack);
+ DPRINT ("BytesPerSector %I64u\n", DiskEntry->BytesPerSector);
- DiskEntry->DiskSize =
- DiskGeometry.Cylinders.QuadPart *
- (ULONGLONG)DiskGeometry.TracksPerCylinder *
+ DiskEntry->TrackSize =
(ULONGLONG)DiskGeometry.SectorsPerTrack *
(ULONGLONG)DiskGeometry.BytesPerSector;
DiskEntry->CylinderSize =
(ULONGLONG)DiskGeometry.TracksPerCylinder *
- (ULONGLONG)DiskGeometry.SectorsPerTrack *
- (ULONGLONG)DiskGeometry.BytesPerSector;
- DiskEntry->TrackSize =
- (ULONGLONG)DiskGeometry.SectorsPerTrack *
- (ULONGLONG)DiskGeometry.BytesPerSector;
+ DiskEntry->TrackSize;
+ DiskEntry->DiskSize =
+ DiskGeometry.Cylinders.QuadPart *
+ DiskEntry->CylinderSize;
DiskEntry->DiskNumber = DiskNumber;
DiskEntry->Port = ScsiAddress.PortNumber;
InsertAscendingList(&List->DiskListHead, DiskEntry, DISKENTRY, ListEntry, BiosDiskNumber);
+ /*
+ * Allocate a buffer for 26 logical drives (2 entries each == 52)
+ * plus the main partiton table (4 entries). Total 56 entries.
+ */
+ LayoutBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) +
+ ((56 - ANYSIZE_ARRAY) * sizeof(PARTITION_INFORMATION));
LayoutBuffer = (DRIVE_LAYOUT_INFORMATION*)RtlAllocateHeap (ProcessHeap,
0,
- 8192);
+ LayoutBufferSize);
if (LayoutBuffer == NULL)
{
return;
NULL,
0,
LayoutBuffer,
- 8192);
+ LayoutBufferSize);
if (NT_SUCCESS (Status))
{
if (LayoutBuffer->PartitionCount == 0)
OBJECT_ATTRIBUTES ObjectAttributes;
SYSTEM_DEVICE_INFORMATION Sdi;
IO_STATUS_BLOCK Iosb;
- SIZE_T ReturnSize;
+ ULONG ReturnSize;
NTSTATUS Status;
ULONG DiskNumber;
WCHAR Buffer[MAX_PATH];
List->Bottom = Bottom;
List->Line = 0;
+ List->Offset = 0;
List->TopDisk = (ULONG)-1;
List->TopPartition = (ULONG)-1;
List->CurrentDisk = NULL;
List->CurrentPartition = NULL;
+ List->CurrentPartitionNumber = 0;
InitializeListHead (&List->DiskListHead);
InitializeListHead (&List->BiosDiskListHead);
{
List->CurrentDisk = NULL;
List->CurrentPartition = NULL;
+ List->CurrentPartitionNumber = 0;
}
else
{
if (IsListEmpty (&List->CurrentDisk->PartListHead))
{
List->CurrentPartition = 0;
+ List->CurrentPartitionNumber = 0;
}
else
{
CONTAINING_RECORD (List->CurrentDisk->PartListHead.Flink,
PARTENTRY,
ListEntry);
+ List->CurrentPartitionNumber = 0;
}
}
static VOID
PrintPartitionData (PPARTLIST List,
PDISKENTRY DiskEntry,
- PPARTENTRY PartEntry)
+ PPARTENTRY PartEntry,
+ ULONG PartNumber)
{
CHAR LineBuffer[128];
COORD coPos;
}
else if (PartEntry->Unpartitioned == FALSE)
{
- if ((PartEntry->PartInfo[0].PartitionType == PARTITION_FAT_12) ||
- (PartEntry->PartInfo[0].PartitionType == PARTITION_FAT_16) ||
- (PartEntry->PartInfo[0].PartitionType == PARTITION_HUGE) ||
- (PartEntry->PartInfo[0].PartitionType == PARTITION_XINT13))
+ if ((PartEntry->PartInfo[PartNumber].PartitionType == PARTITION_FAT_12) ||
+ (PartEntry->PartInfo[PartNumber].PartitionType == PARTITION_FAT_16) ||
+ (PartEntry->PartInfo[PartNumber].PartitionType == PARTITION_HUGE) ||
+ (PartEntry->PartInfo[PartNumber].PartitionType == PARTITION_XINT13))
{
PartType = "FAT";
}
- else if ((PartEntry->PartInfo[0].PartitionType == PARTITION_FAT32) ||
- (PartEntry->PartInfo[0].PartitionType == PARTITION_FAT32_XINT13))
+ else if ((PartEntry->PartInfo[PartNumber].PartitionType == PARTITION_FAT32) ||
+ (PartEntry->PartInfo[PartNumber].PartitionType == PARTITION_FAT32_XINT13))
{
PartType = "FAT32";
}
- else if (PartEntry->PartInfo[0].PartitionType == PARTITION_EXT2)
+ else if (PartEntry->PartInfo[PartNumber].PartitionType == PARTITION_EXT2)
{
PartType = "EXT2";
}
- else if (PartEntry->PartInfo[0].PartitionType == PARTITION_IFS)
+ else if (PartEntry->PartInfo[PartNumber].PartitionType == PARTITION_IFS)
{
PartType = "NTFS"; /* FIXME: Not quite correct! */
}
}
#if 0
- if (PartEntry->PartInfo[0].PartitionLength.QuadPart >= 0x280000000LL) /* 10 GB */
+ if (PartEntry->PartInfo[PartNumber].PartitionLength.QuadPart >= 0x280000000LL) /* 10 GB */
{
- PartSize.QuadPart = (PartEntry->PartInfo[0].PartitionLength.QuadPart + (1 << 29)) >> 30;
+ PartSize.QuadPart = (PartEntry->PartInfo[PartNumber].PartitionLength.QuadPart + (1 << 29)) >> 30;
Unit = MUIGetString(STRING_GB);
}
else
#endif
- if (PartEntry->PartInfo[0].PartitionLength.QuadPart >= 0xA00000LL) /* 10 MB */
+ if (PartEntry->PartInfo[PartNumber].PartitionLength.QuadPart >= 0xA00000LL) /* 10 MB */
{
- PartSize.QuadPart = (PartEntry->PartInfo[0].PartitionLength.QuadPart + (1 << 19)) >> 20;
+ PartSize.QuadPart = (PartEntry->PartInfo[PartNumber].PartitionLength.QuadPart + (1 << 19)) >> 20;
Unit = MUIGetString(STRING_MB);
}
else
{
- PartSize.QuadPart = (PartEntry->PartInfo[0].PartitionLength.QuadPart + (1 << 9)) >> 10;
+ PartSize.QuadPart = (PartEntry->PartInfo[PartNumber].PartitionLength.QuadPart + (1 << 9)) >> 10;
Unit = MUIGetString(STRING_KB);
}
{
sprintf (LineBuffer,
MUIGetString(STRING_HDDINFOUNK5),
- (PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter,
- (PartEntry->DriveLetter == 0) ? '-' : ':',
- PartEntry->PartInfo[0].PartitionType,
+ (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : PartEntry->DriveLetter[PartNumber],
+ (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : ':',
+ PartEntry->PartInfo[PartNumber].PartitionType,
PartSize.u.LowPart,
Unit);
}
{
sprintf (LineBuffer,
"%c%c %-24s %6lu %s",
- (PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter,
- (PartEntry->DriveLetter == 0) ? '-' : ':',
+ (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : PartEntry->DriveLetter[PartNumber],
+ (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : ':',
PartType,
PartSize.u.LowPart,
Unit);
}
Attribute = (List->CurrentDisk == DiskEntry &&
- List->CurrentPartition == PartEntry) ?
+ List->CurrentPartition == PartEntry &&
+ List->CurrentPartitionNumber == PartNumber) ?
FOREGROUND_BLUE | BACKGROUND_WHITE :
FOREGROUND_WHITE | BACKGROUND_BLUE;
USHORT Height;
ULARGE_INTEGER DiskSize;
PCHAR Unit;
+ ULONG i;
Width = List->Right - List->Left - 1;
Height = List->Bottom - List->Top - 2;
LIST_FOR_EACH(PartEntry, &DiskEntry->PartListHead, PARTENTRY, ListEntry)
{
/* Print disk entry */
- PrintPartitionData (List,
- DiskEntry,
- PartEntry);
+ for (i=0; i<4; i++)
+ {
+ if (PartEntry->PartInfo[i].PartitionType != PARTITION_ENTRY_UNUSED ||
+ PartEntry->PartInfo[i].PartitionLength.QuadPart != 0ULL)
+ {
+ PrintPartitionData (List,
+ DiskEntry,
+ PartEntry,
+ i);
+ }
+ }
+
+ /* Print unpartitioned entry */
+ if (PartEntry->Unpartitioned)
+ {
+ PrintPartitionData (List,
+ DiskEntry,
+ PartEntry,
+ 0);
+ }
+
}
/* Print separator line */
PPARTENTRY PartEntry;
PLIST_ENTRY Entry1;
PLIST_ENTRY Entry2;
- ULONG i;
+ UCHAR i;
/* Check for empty disks */
if (IsListEmpty (&List->DiskListHead))
{
List->CurrentDisk = DiskEntry;
List->CurrentPartition = PartEntry;
+ List->CurrentPartitionNumber = i;
DrawPartitionList (List);
return TRUE;
}
PPARTENTRY PartEntry;
PLIST_ENTRY Entry1;
PLIST_ENTRY Entry2;
+ UCHAR i;
/* Check for empty disks */
if (IsListEmpty (&List->DiskListHead))
/* Check for next usable entry on current disk */
if (List->CurrentPartition != NULL)
{
- Entry2 = List->CurrentPartition->ListEntry.Flink;
+ Entry2 = &List->CurrentPartition->ListEntry;
+ PartEntry = CONTAINING_RECORD (Entry2, PARTENTRY, ListEntry);
+
+ /* Check if we can move inside primary partitions */
+ for (i = List->CurrentPartitionNumber + 1; i < 4; i++)
+ {
+ if (PartEntry->PartInfo[i].PartitionType != PARTITION_ENTRY_UNUSED)
+ break;
+ }
+
+ if (i == 4)
+ {
+ /* We're out of partitions in the current partition table.
+ Try to move to the next one if possible. */
+ Entry2 = Entry2->Flink;
+ }
+ else
+ {
+ /* Just advance to the next partition */
+ List->CurrentPartitionNumber = i;
+ DrawPartitionList (List);
+ return;
+ }
+
while (Entry2 != &List->CurrentDisk->PartListHead)
{
PartEntry = CONTAINING_RECORD (Entry2, PARTENTRY, ListEntry);
// if (PartEntry->HidePartEntry == FALSE)
{
List->CurrentPartition = PartEntry;
+ List->CurrentPartitionNumber = 0;
DrawPartitionList (List);
return;
}
{
List->CurrentDisk = DiskEntry;
List->CurrentPartition = PartEntry;
+ List->CurrentPartitionNumber = 0;
DrawPartitionList (List);
return;
}
PPARTENTRY PartEntry;
PLIST_ENTRY Entry1;
PLIST_ENTRY Entry2;
+ UCHAR i;
/* Check for empty disks */
if (IsListEmpty (&List->DiskListHead))
/* check for previous usable entry on current disk */
if (List->CurrentPartition != NULL)
{
- Entry2 = List->CurrentPartition->ListEntry.Blink;
+ Entry2 = &List->CurrentPartition->ListEntry;
+ PartEntry = CONTAINING_RECORD (Entry2, PARTENTRY, ListEntry);
+
+ /* Check if we can move inside primary partitions */
+ if (List->CurrentPartitionNumber > 0)
+ {
+ /* Find a previous partition */
+ for (i = List->CurrentPartitionNumber - 1; i > 0; i--)
+ {
+ if (PartEntry->PartInfo[i].PartitionType != PARTITION_ENTRY_UNUSED)
+ break;
+ }
+
+ /* Move to it and return */
+ List->CurrentPartitionNumber = i;
+ DrawPartitionList (List);
+ return;
+ }
+
+ /* Move to the previous entry */
+ Entry2 = Entry2->Blink;
+
while (Entry2 != &List->CurrentDisk->PartListHead)
{
PartEntry = CONTAINING_RECORD (Entry2, PARTENTRY, ListEntry);
// if (PartEntry->HidePartEntry == FALSE)
{
List->CurrentPartition = PartEntry;
+
+ /* Find last existing partition in the table */
+ for (i = 3; i > 0; i--)
+ {
+ if (PartEntry->PartInfo[i].PartitionType != PARTITION_ENTRY_UNUSED)
+ break;
+ }
+
+ /* Move to it */
+ List->CurrentPartitionNumber = i;
+
+ /* Draw partition list and return */
DrawPartitionList (List);
return;
}
{
List->CurrentDisk = DiskEntry;
List->CurrentPartition = PartEntry;
+
+ /* Find last existing partition in the table */
+ for (i = 3; i > 0; i--)
+ {
+ if (PartEntry->PartInfo[i].PartitionType != PARTITION_ENTRY_UNUSED)
+ break;
+ }
+
+ /* Move to it */
+ List->CurrentPartitionNumber = i;
+
+ /* Draw partition list and return */
DrawPartitionList (List);
return;
}
PartEntry->FormatState = Unformatted;
PartEntry->PartInfo[0].StartingOffset.QuadPart =
PartEntry->UnpartitionedOffset + DiskEntry->TrackSize;
+ PartEntry->PartInfo[0].HiddenSectors =
+ (ULONG)(PartEntry->PartInfo[0].StartingOffset.QuadPart / DiskEntry->BytesPerSector);
PartEntry->PartInfo[0].PartitionLength.QuadPart =
PartEntry->UnpartitionedLength - DiskEntry->TrackSize;
PartEntry->PartInfo[0].PartitionType = PARTITION_ENTRY_UNUSED;
PrevPartEntry->PartInfo[1].StartingOffset.QuadPart =
PartEntry->PartInfo[0].StartingOffset.QuadPart - DiskEntry->TrackSize;
+ PrevPartEntry->PartInfo[1].HiddenSectors =
+ (ULONG)(PrevPartEntry->PartInfo[1].StartingOffset.QuadPart / DiskEntry->BytesPerSector);
if (DiskEntry->PartListHead.Flink == &PrevPartEntry->ListEntry)
{
PrevPartEntry->PartInfo[1].StartingOffset.QuadPart =
PartEntry->PartInfo[0].StartingOffset.QuadPart - DiskEntry->TrackSize;
+ PrevPartEntry->PartInfo[1].HiddenSectors =
+ (ULONG)(PrevPartEntry->PartInfo[1].StartingOffset.QuadPart / DiskEntry->BytesPerSector);
if (DiskEntry->PartListHead.Flink == &PrevPartEntry->ListEntry)
{
NewPartEntry->FormatState = Unformatted;
NewPartEntry->PartInfo[0].StartingOffset.QuadPart =
PartEntry->UnpartitionedOffset + DiskEntry->TrackSize;
+ NewPartEntry->PartInfo[0].HiddenSectors =
+ (ULONG)(NewPartEntry->PartInfo[0].StartingOffset.QuadPart / DiskEntry->BytesPerSector);
NewPartEntry->PartInfo[0].PartitionLength.QuadPart =
PartitionSize - DiskEntry->TrackSize;
NewPartEntry->PartInfo[0].PartitionType = PARTITION_ENTRY_UNUSED;
PrevPartEntry->PartInfo[1].StartingOffset.QuadPart =
NewPartEntry->PartInfo[0].StartingOffset.QuadPart - DiskEntry->TrackSize;
+ PrevPartEntry->PartInfo[1].HiddenSectors =
+ (ULONG)(PrevPartEntry->PartInfo[1].StartingOffset.QuadPart / DiskEntry->BytesPerSector);
if (DiskEntry->PartListHead.Flink == &PrevPartEntry->ListEntry)
{
PrevPartEntry->PartInfo[1].StartingOffset.QuadPart =
NewPartEntry->PartInfo[0].StartingOffset.QuadPart - DiskEntry->TrackSize;
+ PrevPartEntry->PartInfo[1].HiddenSectors =
+ (ULONG)(PrevPartEntry->PartInfo[1].StartingOffset.QuadPart / DiskEntry->BytesPerSector);
if (DiskEntry->PartListHead.Flink == &PrevPartEntry->ListEntry)
{
{
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
+ PLIST_ENTRY ListEntry;
+ UCHAR i;
/* Check for empty disk list */
if (IsListEmpty (&List->DiskListHead))
{
List->ActiveBootDisk = NULL;
List->ActiveBootPartition = NULL;
+ List->ActiveBootPartitionNumber = 0;
return;
}
{
List->ActiveBootDisk = NULL;
List->ActiveBootPartition = NULL;
+ List->ActiveBootPartitionNumber = 0;
return;
}
PartEntry->PartInfo[0].BootIndicator = TRUE;
PartEntry->PartInfo[0].RewritePartition = TRUE;
DiskEntry->Modified = TRUE;
+
+ /* FIXME: Might be incorrect if partitions were created by Linux FDISK */
+ List->ActiveBootDisk = DiskEntry;
+ List->ActiveBootPartition = PartEntry;
+ List->ActiveBootPartitionNumber = 0;
+
+ return;
}
- /* FIXME: Might be incorrect if partitions were created by Linux FDISK */
- List->ActiveBootDisk = DiskEntry;
- List->ActiveBootPartition = PartEntry;
+ /* Disk is not new, scan all partitions to find a bootable one */
+ List->ActiveBootDisk = NULL;
+ List->ActiveBootPartition = NULL;
+ List->ActiveBootPartitionNumber = 0;
+
+ ListEntry = DiskEntry->PartListHead.Flink;
+ while (ListEntry != &DiskEntry->PartListHead)
+ {
+ PartEntry = CONTAINING_RECORD(ListEntry,
+ PARTENTRY,
+ ListEntry);
+
+ /* Check if it's partitioned */
+ if (!PartEntry->Unpartitioned)
+ {
+ /* Go through all of its 4 partitions */
+ for (i=0; i<4; i++)
+ {
+ if (PartEntry->PartInfo[i].PartitionType != PARTITION_ENTRY_UNUSED &&
+ PartEntry->PartInfo[i].BootIndicator)
+ {
+ /* Yes, we found it */
+ List->ActiveBootDisk = DiskEntry;
+ List->ActiveBootPartition = PartEntry;
+ List->ActiveBootPartitionNumber = i;
+
+ DPRINT("Found bootable partition disk %d, drive letter %c\n",
+ DiskEntry->BiosDiskNumber, PartEntry->DriveLetter[i]);
+
+ break;
+ }
+ }
+ }
+ /* Go to the next one */
+ ListEntry = ListEntry->Flink;
+ }
}
PDRIVE_LAYOUT_INFORMATION DriveLayout;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK Iosb;
- WCHAR SrcPath[MAX_PATH];
WCHAR DstPath[MAX_PATH];
UNICODE_STRING Name;
HANDLE FileHandle;
DriveLayout);
NtClose (FileHandle);
-
- /* Install MBR code if the disk is new */
- if (DiskEntry1->NewDisk == TRUE &&
- DiskEntry1->BiosDiskNumber == 0)
- {
- wcscpy (SrcPath, SourceRootPath.Buffer);
- wcscat (SrcPath, L"\\loader\\dosmbr.bin");
-
- DPRINT ("Install MBR bootcode: %S ==> %S\n",
- SrcPath, DstPath);
-
- /* Install MBR bootcode */
- Status = InstallMbrBootCodeToDisk (SrcPath,
- DstPath);
- if (!NT_SUCCESS (Status))
- {
- DPRINT1 ("InstallMbrBootCodeToDisk() failed (Status %lx)\n",
- Status);
- return FALSE;
- }
-
- DiskEntry1->NewDisk = FALSE;
- }
}
Entry1 = Entry1->Flink;
PLIST_ENTRY Entry1, Entry2;
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
+ UCHAR i;
if (List == NULL)
{
while (Entry2 != &DiskEntry->PartListHead)
{
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
- if (!PartEntry->Unpartitioned && PartEntry->DriveLetter)
+ if (!PartEntry->Unpartitioned)
{
- if (!SetMountedDeviceValue(PartEntry->DriveLetter, DiskEntry->Signature, PartEntry->PartInfo[0].StartingOffset))
+ for (i=0; i<4; i++)
{
- return FALSE;
+ if (PartEntry->DriveLetter[i])
+ {
+ if (!SetMountedDeviceValue(PartEntry->DriveLetter[i], DiskEntry->Signature, PartEntry->PartInfo[i].StartingOffset))
+ {
+ return FALSE;
+ }
+ }
}
}
Entry2 = Entry2->Flink;