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 * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -27,10 +27,20 @@
#define SIGNATURE_OFFSET 0x01b8 #define SIGNATURE_OFFSET 0x01b8
#define PARTITION_TBL_SIZE 4 #define PARTITION_TBL_SIZE 4
/*
#define IsUsablePartition(P) \ #define IsUsablePartition(P) \
((P) != PTEmpty && \ ((P) != PTEmpty && \
(P) != PTDosExtended && \ (P) != PTDosExtended && \
(P) != PTWin95ExtendedLBA) (P) < PTWin95ExtendedLBA)
*/
#define IsUsablePartition(P) \
((P) == PTDOS3xPrimary || \
(P) == PTOLDDOS16Bit || \
(P) == PTDos5xPrimary || \
(P) == PTWin95FAT32 || \
(P) == PTWin95FAT32LBA || \
(P) == PTWin95FAT16LBA)
typedef struct _PARTITION typedef struct _PARTITION
@ -277,278 +287,284 @@ HalpAssignDrive (
} }
VOID VOID FASTCALL
FASTCALL xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
xHalIoAssignDriveLetters ( IN PSTRING NtDeviceName,
IN PLOADER_PARAMETER_BLOCK LoaderBlock, OUT PUCHAR NtSystemPath,
IN PSTRING NtDeviceName, OUT PSTRING NtSystemPathString)
OUT PUCHAR NtSystemPath,
OUT PSTRING NtSystemPathString
)
{ {
PDRIVE_LAYOUT_INFORMATION LayoutInfo; PDRIVE_LAYOUT_INFORMATION LayoutInfo;
PCONFIGURATION_INFORMATION ConfigInfo; PCONFIGURATION_INFORMATION ConfigInfo;
OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK StatusBlock; IO_STATUS_BLOCK StatusBlock;
UNICODE_STRING UnicodeString1; UNICODE_STRING UnicodeString1;
UNICODE_STRING UnicodeString2; UNICODE_STRING UnicodeString2;
HANDLE FileHandle; HANDLE FileHandle;
PWSTR Buffer1; PWSTR Buffer1;
PWSTR Buffer2; PWSTR Buffer2;
ULONG i; ULONG i;
NTSTATUS Status; NTSTATUS Status;
ULONG DriveMap = 0; ULONG DriveMap = 0;
ULONG j; ULONG j;
DPRINT("xHalIoAssignDriveLetters()\n"); DPRINT("xHalIoAssignDriveLetters()\n");
ConfigInfo = IoGetConfigurationInformation (); ConfigInfo = IoGetConfigurationInformation ();
Buffer1 = (PWSTR)ExAllocatePool (PagedPool, Buffer1 = (PWSTR)ExAllocatePool(PagedPool,
64 * sizeof(WCHAR)); 64 * sizeof(WCHAR));
Buffer2 = (PWSTR)ExAllocatePool (PagedPool, Buffer2 = (PWSTR)ExAllocatePool(PagedPool,
32 * sizeof(WCHAR)); 32 * sizeof(WCHAR));
/* Create PhysicalDrive links */ /* Create PhysicalDrive links */
DPRINT("Physical disk drives: %d\n", ConfigInfo->DiskCount); DPRINT("Physical disk drives: %d\n", ConfigInfo->DiskCount);
for (i = 0; i < ConfigInfo->DiskCount; i++) for (i = 0; i < ConfigInfo->DiskCount; i++)
{ {
swprintf (Buffer1, swprintf(Buffer1,
L"\\Device\\Harddisk%d\\Partition0", L"\\Device\\Harddisk%d\\Partition0",
i); i);
RtlInitUnicodeString (&UnicodeString1, RtlInitUnicodeString(&UnicodeString1,
Buffer1); Buffer1);
InitializeObjectAttributes (&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
&UnicodeString1, &UnicodeString1,
0, 0,
NULL, NULL,
NULL); NULL);
Status = NtOpenFile (&FileHandle, Status = NtOpenFile(&FileHandle,
0x10001, 0x10001,
&ObjectAttributes, &ObjectAttributes,
&StatusBlock, &StatusBlock,
1, 1,
FILE_SYNCHRONOUS_IO_NONALERT); FILE_SYNCHRONOUS_IO_NONALERT);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
NtClose (FileHandle); NtClose(FileHandle);
swprintf (Buffer2, swprintf(Buffer2,
L"\\??\\PhysicalDrive%d", L"\\??\\PhysicalDrive%d",
i); i);
RtlInitUnicodeString (&UnicodeString2, RtlInitUnicodeString(&UnicodeString2,
Buffer2); Buffer2);
DPRINT("Creating link: %S ==> %S\n", DPRINT("Creating link: %S ==> %S\n",
Buffer2, Buffer2,
Buffer1); Buffer1);
IoCreateSymbolicLink (&UnicodeString2, IoCreateSymbolicLink(&UnicodeString2,
&UnicodeString1); &UnicodeString1);
} }
} }
/* Assign pre-assigned (registry) partitions */ /* Assign pre-assigned (registry) partitions */
/* Assign bootable partitions */ /* Assign bootable partitions */
DPRINT("Assigning bootable partitions:\n"); DPRINT("Assigning bootable partitions:\n");
for (i = 0; i < ConfigInfo->DiskCount; i++) for (i = 0; i < ConfigInfo->DiskCount; i++)
{ {
swprintf (Buffer1, swprintf(Buffer1,
L"\\Device\\Harddisk%d\\Partition0", L"\\Device\\Harddisk%d\\Partition0",
i); i);
RtlInitUnicodeString (&UnicodeString1, RtlInitUnicodeString(&UnicodeString1,
Buffer1); Buffer1);
Status = xHalpQueryDriveLayout (&UnicodeString1, Status = xHalpQueryDriveLayout(&UnicodeString1,
&LayoutInfo); &LayoutInfo);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DbgPrint("xHalpQueryDriveLayout() failed (Status = 0x%lx)\n", DbgPrint("xHalpQueryDriveLayout() failed (Status = 0x%lx)\n",
Status); Status);
continue; continue;
} }
DPRINT("Logical partitions: %d\n", DPRINT("Logical partitions: %d\n",
LayoutInfo->PartitionCount); LayoutInfo->PartitionCount);
/* search for bootable partitions */ /* search for bootable partitions */
for (j = 0; j < LayoutInfo->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:%lu count:%lu\n",
j, j,
LayoutInfo->PartitionEntry[j].PartitionNumber, LayoutInfo->PartitionEntry[j].PartitionNumber,
LayoutInfo->PartitionEntry[j].BootIndicator, LayoutInfo->PartitionEntry[j].BootIndicator,
LayoutInfo->PartitionEntry[j].PartitionType, LayoutInfo->PartitionEntry[j].PartitionType,
LayoutInfo->PartitionEntry[j].StartingOffset.u.LowPart, LayoutInfo->PartitionEntry[j].StartingOffset.u.LowPart,
LayoutInfo->PartitionEntry[j].PartitionLength.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, {
L"\\Device\\Harddisk%d\\Partition%d", swprintf(Buffer2,
i, L"\\Device\\Harddisk%d\\Partition%d",
LayoutInfo->PartitionEntry[j].PartitionNumber); i,
RtlInitUnicodeString (&UnicodeString2, LayoutInfo->PartitionEntry[j].PartitionNumber);
Buffer2); RtlInitUnicodeString(&UnicodeString2,
Buffer2);
DPRINT(" %wZ\n", &UnicodeString2); DPRINT(" %wZ\n", &UnicodeString2);
/* assign it */ /* assign it */
HalpAssignDrive (&UnicodeString2, HalpAssignDrive(&UnicodeString2,
&DriveMap, &DriveMap,
AUTO_DRIVE); AUTO_DRIVE);
} }
} }
ExFreePool (LayoutInfo); ExFreePool (LayoutInfo);
} }
/* Assign remaining primary partitions */ /* Assign remaining primary partitions */
DPRINT("Assigning primary partitions:\n"); DPRINT("Assigning primary partitions:\n");
for (i = 0; i < ConfigInfo->DiskCount; i++) for (i = 0; i < ConfigInfo->DiskCount; i++)
{ {
swprintf (Buffer1, swprintf(Buffer1,
L"\\Device\\Harddisk%d\\Partition0", L"\\Device\\Harddisk%d\\Partition0",
i); i);
RtlInitUnicodeString (&UnicodeString1, RtlInitUnicodeString(&UnicodeString1,
Buffer1); Buffer1);
Status = xHalpQueryDriveLayout (&UnicodeString1, Status = xHalpQueryDriveLayout(&UnicodeString1,
&LayoutInfo); &LayoutInfo);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DbgPrint("xHalpQueryDriveLayout() failed (Status = 0x%lx)\n", DbgPrint("xHalpQueryDriveLayout(%wZ) failed (Status = 0x%lx)\n",
Status); &UnicodeString1,
continue; Status);
} continue;
}
DPRINT("Logical partitions: %d\n", DPRINT("Logical partitions: %d\n",
LayoutInfo->PartitionCount); 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", DPRINT(" %d: nr:%x boot:%x type:%x startblock:%lu count:%lu\n",
j, j,
LayoutInfo->PartitionEntry[j].PartitionNumber, LayoutInfo->PartitionEntry[j].PartitionNumber,
LayoutInfo->PartitionEntry[j].BootIndicator, LayoutInfo->PartitionEntry[j].BootIndicator,
LayoutInfo->PartitionEntry[j].PartitionType, LayoutInfo->PartitionEntry[j].PartitionType,
LayoutInfo->PartitionEntry[j].StartingOffset.u.LowPart, LayoutInfo->PartitionEntry[j].StartingOffset.u.LowPart,
LayoutInfo->PartitionEntry[j].PartitionLength.u.LowPart); LayoutInfo->PartitionEntry[j].PartitionLength.u.LowPart);
if ((LayoutInfo->PartitionEntry[j].BootIndicator == FALSE) && if ((LayoutInfo->PartitionEntry[j].BootIndicator == FALSE) &&
IsUsablePartition(LayoutInfo->PartitionEntry[j].PartitionType)) 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); LayoutInfo->PartitionEntry[j].PartitionNumber);
RtlInitUnicodeString (&UnicodeString2, RtlInitUnicodeString(&UnicodeString2,
Buffer2); Buffer2);
/* assign it */ /* assign it */
DPRINT(" %wZ\n", &UnicodeString2); DPRINT(" %wZ\n",
HalpAssignDrive (&UnicodeString2, &DriveMap, AUTO_DRIVE); &UnicodeString2);
} HalpAssignDrive(&UnicodeString2,
} &DriveMap,
AUTO_DRIVE);
}
}
ExFreePool (LayoutInfo); 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, swprintf(Buffer1,
L"\\Device\\Harddisk%d\\Partition0", L"\\Device\\Harddisk%d\\Partition0",
i); i);
RtlInitUnicodeString (&UnicodeString1, RtlInitUnicodeString(&UnicodeString1,
Buffer1); Buffer1);
Status = xHalpQueryDriveLayout (&UnicodeString1, Status = xHalpQueryDriveLayout(&UnicodeString1,
&LayoutInfo); &LayoutInfo);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DbgPrint("xHalpQueryDriveLayout() failed (Status = 0x%lx)\n", DbgPrint("xHalpQueryDriveLayout() failed (Status = 0x%lx)\n",
Status); Status);
continue; continue;
} }
DPRINT("Logical partitions: %d\n", DPRINT("Logical partitions: %d\n",
LayoutInfo->PartitionCount); 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 < 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:%lu count:%lu\n",
j, j,
LayoutInfo->PartitionEntry[j].PartitionNumber, LayoutInfo->PartitionEntry[j].PartitionNumber,
LayoutInfo->PartitionEntry[j].BootIndicator, LayoutInfo->PartitionEntry[j].BootIndicator,
LayoutInfo->PartitionEntry[j].PartitionType, LayoutInfo->PartitionEntry[j].PartitionType,
LayoutInfo->PartitionEntry[j].StartingOffset.u.LowPart, LayoutInfo->PartitionEntry[j].StartingOffset.u.LowPart,
LayoutInfo->PartitionEntry[j].PartitionLength.u.LowPart); LayoutInfo->PartitionEntry[j].PartitionLength.u.LowPart);
if (IsUsablePartition(LayoutInfo->PartitionEntry[j].PartitionType) && if (IsUsablePartition(LayoutInfo->PartitionEntry[j].PartitionType) &&
(LayoutInfo->PartitionEntry[j].PartitionNumber != 0)) (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); LayoutInfo->PartitionEntry[j].PartitionNumber);
RtlInitUnicodeString (&UnicodeString2, RtlInitUnicodeString(&UnicodeString2,
Buffer2); Buffer2);
/* assign it */ /* assign it */
DPRINT(" %wZ\n", &UnicodeString2); DPRINT(" %wZ\n",
HalpAssignDrive (&UnicodeString2, &DriveMap, AUTO_DRIVE); &UnicodeString2);
} HalpAssignDrive(&UnicodeString2,
} &DriveMap,
AUTO_DRIVE);
}
}
ExFreePool (LayoutInfo); ExFreePool(LayoutInfo);
} }
/* 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++)
{ {
swprintf (Buffer1, swprintf(Buffer1,
L"\\Device\\Floppy%d", L"\\Device\\Floppy%d",
i); i);
RtlInitUnicodeString (&UnicodeString1, RtlInitUnicodeString(&UnicodeString1,
Buffer1); Buffer1);
/* assign drive letters A: or B: or first free drive letter */ /* assign drive letters A: or B: or first free drive letter */
DPRINT(" %wZ\n", &UnicodeString1); DPRINT(" %wZ\n",
HalpAssignDrive (&UnicodeString1, &UnicodeString1);
&DriveMap, HalpAssignDrive(&UnicodeString1,
(i < 2) ? i : AUTO_DRIVE); &DriveMap,
} (i < 2) ? i : AUTO_DRIVE);
}
/* Assign cdrom drives */ /* Assign cdrom drives */
DPRINT("CD-Rom drives: %d\n", ConfigInfo->CDRomCount); DPRINT("CD-Rom drives: %d\n", ConfigInfo->CDRomCount);
for (i = 0; i < ConfigInfo->CDRomCount; i++) for (i = 0; i < ConfigInfo->CDRomCount; i++)
{ {
swprintf (Buffer1, swprintf(Buffer1,
L"\\Device\\Cdrom%d", L"\\Device\\Cdrom%d",
i); i);
RtlInitUnicodeString (&UnicodeString1, RtlInitUnicodeString(&UnicodeString1,
Buffer1); Buffer1);
/* assign first free drive letter */ /* assign first free drive letter */
DPRINT(" %wZ\n", &UnicodeString1); DPRINT(" %wZ\n", &UnicodeString1);
HalpAssignDrive (&UnicodeString1, HalpAssignDrive(&UnicodeString1,
&DriveMap, &DriveMap,
AUTO_DRIVE); AUTO_DRIVE);
} }
/* Anything else ?? */ /* Anything else ?? */
ExFreePool (Buffer2); ExFreePool(Buffer2);
ExFreePool (Buffer1); ExFreePool(Buffer1);
} }