https://git.reactos.org/?p=reactos.git;a=commitdiff;h=41ad62ea69017b43ed1d8…
commit 41ad62ea69017b43ed1d873c7fc4081ffdc9b483
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Wed Aug 14 15:22:55 2019 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sat Aug 31 00:25:06 2019 +0200
[FREELDR] Move around & static-ify some disk/partition functions.
---
boot/freeldr/freeldr/disk/partition.c | 258 +++++++++++++++++++---------------
boot/freeldr/freeldr/include/disk.h | 21 ++-
2 files changed, 158 insertions(+), 121 deletions(-)
diff --git a/boot/freeldr/freeldr/disk/partition.c
b/boot/freeldr/freeldr/disk/partition.c
index 3aa69d9b589..67852a43048 100644
--- a/boot/freeldr/freeldr/disk/partition.c
+++ b/boot/freeldr/freeldr/disk/partition.c
@@ -49,9 +49,98 @@ static struct
{ 0x002EE400, 0x00177000, PARTITION_FAT_16 } /* Cache3, Z: */
};
-BOOLEAN DiskGetActivePartitionEntry(UCHAR DriveNumber,
- PPARTITION_TABLE_ENTRY PartitionTableEntry,
- ULONG *ActivePartition)
+static BOOLEAN
+DiskReadBootRecord(
+ IN UCHAR DriveNumber,
+ IN ULONGLONG LogicalSectorNumber,
+ OUT PMASTER_BOOT_RECORD BootRecord)
+{
+ ULONG Index;
+
+ /* Read master boot record */
+ if (!MachDiskReadLogicalSectors(DriveNumber, LogicalSectorNumber, 1,
DiskReadBuffer))
+ {
+ return FALSE;
+ }
+ RtlCopyMemory(BootRecord, DiskReadBuffer, sizeof(MASTER_BOOT_RECORD));
+
+ TRACE("Dumping partition table for drive 0x%x:\n", DriveNumber);
+ TRACE("Boot record logical start sector = %d\n", LogicalSectorNumber);
+ TRACE("sizeof(MASTER_BOOT_RECORD) = 0x%x.\n", sizeof(MASTER_BOOT_RECORD));
+
+ for (Index = 0; Index < 4; Index++)
+ {
+ TRACE("-------------------------------------------\n");
+ TRACE("Partition %d\n", (Index + 1));
+ TRACE("BootIndicator: 0x%x\n",
BootRecord->PartitionTable[Index].BootIndicator);
+ TRACE("StartHead: 0x%x\n",
BootRecord->PartitionTable[Index].StartHead);
+ TRACE("StartSector (Plus 2 cylinder bits): 0x%x\n",
BootRecord->PartitionTable[Index].StartSector);
+ TRACE("StartCylinder: 0x%x\n",
BootRecord->PartitionTable[Index].StartCylinder);
+ TRACE("SystemIndicator: 0x%x\n",
BootRecord->PartitionTable[Index].SystemIndicator);
+ TRACE("EndHead: 0x%x\n",
BootRecord->PartitionTable[Index].EndHead);
+ TRACE("EndSector (Plus 2 cylinder bits): 0x%x\n",
BootRecord->PartitionTable[Index].EndSector);
+ TRACE("EndCylinder: 0x%x\n",
BootRecord->PartitionTable[Index].EndCylinder);
+ TRACE("SectorCountBeforePartition: 0x%x\n",
BootRecord->PartitionTable[Index].SectorCountBeforePartition);
+ TRACE("PartitionSectorCount: 0x%x\n",
BootRecord->PartitionTable[Index].PartitionSectorCount);
+ }
+
+ /* Check the partition table magic value */
+ if (BootRecord->MasterBootRecordMagic != 0xaa55)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static BOOLEAN
+DiskGetFirstPartitionEntry(
+ IN PMASTER_BOOT_RECORD MasterBootRecord,
+ OUT PPARTITION_TABLE_ENTRY PartitionTableEntry)
+{
+ ULONG Index;
+
+ for (Index = 0; Index < 4; Index++)
+ {
+ /* Check the system indicator. If it's not an extended or unused partition
then we're done. */
+ if ((MasterBootRecord->PartitionTable[Index].SystemIndicator !=
PARTITION_ENTRY_UNUSED) &&
+ (MasterBootRecord->PartitionTable[Index].SystemIndicator !=
PARTITION_EXTENDED) &&
+ (MasterBootRecord->PartitionTable[Index].SystemIndicator !=
PARTITION_XINT13_EXTENDED))
+ {
+ RtlCopyMemory(PartitionTableEntry,
&MasterBootRecord->PartitionTable[Index], sizeof(PARTITION_TABLE_ENTRY));
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static BOOLEAN
+DiskGetFirstExtendedPartitionEntry(
+ IN PMASTER_BOOT_RECORD MasterBootRecord,
+ OUT PPARTITION_TABLE_ENTRY PartitionTableEntry)
+{
+ ULONG Index;
+
+ for (Index = 0; Index < 4; Index++)
+ {
+ /* Check the system indicator. If it an extended partition then we're done.
*/
+ if ((MasterBootRecord->PartitionTable[Index].SystemIndicator ==
PARTITION_EXTENDED) ||
+ (MasterBootRecord->PartitionTable[Index].SystemIndicator ==
PARTITION_XINT13_EXTENDED))
+ {
+ RtlCopyMemory(PartitionTableEntry,
&MasterBootRecord->PartitionTable[Index], sizeof(PARTITION_TABLE_ENTRY));
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static BOOLEAN
+DiskGetActivePartitionEntry(
+ IN UCHAR DriveNumber,
+ OUT PPARTITION_TABLE_ENTRY PartitionTableEntry,
+ OUT PULONG ActivePartition)
{
ULONG BootablePartitionCount = 0;
ULONG CurrentPartitionNumber;
@@ -61,14 +150,14 @@ BOOLEAN DiskGetActivePartitionEntry(UCHAR DriveNumber,
*ActivePartition = 0;
- // Read master boot record
+ /* Read master boot record */
if (!DiskReadBootRecord(DriveNumber, 0, &MasterBootRecord))
{
return FALSE;
}
CurrentPartitionNumber = 0;
- for (Index=0; Index<4; Index++)
+ for (Index = 0; Index < 4; Index++)
{
ThisPartitionTableEntry = &MasterBootRecord.PartitionTable[Index];
@@ -78,13 +167,13 @@ BOOLEAN DiskGetActivePartitionEntry(UCHAR DriveNumber,
{
CurrentPartitionNumber++;
- // Test if this is the bootable partition
+ /* Test if this is the bootable partition */
if (ThisPartitionTableEntry->BootIndicator == 0x80)
{
BootablePartitionCount++;
*ActivePartition = CurrentPartitionNumber;
- // Copy the partition table entry
+ /* Copy the partition table entry */
RtlCopyMemory(PartitionTableEntry,
ThisPartitionTableEntry,
sizeof(PARTITION_TABLE_ENTRY));
@@ -92,7 +181,7 @@ BOOLEAN DiskGetActivePartitionEntry(UCHAR DriveNumber,
}
}
- // Make sure there was only one bootable partition
+ /* Make sure there was only one bootable partition */
if (BootablePartitionCount == 0)
{
ERR("No bootable (active) partitions found.\n");
@@ -107,7 +196,11 @@ BOOLEAN DiskGetActivePartitionEntry(UCHAR DriveNumber,
return TRUE;
}
-BOOLEAN DiskGetMbrPartitionEntry(UCHAR DriveNumber, ULONG PartitionNumber,
PPARTITION_TABLE_ENTRY PartitionTableEntry)
+static BOOLEAN
+DiskGetMbrPartitionEntry(
+ IN UCHAR DriveNumber,
+ IN ULONG PartitionNumber,
+ OUT PPARTITION_TABLE_ENTRY PartitionTableEntry)
{
MASTER_BOOT_RECORD MasterBootRecord;
PARTITION_TABLE_ENTRY ExtendedPartitionTableEntry;
@@ -117,14 +210,14 @@ BOOLEAN DiskGetMbrPartitionEntry(UCHAR DriveNumber, ULONG
PartitionNumber, PPART
ULONG CurrentPartitionNumber;
PPARTITION_TABLE_ENTRY ThisPartitionTableEntry;
- // Read master boot record
+ /* Read master boot record */
if (!DiskReadBootRecord(DriveNumber, 0, &MasterBootRecord))
{
return FALSE;
}
CurrentPartitionNumber = 0;
- for (Index=0; Index<4; Index++)
+ for (Index = 0; Index < 4; Index++)
{
ThisPartitionTableEntry = &MasterBootRecord.PartitionTable[Index];
@@ -142,136 +235,63 @@ BOOLEAN DiskGetMbrPartitionEntry(UCHAR DriveNumber, ULONG
PartitionNumber, PPART
}
}
- // They want an extended partition entry so we will need
- // to loop through all the extended partitions on the disk
- // and return the one they want.
-
+ /*
+ * They want an extended partition entry so we will need
+ * to loop through all the extended partitions on the disk
+ * and return the one they want.
+ */
ExtendedPartitionNumber = PartitionNumber - CurrentPartitionNumber - 1;
- // Set the initial relative starting sector to 0
- // This is because extended partition starting
- // sectors a numbered relative to their parent
+ /*
+ * Set the initial relative starting sector to 0.
+ * This is because extended partition starting
+ * sectors a numbered relative to their parent.
+ */
ExtendedPartitionOffset = 0;
- for (Index=0; Index<=ExtendedPartitionNumber; Index++)
+ for (Index = 0; Index <= ExtendedPartitionNumber; Index++)
{
- // Get the extended partition table entry
+ /* Get the extended partition table entry */
if (!DiskGetFirstExtendedPartitionEntry(&MasterBootRecord,
&ExtendedPartitionTableEntry))
{
return FALSE;
}
- // Adjust the relative starting sector of the partition
+ /* Adjust the relative starting sector of the partition */
ExtendedPartitionTableEntry.SectorCountBeforePartition +=
ExtendedPartitionOffset;
if (ExtendedPartitionOffset == 0)
{
- // Set the start of the parrent extended partition
+ /* Set the start of the parrent extended partition */
ExtendedPartitionOffset =
ExtendedPartitionTableEntry.SectorCountBeforePartition;
}
- // Read the partition boot record
+ /* Read the partition boot record */
if (!DiskReadBootRecord(DriveNumber,
ExtendedPartitionTableEntry.SectorCountBeforePartition, &MasterBootRecord))
{
return FALSE;
}
- // Get the first real partition table entry
+ /* Get the first real partition table entry */
if (!DiskGetFirstPartitionEntry(&MasterBootRecord, PartitionTableEntry))
{
return FALSE;
}
- // Now correct the start sector of the partition
+ /* Now correct the start sector of the partition */
PartitionTableEntry->SectorCountBeforePartition +=
ExtendedPartitionTableEntry.SectorCountBeforePartition;
}
- // When we get here we should have the correct entry
- // already stored in PartitionTableEntry
- // so just return TRUE
- return TRUE;
-}
-
-BOOLEAN DiskGetFirstPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord,
PPARTITION_TABLE_ENTRY PartitionTableEntry)
-{
- ULONG Index;
-
- for (Index=0; Index<4; Index++)
- {
- // Check the system indicator
- // If it's not an extended or unused partition
- // then we're done
- if ((MasterBootRecord->PartitionTable[Index].SystemIndicator !=
PARTITION_ENTRY_UNUSED) &&
- (MasterBootRecord->PartitionTable[Index].SystemIndicator !=
PARTITION_EXTENDED) &&
- (MasterBootRecord->PartitionTable[Index].SystemIndicator !=
PARTITION_XINT13_EXTENDED))
- {
- RtlCopyMemory(PartitionTableEntry,
&MasterBootRecord->PartitionTable[Index], sizeof(PARTITION_TABLE_ENTRY));
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-BOOLEAN DiskGetFirstExtendedPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord,
PPARTITION_TABLE_ENTRY PartitionTableEntry)
-{
- ULONG Index;
-
- for (Index=0; Index<4; Index++)
- {
- // Check the system indicator
- // If it an extended partition then we're done
- if ((MasterBootRecord->PartitionTable[Index].SystemIndicator ==
PARTITION_EXTENDED) ||
- (MasterBootRecord->PartitionTable[Index].SystemIndicator ==
PARTITION_XINT13_EXTENDED))
- {
- RtlCopyMemory(PartitionTableEntry,
&MasterBootRecord->PartitionTable[Index], sizeof(PARTITION_TABLE_ENTRY));
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-BOOLEAN DiskReadBootRecord(UCHAR DriveNumber, ULONGLONG LogicalSectorNumber,
PMASTER_BOOT_RECORD BootRecord)
-{
- ULONG Index;
-
- // Read master boot record
- if (!MachDiskReadLogicalSectors(DriveNumber, LogicalSectorNumber, 1,
DiskReadBuffer))
- {
- return FALSE;
- }
- RtlCopyMemory(BootRecord, DiskReadBuffer, sizeof(MASTER_BOOT_RECORD));
-
- TRACE("Dumping partition table for drive 0x%x:\n", DriveNumber);
- TRACE("Boot record logical start sector = %d\n", LogicalSectorNumber);
- TRACE("sizeof(MASTER_BOOT_RECORD) = 0x%x.\n", sizeof(MASTER_BOOT_RECORD));
-
- for (Index=0; Index<4; Index++)
- {
- TRACE("-------------------------------------------\n");
- TRACE("Partition %d\n", (Index + 1));
- TRACE("BootIndicator: 0x%x\n",
BootRecord->PartitionTable[Index].BootIndicator);
- TRACE("StartHead: 0x%x\n",
BootRecord->PartitionTable[Index].StartHead);
- TRACE("StartSector (Plus 2 cylinder bits): 0x%x\n",
BootRecord->PartitionTable[Index].StartSector);
- TRACE("StartCylinder: 0x%x\n",
BootRecord->PartitionTable[Index].StartCylinder);
- TRACE("SystemIndicator: 0x%x\n",
BootRecord->PartitionTable[Index].SystemIndicator);
- TRACE("EndHead: 0x%x\n",
BootRecord->PartitionTable[Index].EndHead);
- TRACE("EndSector (Plus 2 cylinder bits): 0x%x\n",
BootRecord->PartitionTable[Index].EndSector);
- TRACE("EndCylinder: 0x%x\n",
BootRecord->PartitionTable[Index].EndCylinder);
- TRACE("SectorCountBeforePartition: 0x%x\n",
BootRecord->PartitionTable[Index].SectorCountBeforePartition);
- TRACE("PartitionSectorCount: 0x%x\n",
BootRecord->PartitionTable[Index].PartitionSectorCount);
- }
-
- // Check the partition table magic value
- if (BootRecord->MasterBootRecordMagic != 0xaa55)
- {
- return FALSE;
- }
-
+ /*
+ * When we get here we should have the correct entry already
+ * stored in PartitionTableEntry, so just return TRUE.
+ */
return TRUE;
}
-BOOLEAN
-DiskGetBrfrPartitionEntry(UCHAR DriveNumber, ULONG PartitionNumber,
PPARTITION_TABLE_ENTRY PartitionTableEntry)
+static BOOLEAN
+DiskGetBrfrPartitionEntry(
+ IN UCHAR DriveNumber,
+ IN ULONG PartitionNumber,
+ OUT PPARTITION_TABLE_ENTRY PartitionTableEntry)
{
/*
* Get partition entry of an Xbox-standard BRFR partitioned disk.
@@ -296,7 +316,9 @@ DiskGetBrfrPartitionEntry(UCHAR DriveNumber, ULONG PartitionNumber,
PPARTITION_T
return FALSE;
}
-VOID DiskDetectPartitionType(UCHAR DriveNumber)
+VOID
+DiskDetectPartitionType(
+ IN UCHAR DriveNumber)
{
MASTER_BOOT_RECORD MasterBootRecord;
ULONG Index;
@@ -347,9 +369,11 @@ VOID DiskDetectPartitionType(UCHAR DriveNumber)
TRACE("Drive 0x%X partition type unknown\n", DriveNumber);
}
-BOOLEAN DiskGetBootPartitionEntry(UCHAR DriveNumber,
- PPARTITION_TABLE_ENTRY PartitionTableEntry,
- ULONG *BootPartition)
+BOOLEAN
+DiskGetBootPartitionEntry(
+ IN UCHAR DriveNumber,
+ OUT PPARTITION_TABLE_ENTRY PartitionTableEntry,
+ OUT PULONG BootPartition)
{
switch (DiskPartitionType[DriveNumber])
{
@@ -385,7 +409,11 @@ BOOLEAN DiskGetBootPartitionEntry(UCHAR DriveNumber,
return FALSE;
}
-BOOLEAN DiskGetPartitionEntry(UCHAR DriveNumber, ULONG PartitionNumber,
PPARTITION_TABLE_ENTRY PartitionTableEntry)
+BOOLEAN
+DiskGetPartitionEntry(
+ IN UCHAR DriveNumber,
+ IN ULONG PartitionNumber,
+ OUT PPARTITION_TABLE_ENTRY PartitionTableEntry)
{
switch (DiskPartitionType[DriveNumber])
{
diff --git a/boot/freeldr/freeldr/include/disk.h b/boot/freeldr/freeldr/include/disk.h
index 6629c768dcf..68c197ba509 100644
--- a/boot/freeldr/freeldr/include/disk.h
+++ b/boot/freeldr/freeldr/include/disk.h
@@ -145,12 +145,21 @@ extern SIZE_T DiskReadBufferSize;
//
///////////////////////////////////////////////////////////////////////////////////////
-VOID DiskDetectPartitionType(UCHAR DriveNumber);
-BOOLEAN DiskGetBootPartitionEntry(UCHAR DriveNumber, PPARTITION_TABLE_ENTRY
PartitionTableEntry, ULONG *BootPartition);
-BOOLEAN DiskGetPartitionEntry(UCHAR DriveNumber, ULONG PartitionNumber,
PPARTITION_TABLE_ENTRY PartitionTableEntry);
-BOOLEAN DiskGetFirstPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord,
PPARTITION_TABLE_ENTRY PartitionTableEntry);
-BOOLEAN DiskGetFirstExtendedPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord,
PPARTITION_TABLE_ENTRY PartitionTableEntry);
-BOOLEAN DiskReadBootRecord(UCHAR DriveNumber, ULONGLONG LogicalSectorNumber,
PMASTER_BOOT_RECORD BootRecord);
+VOID
+DiskDetectPartitionType(
+ IN UCHAR DriveNumber);
+
+BOOLEAN
+DiskGetBootPartitionEntry(
+ IN UCHAR DriveNumber,
+ OUT PPARTITION_TABLE_ENTRY PartitionTableEntry,
+ OUT PULONG BootPartition);
+
+BOOLEAN
+DiskGetPartitionEntry(
+ IN UCHAR DriveNumber,
+ IN ULONG PartitionNumber,
+ OUT PPARTITION_TABLE_ENTRY PartitionTableEntry);
/*
* SCSI support (disk/scsiport.c)