Fixed bootable partition bug

svn path=/trunk/; revision=1895
This commit is contained in:
Eric Kohl 2001-05-06 22:32:34 +00:00
parent cbcc365a25
commit 7398918d11

View file

@ -1,4 +1,4 @@
/* $Id: xhaldrv.c,v 1.7 2000/08/25 15:55:02 ekohl Exp $
/* $Id: xhaldrv.c,v 1.8 2001/05/06 22:32:34 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -27,10 +27,20 @@
#define SIGNATURE_OFFSET 0x01b8
#define PARTITION_TBL_SIZE 4
/*
#define IsUsablePartition(P) \
((P) != PTEmpty && \
(P) != PTDosExtended && \
(P) != PTWin95ExtendedLBA)
(P) < PTWin95ExtendedLBA)
*/
#define IsUsablePartition(P) \
((P) == PTDOS3xPrimary || \
(P) == PTOLDDOS16Bit || \
(P) == PTDos5xPrimary || \
(P) == PTWin95FAT32 || \
(P) == PTWin95FAT32LBA || \
(P) == PTWin95FAT16LBA)
typedef struct _PARTITION
@ -277,14 +287,11 @@ HalpAssignDrive (
}
VOID
FASTCALL
xHalIoAssignDriveLetters (
IN PLOADER_PARAMETER_BLOCK LoaderBlock,
VOID FASTCALL
xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
IN PSTRING NtDeviceName,
OUT PUCHAR NtSystemPath,
OUT PSTRING NtSystemPathString
)
OUT PSTRING NtSystemPathString)
{
PDRIVE_LAYOUT_INFORMATION LayoutInfo;
PCONFIGURATION_INFORMATION ConfigInfo;
@ -304,28 +311,28 @@ xHalIoAssignDriveLetters (
ConfigInfo = IoGetConfigurationInformation ();
Buffer1 = (PWSTR)ExAllocatePool (PagedPool,
Buffer1 = (PWSTR)ExAllocatePool(PagedPool,
64 * sizeof(WCHAR));
Buffer2 = (PWSTR)ExAllocatePool (PagedPool,
Buffer2 = (PWSTR)ExAllocatePool(PagedPool,
32 * sizeof(WCHAR));
/* Create PhysicalDrive links */
DPRINT("Physical disk drives: %d\n", ConfigInfo->DiskCount);
for (i = 0; i < ConfigInfo->DiskCount; i++)
{
swprintf (Buffer1,
swprintf(Buffer1,
L"\\Device\\Harddisk%d\\Partition0",
i);
RtlInitUnicodeString (&UnicodeString1,
RtlInitUnicodeString(&UnicodeString1,
Buffer1);
InitializeObjectAttributes (&ObjectAttributes,
InitializeObjectAttributes(&ObjectAttributes,
&UnicodeString1,
0,
NULL,
NULL);
Status = NtOpenFile (&FileHandle,
Status = NtOpenFile(&FileHandle,
0x10001,
&ObjectAttributes,
&StatusBlock,
@ -333,19 +340,19 @@ xHalIoAssignDriveLetters (
FILE_SYNCHRONOUS_IO_NONALERT);
if (NT_SUCCESS(Status))
{
NtClose (FileHandle);
NtClose(FileHandle);
swprintf (Buffer2,
swprintf(Buffer2,
L"\\??\\PhysicalDrive%d",
i);
RtlInitUnicodeString (&UnicodeString2,
RtlInitUnicodeString(&UnicodeString2,
Buffer2);
DPRINT("Creating link: %S ==> %S\n",
Buffer2,
Buffer1);
IoCreateSymbolicLink (&UnicodeString2,
IoCreateSymbolicLink(&UnicodeString2,
&UnicodeString1);
}
}
@ -356,13 +363,13 @@ xHalIoAssignDriveLetters (
DPRINT("Assigning bootable partitions:\n");
for (i = 0; i < ConfigInfo->DiskCount; i++)
{
swprintf (Buffer1,
swprintf(Buffer1,
L"\\Device\\Harddisk%d\\Partition0",
i);
RtlInitUnicodeString (&UnicodeString1,
RtlInitUnicodeString(&UnicodeString1,
Buffer1);
Status = xHalpQueryDriveLayout (&UnicodeString1,
Status = xHalpQueryDriveLayout(&UnicodeString1,
&LayoutInfo);
if (!NT_SUCCESS(Status))
{
@ -385,19 +392,20 @@ xHalIoAssignDriveLetters (
LayoutInfo->PartitionEntry[j].StartingOffset.u.LowPart,
LayoutInfo->PartitionEntry[j].PartitionLength.u.LowPart);
if (LayoutInfo->PartitionEntry[j].BootIndicator)
if ((LayoutInfo->PartitionEntry[j].BootIndicator == TRUE) &&
IsUsablePartition(LayoutInfo->PartitionEntry[j].PartitionType))
{
swprintf (Buffer2,
swprintf(Buffer2,
L"\\Device\\Harddisk%d\\Partition%d",
i,
LayoutInfo->PartitionEntry[j].PartitionNumber);
RtlInitUnicodeString (&UnicodeString2,
RtlInitUnicodeString(&UnicodeString2,
Buffer2);
DPRINT(" %wZ\n", &UnicodeString2);
/* assign it */
HalpAssignDrive (&UnicodeString2,
HalpAssignDrive(&UnicodeString2,
&DriveMap,
AUTO_DRIVE);
}
@ -410,17 +418,18 @@ xHalIoAssignDriveLetters (
DPRINT("Assigning primary partitions:\n");
for (i = 0; i < ConfigInfo->DiskCount; i++)
{
swprintf (Buffer1,
swprintf(Buffer1,
L"\\Device\\Harddisk%d\\Partition0",
i);
RtlInitUnicodeString (&UnicodeString1,
RtlInitUnicodeString(&UnicodeString1,
Buffer1);
Status = xHalpQueryDriveLayout (&UnicodeString1,
Status = xHalpQueryDriveLayout(&UnicodeString1,
&LayoutInfo);
if (!NT_SUCCESS(Status))
{
DbgPrint("xHalpQueryDriveLayout() failed (Status = 0x%lx)\n",
DbgPrint("xHalpQueryDriveLayout(%wZ) failed (Status = 0x%lx)\n",
&UnicodeString1,
Status);
continue;
}
@ -442,33 +451,36 @@ xHalIoAssignDriveLetters (
if ((LayoutInfo->PartitionEntry[j].BootIndicator == FALSE) &&
IsUsablePartition(LayoutInfo->PartitionEntry[j].PartitionType))
{
swprintf (Buffer2,
swprintf(Buffer2,
L"\\Device\\Harddisk%d\\Partition%d",
i,
LayoutInfo->PartitionEntry[j].PartitionNumber);
RtlInitUnicodeString (&UnicodeString2,
RtlInitUnicodeString(&UnicodeString2,
Buffer2);
/* assign it */
DPRINT(" %wZ\n", &UnicodeString2);
HalpAssignDrive (&UnicodeString2, &DriveMap, AUTO_DRIVE);
DPRINT(" %wZ\n",
&UnicodeString2);
HalpAssignDrive(&UnicodeString2,
&DriveMap,
AUTO_DRIVE);
}
}
ExFreePool (LayoutInfo);
ExFreePool(LayoutInfo);
}
/* Assign extended (logical) partitions */
DPRINT("Assigning extended (logical) partitions:\n");
for (i = 0; i < ConfigInfo->DiskCount; i++)
{
swprintf (Buffer1,
swprintf(Buffer1,
L"\\Device\\Harddisk%d\\Partition0",
i);
RtlInitUnicodeString (&UnicodeString1,
RtlInitUnicodeString(&UnicodeString1,
Buffer1);
Status = xHalpQueryDriveLayout (&UnicodeString1,
Status = xHalpQueryDriveLayout(&UnicodeString1,
&LayoutInfo);
if (!NT_SUCCESS(Status))
{
@ -494,35 +506,39 @@ xHalIoAssignDriveLetters (
if (IsUsablePartition(LayoutInfo->PartitionEntry[j].PartitionType) &&
(LayoutInfo->PartitionEntry[j].PartitionNumber != 0))
{
swprintf (Buffer2,
swprintf(Buffer2,
L"\\Device\\Harddisk%d\\Partition%d",
i,
LayoutInfo->PartitionEntry[j].PartitionNumber);
RtlInitUnicodeString (&UnicodeString2,
RtlInitUnicodeString(&UnicodeString2,
Buffer2);
/* assign it */
DPRINT(" %wZ\n", &UnicodeString2);
HalpAssignDrive (&UnicodeString2, &DriveMap, AUTO_DRIVE);
DPRINT(" %wZ\n",
&UnicodeString2);
HalpAssignDrive(&UnicodeString2,
&DriveMap,
AUTO_DRIVE);
}
}
ExFreePool (LayoutInfo);
ExFreePool(LayoutInfo);
}
/* Assign floppy drives */
DPRINT("Floppy drives: %d\n", ConfigInfo->FloppyCount);
for (i = 0; i < ConfigInfo->FloppyCount; i++)
{
swprintf (Buffer1,
swprintf(Buffer1,
L"\\Device\\Floppy%d",
i);
RtlInitUnicodeString (&UnicodeString1,
RtlInitUnicodeString(&UnicodeString1,
Buffer1);
/* assign drive letters A: or B: or first free drive letter */
DPRINT(" %wZ\n", &UnicodeString1);
HalpAssignDrive (&UnicodeString1,
DPRINT(" %wZ\n",
&UnicodeString1);
HalpAssignDrive(&UnicodeString1,
&DriveMap,
(i < 2) ? i : AUTO_DRIVE);
}
@ -531,15 +547,15 @@ xHalIoAssignDriveLetters (
DPRINT("CD-Rom drives: %d\n", ConfigInfo->CDRomCount);
for (i = 0; i < ConfigInfo->CDRomCount; i++)
{
swprintf (Buffer1,
swprintf(Buffer1,
L"\\Device\\Cdrom%d",
i);
RtlInitUnicodeString (&UnicodeString1,
RtlInitUnicodeString(&UnicodeString1,
Buffer1);
/* assign first free drive letter */
DPRINT(" %wZ\n", &UnicodeString1);
HalpAssignDrive (&UnicodeString1,
HalpAssignDrive(&UnicodeString1,
&DriveMap,
AUTO_DRIVE);
}
@ -547,8 +563,8 @@ xHalIoAssignDriveLetters (
/* Anything else ?? */
ExFreePool (Buffer2);
ExFreePool (Buffer1);
ExFreePool(Buffer2);
ExFreePool(Buffer1);
}