From 4aee0280f971a5b24e9d4bd26807e00340e2ade5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Fri, 22 Nov 2024 22:20:58 +0100 Subject: [PATCH] [SETUPLIB][REACTOS][USETUP] Finish unification of MBR extended and primary/logical partitions Fixes previous attempt at commit 0ca4e6dcf, which was reverted by commit bbdcc14b1 because the partitioning checks mistook unpartitioned disks as GPT. Addendum to commit 99f0937fd. The partition-creation checks are unified for these partitions into one single function. To prepare for GPT support, the specifics are put into a separate MBRPartitionCreateChecks() helper, called for MBR disks by the upper-level function. GPT disks will have a similar helper in the future. --- base/setup/lib/utils/partlist.c | 87 ++++++++++++++++----------------- base/setup/lib/utils/partlist.h | 10 ++-- base/setup/reactos/drivepage.c | 4 +- base/setup/usetup/usetup.c | 6 +-- 4 files changed, 50 insertions(+), 57 deletions(-) diff --git a/base/setup/lib/utils/partlist.c b/base/setup/lib/utils/partlist.c index c045518cbfe..b138c9abdca 100644 --- a/base/setup/lib/utils/partlist.c +++ b/base/setup/lib/utils/partlist.c @@ -2818,41 +2818,49 @@ GetAdjUnpartitionedEntry( return NULL; } -ERROR_NUMBER -PartitionCreationChecks( - _In_ PPARTENTRY PartEntry) +static ERROR_NUMBER +MBRPartitionCreateChecks( + _In_ PPARTENTRY PartEntry, + _In_opt_ ULONGLONG SizeBytes, + _In_opt_ ULONG_PTR PartitionInfo) { PDISKENTRY DiskEntry = PartEntry->DiskEntry; + BOOLEAN isContainer = IsContainerPartition((UCHAR)PartitionInfo); - if (DiskEntry->DiskStyle == PARTITION_STYLE_GPT) + // TODO: Re-enable once we initialize unpartitioned disks before using them. + // ASSERT(DiskEntry->DiskStyle == PARTITION_STYLE_MBR); + ASSERT(!PartEntry->IsPartitioned); + + if (isContainer) { - DPRINT1("GPT-partitioned disk detected, not currently supported by SETUP!\n"); - return ERROR_WARN_PARTITION; + /* Cannot create an extended partition within logical partition space */ + if (PartEntry->LogicalPartition) + return ERROR_ONLY_ONE_EXTENDED; + + /* Fail if there is another extended partition in the list */ + if (DiskEntry->ExtendedPartition) + return ERROR_ONLY_ONE_EXTENDED; } - /* Fail if the partition is already in use */ - if (PartEntry->IsPartitioned) - return ERROR_NEW_PARTITION; - /* - * For primary partitions + * Primary or Extended partitions */ - if (!PartEntry->LogicalPartition) + if (!PartEntry->LogicalPartition || isContainer) { /* Only one primary partition is allowed on super-floppy */ if (IsSuperFloppy(DiskEntry)) return ERROR_PARTITION_TABLE_FULL; - /* Fail if there are already 4 primary partitions in the list */ + /* Fail if there are too many primary partitions */ if (GetPrimaryPartitionCount(DiskEntry) >= 4) return ERROR_PARTITION_TABLE_FULL; } /* - * For logical partitions + * Logical partitions */ else { - // TODO: Check that we are inside an extended partition!! + // TODO: Check that we are inside an extended partition! // Then the following check will be useless. /* Only one (primary) partition is allowed on super-floppy */ @@ -2864,38 +2872,28 @@ PartitionCreationChecks( } ERROR_NUMBER -ExtendedPartitionCreationChecks( - _In_ PPARTENTRY PartEntry) +PartitionCreateChecks( + _In_ PPARTENTRY PartEntry, + _In_opt_ ULONGLONG SizeBytes, + _In_opt_ ULONG_PTR PartitionInfo) { - PDISKENTRY DiskEntry = PartEntry->DiskEntry; - - if (DiskEntry->DiskStyle == PARTITION_STYLE_GPT) - { - DPRINT1("GPT-partitioned disk detected, not currently supported by SETUP!\n"); - return ERROR_WARN_PARTITION; - } + // PDISKENTRY DiskEntry = PartEntry->DiskEntry; /* Fail if the partition is already in use */ if (PartEntry->IsPartitioned) return ERROR_NEW_PARTITION; - /* Cannot create an extended partition within logical partition space */ - if (PartEntry->LogicalPartition) - return ERROR_ONLY_ONE_EXTENDED; - - /* Only one primary partition is allowed on super-floppy */ - if (IsSuperFloppy(DiskEntry)) - return ERROR_PARTITION_TABLE_FULL; - - /* Fail if there are already 4 primary partitions in the list */ - if (GetPrimaryPartitionCount(DiskEntry) >= 4) - return ERROR_PARTITION_TABLE_FULL; - - /* Fail if there is another extended partition in the list */ - if (DiskEntry->ExtendedPartition) - return ERROR_ONLY_ONE_EXTENDED; - - return ERROR_SUCCESS; + // TODO: Re-enable once we initialize unpartitioned disks before + // using them; because such disks would be mistook as GPT otherwise. + // if (DiskEntry->DiskStyle == PARTITION_STYLE_MBR) + return MBRPartitionCreateChecks(PartEntry, SizeBytes, PartitionInfo); +#if 0 + else // if (DiskEntry->DiskStyle == PARTITION_STYLE_GPT) + { + DPRINT1("GPT-partitioned disk detected, not currently supported by SETUP!\n"); + return ERROR_WARN_PARTITION; + } +#endif } // TODO: Improve upon the PartitionInfo parameter later @@ -2926,13 +2924,10 @@ CreatePartition( return FALSE; } - if (isContainer) - Error = ExtendedPartitionCreationChecks(PartEntry); - else - Error = PartitionCreationChecks(PartEntry); + Error = PartitionCreateChecks(PartEntry, SizeBytes, PartitionInfo); if (Error != NOT_AN_ERROR) { - DPRINT1("PartitionCreationChecks(%s) failed with error %lu\n", mainType, Error); + DPRINT1("PartitionCreateChecks(%s) failed with error %lu\n", mainType, Error); return FALSE; } diff --git a/base/setup/lib/utils/partlist.h b/base/setup/lib/utils/partlist.h index fb20f1500c0..71b9eb99181 100644 --- a/base/setup/lib/utils/partlist.h +++ b/base/setup/lib/utils/partlist.h @@ -338,12 +338,10 @@ GetAdjUnpartitionedEntry( _In_ BOOLEAN Direction); ERROR_NUMBER -PartitionCreationChecks( - _In_ PPARTENTRY PartEntry); - -ERROR_NUMBER -ExtendedPartitionCreationChecks( - _In_ PPARTENTRY PartEntry); +PartitionCreateChecks( + _In_ PPARTENTRY PartEntry, + _In_opt_ ULONGLONG SizeBytes, + _In_opt_ ULONG_PTR PartitionInfo); BOOLEAN CreatePartition( diff --git a/base/setup/reactos/drivepage.c b/base/setup/reactos/drivepage.c index 5afdb57b084..dc4fc64cfb5 100644 --- a/base/setup/reactos/drivepage.c +++ b/base/setup/reactos/drivepage.c @@ -1975,7 +1975,7 @@ DriveDlgProc( // TODO: In the future: first test needs to be augmented with: // (... && PartEntry->Volume->IsSimpleVolume) if ((PartEntry->IsPartitioned && PartEntry->Volume) || - (!PartEntry->IsPartitioned && (PartitionCreationChecks(PartEntry) == NOT_AN_ERROR))) + (!PartEntry->IsPartitioned && (PartitionCreateChecks(PartEntry, 0ULL, 0) == NOT_AN_ERROR))) { // ASSERT(PartEntry != PartEntry->DiskEntry->ExtendedPartition); ASSERT(!IsContainerPartition(PartEntry->PartitionType)); @@ -2090,7 +2090,7 @@ DisableWizNext: { ULONG Error; - Error = PartitionCreationChecks(PartEntry); + Error = PartitionCreateChecks(PartEntry, 0ULL, 0); if (Error != NOT_AN_ERROR) { // MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY); diff --git a/base/setup/usetup/usetup.c b/base/setup/usetup/usetup.c index d5d569ede42..10d133eb560 100644 --- a/base/setup/usetup/usetup.c +++ b/base/setup/usetup/usetup.c @@ -1711,7 +1711,7 @@ SelectPartitionPage(PINPUT_RECORD Ir) { ASSERT(CurrentPartition); - Error = PartitionCreationChecks(CurrentPartition); + Error = PartitionCreateChecks(CurrentPartition, 0ULL, 0); if (Error != NOT_AN_ERROR) { MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY); @@ -1729,7 +1729,7 @@ SelectPartitionPage(PINPUT_RECORD Ir) if (CurrentPartition->LogicalPartition) continue; - Error = ExtendedPartitionCreationChecks(CurrentPartition); + Error = PartitionCreateChecks(CurrentPartition, 0ULL, PARTITION_EXTENDED); if (Error != NOT_AN_ERROR) { MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY); @@ -1789,7 +1789,7 @@ CreateInstallPartition: /* Create the partition if the selected region is empty */ if (!CurrentPartition->IsPartitioned) { - Error = PartitionCreationChecks(CurrentPartition); + Error = PartitionCreateChecks(CurrentPartition, 0ULL, 0); if (Error != NOT_AN_ERROR) { MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);