@@ -2818,48 +2818,41 @@ GetAdjUnpartitionedEntry(
28182818 return NULL ;
28192819}
28202820
2821- static ERROR_NUMBER
2822- MBRPartitionCreateChecks (
2823- _In_ PPARTENTRY PartEntry ,
2824- _In_opt_ ULONGLONG SizeBytes ,
2825- _In_opt_ ULONG_PTR PartitionInfo )
2821+ ERROR_NUMBER
2822+ PartitionCreationChecks (
2823+ _In_ PPARTENTRY PartEntry )
28262824{
28272825 PDISKENTRY DiskEntry = PartEntry -> DiskEntry ;
2828- BOOLEAN isContainer = IsContainerPartition ((UCHAR )PartitionInfo );
28292826
2830- ASSERT (DiskEntry -> DiskStyle == PARTITION_STYLE_MBR );
2831- ASSERT (!PartEntry -> IsPartitioned );
2832-
2833- if (isContainer )
2827+ if (DiskEntry -> DiskStyle == PARTITION_STYLE_GPT )
28342828 {
2835- /* Cannot create an extended partition within logical partition space */
2836- if (PartEntry -> LogicalPartition )
2837- return ERROR_ONLY_ONE_EXTENDED ;
2838-
2839- /* Fail if there is another extended partition in the list */
2840- if (DiskEntry -> ExtendedPartition )
2841- return ERROR_ONLY_ONE_EXTENDED ;
2829+ DPRINT1 ("GPT-partitioned disk detected, not currently supported by SETUP!\n" );
2830+ return ERROR_WARN_PARTITION ;
28422831 }
28432832
2833+ /* Fail if the partition is already in use */
2834+ if (PartEntry -> IsPartitioned )
2835+ return ERROR_NEW_PARTITION ;
2836+
28442837 /*
2845- * Primary or Extended partitions
2838+ * For primary partitions
28462839 */
2847- if (!PartEntry -> LogicalPartition || isContainer )
2840+ if (!PartEntry -> LogicalPartition )
28482841 {
28492842 /* Only one primary partition is allowed on super-floppy */
28502843 if (IsSuperFloppy (DiskEntry ))
28512844 return ERROR_PARTITION_TABLE_FULL ;
28522845
2853- /* Fail if there are too many primary partitions */
2846+ /* Fail if there are already 4 primary partitions in the list */
28542847 if (GetPrimaryPartitionCount (DiskEntry ) >= 4 )
28552848 return ERROR_PARTITION_TABLE_FULL ;
28562849 }
28572850 /*
2858- * Logical partitions
2851+ * For logical partitions
28592852 */
28602853 else
28612854 {
2862- // TODO: Check that we are inside an extended partition!
2855+ // TODO: Check that we are inside an extended partition!!
28632856 // Then the following check will be useless.
28642857
28652858 /* Only one (primary) partition is allowed on super-floppy */
@@ -2871,24 +2864,38 @@ MBRPartitionCreateChecks(
28712864}
28722865
28732866ERROR_NUMBER
2874- PartitionCreateChecks (
2875- _In_ PPARTENTRY PartEntry ,
2876- _In_opt_ ULONGLONG SizeBytes ,
2877- _In_opt_ ULONG_PTR PartitionInfo )
2867+ ExtendedPartitionCreationChecks (
2868+ _In_ PPARTENTRY PartEntry )
28782869{
28792870 PDISKENTRY DiskEntry = PartEntry -> DiskEntry ;
28802871
2881- /* Fail if the partition is already in use */
2882- if (PartEntry -> IsPartitioned )
2883- return ERROR_NEW_PARTITION ;
2884-
2885- if (DiskEntry -> DiskStyle == PARTITION_STYLE_MBR )
2886- return MBRPartitionCreateChecks (PartEntry , SizeBytes , PartitionInfo );
2887- else // if (DiskEntry->DiskStyle == PARTITION_STYLE_GPT)
2872+ if (DiskEntry -> DiskStyle == PARTITION_STYLE_GPT )
28882873 {
28892874 DPRINT1 ("GPT-partitioned disk detected, not currently supported by SETUP!\n" );
28902875 return ERROR_WARN_PARTITION ;
28912876 }
2877+
2878+ /* Fail if the partition is already in use */
2879+ if (PartEntry -> IsPartitioned )
2880+ return ERROR_NEW_PARTITION ;
2881+
2882+ /* Cannot create an extended partition within logical partition space */
2883+ if (PartEntry -> LogicalPartition )
2884+ return ERROR_ONLY_ONE_EXTENDED ;
2885+
2886+ /* Only one primary partition is allowed on super-floppy */
2887+ if (IsSuperFloppy (DiskEntry ))
2888+ return ERROR_PARTITION_TABLE_FULL ;
2889+
2890+ /* Fail if there are already 4 primary partitions in the list */
2891+ if (GetPrimaryPartitionCount (DiskEntry ) >= 4 )
2892+ return ERROR_PARTITION_TABLE_FULL ;
2893+
2894+ /* Fail if there is another extended partition in the list */
2895+ if (DiskEntry -> ExtendedPartition )
2896+ return ERROR_ONLY_ONE_EXTENDED ;
2897+
2898+ return ERROR_SUCCESS ;
28922899}
28932900
28942901// TODO: Improve upon the PartitionInfo parameter later
@@ -2919,10 +2926,13 @@ CreatePartition(
29192926 return FALSE;
29202927 }
29212928
2922- Error = PartitionCreateChecks (PartEntry , SizeBytes , PartitionInfo );
2929+ if (isContainer )
2930+ Error = ExtendedPartitionCreationChecks (PartEntry );
2931+ else
2932+ Error = PartitionCreationChecks (PartEntry );
29232933 if (Error != NOT_AN_ERROR )
29242934 {
2925- DPRINT1 ("PartitionCreateChecks (%s) failed with error %lu\n" , mainType , Error );
2935+ DPRINT1 ("PartitionCreationChecks (%s) failed with error %lu\n" , mainType , Error );
29262936 return FALSE;
29272937 }
29282938
0 commit comments