mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 20:23:34 +00:00
Read partition tables only once while assigning drive letters.
svn path=/trunk/; revision=2016
This commit is contained in:
parent
c967887093
commit
8a477f58d7
1 changed files with 62 additions and 94 deletions
|
@ -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++)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue