Read partition tables only once while assigning drive letters.

svn path=/trunk/; revision=2016
This commit is contained in:
Eric Kohl 2001-06-29 11:09:48 +00:00
parent c967887093
commit 8a477f58d7

View file

@ -1,4 +1,4 @@
/* $Id: xhaldrv.c,v 1.12 2001/06/28 02:56:27 rex Exp $ /* $Id: xhaldrv.c,v 1.13 2001/06/29 11:09:48 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -27,12 +27,6 @@
#define SIGNATURE_OFFSET 0x01b8 #define SIGNATURE_OFFSET 0x01b8
#define PARTITION_TBL_SIZE 4 #define PARTITION_TBL_SIZE 4
/*
#define IsUsablePartition(P) \
((P) != PTEmpty && \
(P) != PTDosExtended && \
(P) < PTWin95ExtendedLBA)
*/
#define IsUsablePartition(P) \ #define IsUsablePartition(P) \
((P) == PTDOS3xPrimary || \ ((P) == PTDOS3xPrimary || \
@ -42,6 +36,7 @@
(P) == PTWin95FAT32LBA || \ (P) == PTWin95FAT32LBA || \
(P) == PTWin95FAT16LBA) (P) == PTWin95FAT16LBA)
typedef struct _PARTITION typedef struct _PARTITION
{ {
unsigned char BootFlags; unsigned char BootFlags;
@ -89,7 +84,7 @@ xHalpQueryDriveLayout(IN PUNICODE_STRING DeviceName,
{ {
DPRINT("Status %x\n",Status); DPRINT("Status %x\n",Status);
return Status; return Status;
} }
KeInitializeEvent(&Event, KeInitializeEvent(&Event,
NotificationEvent, NotificationEvent,
@ -289,7 +284,7 @@ xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
OUT PUCHAR NtSystemPath, OUT PUCHAR NtSystemPath,
OUT PSTRING NtSystemPathString) OUT PSTRING NtSystemPathString)
{ {
PDRIVE_LAYOUT_INFORMATION LayoutInfo; PDRIVE_LAYOUT_INFORMATION *LayoutArray;
PCONFIGURATION_INFORMATION ConfigInfo; PCONFIGURATION_INFORMATION ConfigInfo;
OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK StatusBlock; IO_STATUS_BLOCK StatusBlock;
@ -353,10 +348,11 @@ xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
} }
} }
/* Assign pre-assigned (registry) partitions */ /* Initialize layout array */
LayoutArray = ExAllocatePool(NonPagedPool,
/* Assign bootable partitions */ ConfigInfo->DiskCount * sizeof(PDRIVE_LAYOUT_INFORMATION));
DPRINT("Assigning bootable partitions:\n"); RtlZeroMemory(LayoutArray,
ConfigInfo->DiskCount * sizeof(PDRIVE_LAYOUT_INFORMATION));
for (i = 0; i < ConfigInfo->DiskCount; i++) for (i = 0; i < ConfigInfo->DiskCount; i++)
{ {
swprintf(Buffer1, swprintf(Buffer1,
@ -366,35 +362,58 @@ xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
Buffer1); Buffer1);
Status = xHalpQueryDriveLayout(&UnicodeString1, Status = xHalpQueryDriveLayout(&UnicodeString1,
&LayoutInfo); &LayoutArray[i]);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DbgPrint("xHalpQueryDriveLayout() failed (Status = 0x%lx)\n", DbgPrint("xHalpQueryDriveLayout() failed (Status = 0x%lx)\n",
Status); Status);
LayoutArray[i] = NULL;
continue; continue;
} }
}
#ifndef NDEBUG
/* Dump layout array */
for (i = 0; i < ConfigInfo->DiskCount; i++)
{
DPRINT("Harddisk %d:\n",
i);
if (LayoutArray[i] == NULL)
continue;
DPRINT("Logical partitions: %d\n", DPRINT("Logical partitions: %d\n",
LayoutInfo->PartitionCount); LayoutArray[i]->PartitionCount);
/* search for bootable partitions */ for (j = 0; j < LayoutArray[i]->PartitionCount; j++)
for (j = 0; j < LayoutInfo->PartitionCount; j++)
{ {
DPRINT(" %d: nr:%x boot:%x type:%x startblock:%lu count:%lu\n", DPRINT(" %d: nr:%x boot:%x type:%x startblock:%I64u count:%I64u\n",
j, j,
LayoutInfo->PartitionEntry[j].PartitionNumber, LayoutArray[i]->PartitionEntry[j].PartitionNumber,
LayoutInfo->PartitionEntry[j].BootIndicator, LayoutArray[i]->PartitionEntry[j].BootIndicator,
LayoutInfo->PartitionEntry[j].PartitionType, LayoutArray[i]->PartitionEntry[j].PartitionType,
LayoutInfo->PartitionEntry[j].StartingOffset.u.LowPart, LayoutArray[i]->PartitionEntry[j].StartingOffset.QuadPart,
LayoutInfo->PartitionEntry[j].PartitionLength.u.LowPart); LayoutArray[i]->PartitionEntry[j].PartitionLength.QuadPart);
}
}
#endif
if ((LayoutInfo->PartitionEntry[j].BootIndicator == TRUE) && /* Assign pre-assigned (registry) partitions */
IsUsablePartition(LayoutInfo->PartitionEntry[j].PartitionType))
/* Assign bootable partitions */
DPRINT("Assigning bootable primary partitions:\n");
for (i = 0; i < ConfigInfo->DiskCount; i++)
{
/* search for bootable partitions */
for (j = 0; j < LayoutArray[i]->PartitionCount; j++)
{
if ((LayoutArray[i]->PartitionEntry[j].BootIndicator == TRUE) &&
IsUsablePartition(LayoutArray[i]->PartitionEntry[j].PartitionType))
{ {
swprintf(Buffer2, swprintf(Buffer2,
L"\\Device\\Harddisk%d\\Partition%d", L"\\Device\\Harddisk%d\\Partition%d",
i, i,
LayoutInfo->PartitionEntry[j].PartitionNumber); LayoutArray[i]->PartitionEntry[j].PartitionNumber);
RtlInitUnicodeString(&UnicodeString2, RtlInitUnicodeString(&UnicodeString2,
Buffer2); Buffer2);
@ -406,51 +425,22 @@ xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
AUTO_DRIVE); AUTO_DRIVE);
} }
} }
ExFreePool (LayoutInfo);
} }
/* Assign remaining primary partitions */ /* Assign non-bootable primary partitions */
DPRINT("Assigning primary partitions:\n"); DPRINT("Assigning non-bootable primary partitions:\n");
for (i = 0; i < ConfigInfo->DiskCount; i++) for (i = 0; i < ConfigInfo->DiskCount; i++)
{ {
swprintf(Buffer1,
L"\\Device\\Harddisk%d\\Partition0",
i);
RtlInitUnicodeString(&UnicodeString1,
Buffer1);
Status = xHalpQueryDriveLayout(&UnicodeString1,
&LayoutInfo);
if (!NT_SUCCESS(Status))
{
DbgPrint("xHalpQueryDriveLayout(%wZ) failed (Status = 0x%lx)\n",
&UnicodeString1,
Status);
continue;
}
DPRINT("Logical partitions: %d\n",
LayoutInfo->PartitionCount);
/* search for primary (non-bootable) partitions */ /* search for primary (non-bootable) partitions */
for (j = 0; j < PARTITION_TBL_SIZE; j++) for (j = 0; j < PARTITION_TBL_SIZE; j++)
{ {
DPRINT(" %d: nr:%x boot:%x type:%x startblock:%lu count:%lu\n", if ((LayoutArray[i]->PartitionEntry[j].BootIndicator == FALSE) &&
j, IsUsablePartition(LayoutArray[i]->PartitionEntry[j].PartitionType))
LayoutInfo->PartitionEntry[j].PartitionNumber,
LayoutInfo->PartitionEntry[j].BootIndicator,
LayoutInfo->PartitionEntry[j].PartitionType,
LayoutInfo->PartitionEntry[j].StartingOffset.u.LowPart,
LayoutInfo->PartitionEntry[j].PartitionLength.u.LowPart);
if ((LayoutInfo->PartitionEntry[j].BootIndicator == FALSE) &&
IsUsablePartition(LayoutInfo->PartitionEntry[j].PartitionType))
{ {
swprintf(Buffer2, swprintf(Buffer2,
L"\\Device\\Harddisk%d\\Partition%d", L"\\Device\\Harddisk%d\\Partition%d",
i, i,
LayoutInfo->PartitionEntry[j].PartitionNumber); LayoutArray[i]->PartitionEntry[j].PartitionNumber);
RtlInitUnicodeString(&UnicodeString2, RtlInitUnicodeString(&UnicodeString2,
Buffer2); Buffer2);
@ -462,50 +452,22 @@ xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
AUTO_DRIVE); AUTO_DRIVE);
} }
} }
ExFreePool(LayoutInfo);
} }
/* Assign extended (logical) partitions */ /* Assign extended (logical) partitions */
DPRINT("Assigning extended (logical) partitions:\n"); DPRINT("Assigning extended (logical) partitions:\n");
for (i = 0; i < ConfigInfo->DiskCount; i++) for (i = 0; i < ConfigInfo->DiskCount; i++)
{ {
swprintf(Buffer1,
L"\\Device\\Harddisk%d\\Partition0",
i);
RtlInitUnicodeString(&UnicodeString1,
Buffer1);
Status = xHalpQueryDriveLayout(&UnicodeString1,
&LayoutInfo);
if (!NT_SUCCESS(Status))
{
DbgPrint("xHalpQueryDriveLayout() failed (Status = 0x%lx)\n",
Status);
continue;
}
DPRINT("Logical partitions: %d\n",
LayoutInfo->PartitionCount);
/* search for extended partitions */ /* search for extended partitions */
for (j = PARTITION_TBL_SIZE; j < LayoutInfo->PartitionCount; j++) for (j = PARTITION_TBL_SIZE; j < LayoutArray[i]->PartitionCount; j++)
{ {
DPRINT(" %d: nr:%x boot:%x type:%x startblock:%lu count:%lu\n", if (IsUsablePartition(LayoutArray[i]->PartitionEntry[j].PartitionType) &&
j, (LayoutArray[i]->PartitionEntry[j].PartitionNumber != 0))
LayoutInfo->PartitionEntry[j].PartitionNumber,
LayoutInfo->PartitionEntry[j].BootIndicator,
LayoutInfo->PartitionEntry[j].PartitionType,
LayoutInfo->PartitionEntry[j].StartingOffset.u.LowPart,
LayoutInfo->PartitionEntry[j].PartitionLength.u.LowPart);
if (IsUsablePartition(LayoutInfo->PartitionEntry[j].PartitionType) &&
(LayoutInfo->PartitionEntry[j].PartitionNumber != 0))
{ {
swprintf(Buffer2, swprintf(Buffer2,
L"\\Device\\Harddisk%d\\Partition%d", L"\\Device\\Harddisk%d\\Partition%d",
i, i,
LayoutInfo->PartitionEntry[j].PartitionNumber); LayoutArray[i]->PartitionEntry[j].PartitionNumber);
RtlInitUnicodeString(&UnicodeString2, RtlInitUnicodeString(&UnicodeString2,
Buffer2); Buffer2);
@ -517,10 +479,16 @@ xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
AUTO_DRIVE); AUTO_DRIVE);
} }
} }
ExFreePool(LayoutInfo);
} }
/* Free layout array */
for (i = 0; i < ConfigInfo->DiskCount; i++)
{
if (LayoutArray[i] != NULL)
ExFreePool(LayoutArray[i]);
}
ExFreePool(LayoutArray);
/* Assign floppy drives */ /* Assign floppy drives */
DPRINT("Floppy drives: %d\n", ConfigInfo->FloppyCount); DPRINT("Floppy drives: %d\n", ConfigInfo->FloppyCount);
for (i = 0; i < ConfigInfo->FloppyCount; i++) for (i = 0; i < ConfigInfo->FloppyCount; i++)