if (PartEntry->IsPartitioned &&
!IsContainerPartition(PartEntry->PartitionType))
{
+ ASSERT(PartEntry->PartitionType != PARTITION_ENTRY_UNUSED);
+
if (IsRecognizedPartition(PartEntry->PartitionType) ||
- (PartEntry->PartitionType == PARTITION_ENTRY_UNUSED &&
- PartEntry->SectorCount.QuadPart != 0LL))
+ PartEntry->SectorCount.QuadPart != 0LL)
{
if (Letter <= L'Z')
{
if (PartEntry->IsPartitioned)
{
+ ASSERT(PartEntry->PartitionType != PARTITION_ENTRY_UNUSED);
+
if (IsRecognizedPartition(PartEntry->PartitionType) ||
- (PartEntry->PartitionType == PARTITION_ENTRY_UNUSED &&
- PartEntry->SectorCount.QuadPart != 0LL))
+ PartEntry->SectorCount.QuadPart != 0LL)
{
if (Letter <= L'Z')
{
else if (IsRecognizedPartition(PartEntry->PartitionType))
{
ASSERT(PartitionInfo->RecognizedPartition);
+ ASSERT(PartEntry->IsPartitioned && PartEntry->PartitionNumber != 0);
/* Open the volume, ignore any errors */
RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
if (DiskEntry->DiskStyle == PARTITION_STYLE_GPT)
{
- DPRINT("GPT-partitioned disk detected, not currently supported by SETUP!\n");
+ DPRINT1("GPT-partitioned disk detected, not currently supported by SETUP!\n");
return;
}
if (PartEntry->IsPartitioned)
{
+ ASSERT(PartEntry->PartitionType != PARTITION_ENTRY_UNUSED);
+
PartitionInfo = &DiskEntry->LayoutBuffer->PartitionEntry[Index];
PartEntry->PartitionIndex = Index;
- /* Reset the current partition number only for newly-created partitions */
+ /* Reset the current partition number only for newly-created (unmounted) partitions */
if (PartEntry->New)
PartEntry->PartitionNumber = 0;
- PartEntry->OnDiskPartitionNumber = (!IsContainerPartition(PartEntry->PartitionType)) ? PartitionNumber : 0;
+ PartEntry->OnDiskPartitionNumber = (!IsContainerPartition(PartEntry->PartitionType) ? PartitionNumber : 0);
if (!IsSamePrimaryLayoutEntry(PartitionInfo, DiskEntry, PartEntry))
{
if (PartEntry->IsPartitioned)
{
+ ASSERT(PartEntry->PartitionType != PARTITION_ENTRY_UNUSED);
+
PartitionInfo = &DiskEntry->LayoutBuffer->PartitionEntry[Index];
PartEntry->PartitionIndex = Index;
- DPRINT1("Updating logical partition entry %lu\n", Index);
-
- /* Reset the current partition number only for newly-created partitions */
+ /* Reset the current partition number only for newly-created (unmounted) partitions */
if (PartEntry->New)
PartEntry->PartitionNumber = 0;
PartEntry->OnDiskPartitionNumber = PartitionNumber;
+ DPRINT1("Updating logical partition entry %lu\n", Index);
+
PartitionInfo->StartingOffset.QuadPart = PartEntry->StartSector.QuadPart * DiskEntry->BytesPerSector;
PartitionInfo->PartitionLength.QuadPart = PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
PartitionInfo->HiddenSectors = DiskEntry->SectorAlignment;
PARTENTRY,
ListEntry);
if (PrevPartEntry->IsPartitioned == FALSE)
+ {
+ ASSERT(PrevPartEntry->PartitionType == PARTITION_ENTRY_UNUSED);
return PrevPartEntry;
+ }
}
return NULL;
PARTENTRY,
ListEntry);
if (NextPartEntry->IsPartitioned == FALSE)
+ {
+ ASSERT(NextPartEntry->PartitionType == PARTITION_ENTRY_UNUSED);
return NextPartEntry;
+ }
}
return NULL;
BOOLEAN
CreatePrimaryPartition(
IN PPARTLIST List,
+ IN PPARTENTRY SelectedEntry,
IN ULONGLONG SectorCount,
IN BOOLEAN AutoCreate)
{
ERROR_NUMBER Error;
- PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
DPRINT1("CreatePrimaryPartition(%I64u)\n", SectorCount);
if (List == NULL ||
- List->CurrentDisk == NULL ||
- List->CurrentPartition == NULL ||
- List->CurrentPartition->IsPartitioned)
+ SelectedEntry == NULL ||
+ SelectedEntry->DiskEntry == NULL ||
+ SelectedEntry->IsPartitioned)
{
return FALSE;
}
- Error = PrimaryPartitionCreationChecks(List);
+ Error = PrimaryPartitionCreationChecks(SelectedEntry);
if (Error != NOT_AN_ERROR)
{
DPRINT1("PrimaryPartitionCreationChecks() failed with error %lu\n", Error);
return FALSE;
}
- DiskEntry = List->CurrentDisk;
- PartEntry = List->CurrentPartition;
-
/* Convert the current entry, or insert and initialize a new partition entry */
- PartEntry = InitializePartitionEntry(DiskEntry, PartEntry, SectorCount, AutoCreate);
+ PartEntry = InitializePartitionEntry(SelectedEntry->DiskEntry, SelectedEntry, SectorCount, AutoCreate);
if (PartEntry == NULL)
return FALSE;
- UpdateDiskLayout(DiskEntry);
+ UpdateDiskLayout(PartEntry->DiskEntry);
AssignDriveLetters(List);
BOOLEAN
CreateExtendedPartition(
IN PPARTLIST List,
+ IN PPARTENTRY SelectedEntry,
IN ULONGLONG SectorCount)
{
ERROR_NUMBER Error;
- PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
DPRINT1("CreateExtendedPartition(%I64u)\n", SectorCount);
if (List == NULL ||
- List->CurrentDisk == NULL ||
- List->CurrentPartition == NULL ||
- List->CurrentPartition->IsPartitioned)
+ SelectedEntry == NULL ||
+ SelectedEntry->DiskEntry == NULL ||
+ SelectedEntry->IsPartitioned)
{
return FALSE;
}
- Error = ExtendedPartitionCreationChecks(List);
+ Error = ExtendedPartitionCreationChecks(SelectedEntry);
if (Error != NOT_AN_ERROR)
{
DPRINT1("ExtendedPartitionCreationChecks() failed with error %lu\n", Error);
return FALSE;
}
- DiskEntry = List->CurrentDisk;
- PartEntry = List->CurrentPartition;
-
/* Convert the current entry, or insert and initialize a new partition entry */
- PartEntry = InitializePartitionEntry(DiskEntry, PartEntry, SectorCount, FALSE);
+ PartEntry = InitializePartitionEntry(SelectedEntry->DiskEntry, SelectedEntry, SectorCount, FALSE);
if (PartEntry == NULL)
return FALSE;
PartEntry->New = FALSE;
PartEntry->FormatState = Formatted;
- DiskEntry->ExtendedPartition = PartEntry;
+ PartEntry->DiskEntry->ExtendedPartition = PartEntry;
- AddLogicalDiskSpace(DiskEntry);
+ AddLogicalDiskSpace(PartEntry->DiskEntry);
- UpdateDiskLayout(DiskEntry);
+ UpdateDiskLayout(PartEntry->DiskEntry);
AssignDriveLetters(List);
BOOLEAN
CreateLogicalPartition(
IN PPARTLIST List,
+ IN PPARTENTRY SelectedEntry,
IN ULONGLONG SectorCount,
IN BOOLEAN AutoCreate)
{
ERROR_NUMBER Error;
- PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
DPRINT1("CreateLogicalPartition(%I64u)\n", SectorCount);
if (List == NULL ||
- List->CurrentDisk == NULL ||
- List->CurrentPartition == NULL ||
- List->CurrentPartition->IsPartitioned)
+ SelectedEntry == NULL ||
+ SelectedEntry->DiskEntry == NULL ||
+ SelectedEntry->IsPartitioned)
{
return FALSE;
}
- Error = LogicalPartitionCreationChecks(List);
+ Error = LogicalPartitionCreationChecks(SelectedEntry);
if (Error != NOT_AN_ERROR)
{
DPRINT1("LogicalPartitionCreationChecks() failed with error %lu\n", Error);
return FALSE;
}
- DiskEntry = List->CurrentDisk;
- PartEntry = List->CurrentPartition;
-
/* Convert the current entry, or insert and initialize a new partition entry */
- PartEntry = InitializePartitionEntry(DiskEntry, PartEntry, SectorCount, AutoCreate);
+ PartEntry = InitializePartitionEntry(SelectedEntry->DiskEntry, SelectedEntry, SectorCount, AutoCreate);
if (PartEntry == NULL)
return FALSE;
PartEntry->LogicalPartition = TRUE;
- UpdateDiskLayout(DiskEntry);
+ UpdateDiskLayout(PartEntry->DiskEntry);
AssignDriveLetters(List);
HANDLE PartitionHandle;
WCHAR Buffer[MAX_PATH];
- /* Check whether the partition is valid and may have been mounted in the system */
+ /* Check whether the partition is valid and was mounted by the system */
if (!PartEntry->IsPartitioned ||
- PartEntry->PartitionType == PARTITION_ENTRY_UNUSED ||
- IsContainerPartition(PartEntry->PartitionType) ||
- !IsRecognizedPartition(PartEntry->PartitionType) ||
+ IsContainerPartition(PartEntry->PartitionType) ||
+ !IsRecognizedPartition(PartEntry->PartitionType) ||
PartEntry->FormatState == Unformatted /* || PartEntry->FormatState == UnknownFormat */ ||
!*PartEntry->FileSystem ||
PartEntry->PartitionNumber == 0)
return STATUS_SUCCESS;
}
+ ASSERT(PartEntry->PartitionType != PARTITION_ENTRY_UNUSED);
+
/* Open the volume */
RtlStringCchPrintfW(Buffer, ARRAYSIZE(Buffer),
L"\\Device\\Harddisk%lu\\Partition%lu",
}
VOID
-DeleteCurrentPartition(
- IN PPARTLIST List)
+DeletePartition(
+ IN PPARTLIST List,
+ IN PPARTENTRY PartEntry)
{
PDISKENTRY DiskEntry;
- PPARTENTRY PartEntry;
PPARTENTRY PrevPartEntry;
PPARTENTRY NextPartEntry;
PPARTENTRY LogicalPartEntry;
PLIST_ENTRY Entry;
if (List == NULL ||
- List->CurrentDisk == NULL ||
- List->CurrentPartition == NULL ||
- List->CurrentPartition->IsPartitioned == FALSE)
+ PartEntry == NULL ||
+ PartEntry->DiskEntry == NULL ||
+ PartEntry->IsPartitioned == FALSE)
{
return;
}
- /* Clear the system disk and partition pointers if the system partition is being deleted */
- if (List->SystemPartition == List->CurrentPartition)
+ ASSERT(PartEntry->PartitionType != PARTITION_ENTRY_UNUSED);
+
+ /* Clear the system partition pointers if it is being deleted */
+ if (List->SystemPartition == PartEntry)
{
+ ASSERT(List->SystemPartition);
+
+ if (List->SystemPartition == List->OriginalSystemPartition)
+ List->OriginalSystemPartition = NULL;
List->SystemPartition = NULL;
}
- DiskEntry = List->CurrentDisk;
- PartEntry = List->CurrentPartition;
+ DiskEntry = PartEntry->DiskEntry;
/* Check which type of partition (primary/logical or extended) is being deleted */
if (DiskEntry->ExtendedPartition == PartEntry)
RtlFreeHeap(ProcessHeap, 0, NextPartEntry);
/* Update current partition */
- List->CurrentPartition = PrevPartEntry;
+ if (List->CurrentPartition == PartEntry ||
+ List->CurrentPartition == NextPartEntry)
+ {
+ List->CurrentPartition = PrevPartEntry;
+ }
}
else if (PrevPartEntry != NULL && NextPartEntry == NULL)
{
RtlFreeHeap(ProcessHeap, 0, PartEntry);
/* Update current partition */
- List->CurrentPartition = PrevPartEntry;
+ if (List->CurrentPartition == PartEntry)
+ {
+ List->CurrentPartition = PrevPartEntry;
+ }
}
else if (PrevPartEntry == NULL && NextPartEntry != NULL)
{
RtlFreeHeap(ProcessHeap, 0, PartEntry);
/* Update current partition */
- List->CurrentPartition = NextPartEntry;
+ if (List->CurrentPartition == PartEntry)
+ {
+ List->CurrentPartition = NextPartEntry;
+ }
}
else
{
AssignDriveLetters(List);
}
+VOID
+DeleteCurrentPartition(
+ IN PPARTLIST List)
+{
+ DeletePartition(List, List->CurrentPartition);
+}
+
static
BOOLEAN
IsSupportedActivePartition(
List->SystemPartition->DiskEntry->Dirty = TRUE;
}
-static
NTSTATUS
WritePartitions(
- IN PPARTLIST List,
IN PDISKENTRY DiskEntry)
{
NTSTATUS Status;
DPRINT("WritePartitions() Disk: %lu\n", DiskEntry->DiskNumber);
+ /* If the disk is not dirty, there is nothing to do */
+ if (!DiskEntry->Dirty)
+ return STATUS_SUCCESS;
+
RtlStringCchPrintfW(DstPath, ARRAYSIZE(DstPath),
L"\\Device\\Harddisk%lu\\Partition0",
DiskEntry->DiskNumber);
if (PartEntry->IsPartitioned)
{
+ ASSERT(PartEntry->PartitionType != PARTITION_ENTRY_UNUSED);
PartitionInfo = &DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex];
PartEntry->PartitionNumber = PartitionInfo->PartitionNumber;
}
if (PartEntry->IsPartitioned)
{
+ ASSERT(PartEntry->PartitionType != PARTITION_ENTRY_UNUSED);
PartitionInfo = &DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex];
PartEntry->PartitionNumber = PartitionInfo->PartitionNumber;
}
// DiskEntry->NoMbr was TRUE (instead of NewDisk).
//
- // DiskEntry->Dirty = FALSE;
+ /* The layout has been successfully updated, the disk is not dirty anymore */
+ DiskEntry->Dirty = FALSE;
return Status;
}
WritePartitionsToDisk(
IN PPARTLIST List)
{
+ NTSTATUS Status;
PLIST_ENTRY Entry;
PDISKENTRY DiskEntry;
if (DiskEntry->Dirty != FALSE)
{
- WritePartitions(List, DiskEntry);
- DiskEntry->Dirty = FALSE;
+ Status = WritePartitions(DiskEntry);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("WritePartitionsToDisk() failed to update disk %lu, Status 0x%08lx\n",
+ DiskEntry->DiskNumber, Status);
+ }
}
}
Entry2 = Entry2->Flink)
{
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
- if (PartEntry->IsPartitioned)
+ if (PartEntry->IsPartitioned) // && !IsContainerPartition(PartEntry->PartitionType)
{
+ ASSERT(PartEntry->PartitionType != PARTITION_ENTRY_UNUSED);
+
/* Assign a "\DosDevices\#:" mount point to this partition */
if (PartEntry->DriveLetter)
{
Entry2 = Entry2->Flink)
{
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
- if (PartEntry->IsPartitioned)
+ if (PartEntry->IsPartitioned) // && !IsContainerPartition(PartEntry->PartitionType)
{
+ ASSERT(PartEntry->PartitionType != PARTITION_ENTRY_UNUSED);
+
/* Assign a "\DosDevices\#:" mount point to this partition */
if (PartEntry->DriveLetter)
{
ERROR_NUMBER
PrimaryPartitionCreationChecks(
- IN PPARTLIST List)
+ IN PPARTENTRY PartEntry)
{
- PDISKENTRY DiskEntry;
- PPARTENTRY PartEntry;
-
- DiskEntry = List->CurrentDisk;
- PartEntry = List->CurrentPartition;
+ PDISKENTRY DiskEntry = PartEntry->DiskEntry;
if (DiskEntry->DiskStyle == PARTITION_STYLE_GPT)
{
ERROR_NUMBER
ExtendedPartitionCreationChecks(
- IN PPARTLIST List)
+ IN PPARTENTRY PartEntry)
{
- PDISKENTRY DiskEntry;
- PPARTENTRY PartEntry;
-
- DiskEntry = List->CurrentDisk;
- PartEntry = List->CurrentPartition;
+ PDISKENTRY DiskEntry = PartEntry->DiskEntry;
if (DiskEntry->DiskStyle == PARTITION_STYLE_GPT)
{
ERROR_NUMBER
LogicalPartitionCreationChecks(
- IN PPARTLIST List)
+ IN PPARTENTRY PartEntry)
{
- PDISKENTRY DiskEntry;
- PPARTENTRY PartEntry;
-
- DiskEntry = List->CurrentDisk;
- PartEntry = List->CurrentPartition;
+ PDISKENTRY DiskEntry = PartEntry->DiskEntry;
if (DiskEntry->DiskStyle == PARTITION_STYLE_GPT)
{
Entry2 = Entry2->Flink)
{
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
- if (PartEntry->NeedsCheck == TRUE)
+ if (PartEntry->IsPartitioned && PartEntry->NeedsCheck)
{
ASSERT(DiskEntry == PartEntry->DiskEntry);
if (pDiskEntry) *pDiskEntry = DiskEntry;
Entry2 = Entry2->Flink)
{
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
- if (PartEntry->NeedsCheck == TRUE)
+ if (PartEntry->IsPartitioned && PartEntry->NeedsCheck)
{
ASSERT(DiskEntry == PartEntry->DiskEntry);
if (pDiskEntry) *pDiskEntry = DiskEntry;
if (PartitionList->CurrentPartition->LogicalPartition)
{
CreateLogicalPartition(PartitionList,
+ PartitionList->CurrentPartition,
PartitionList->CurrentPartition->SectorCount.QuadPart,
TRUE);
}
else
{
CreatePrimaryPartition(PartitionList,
+ PartitionList->CurrentPartition,
PartitionList->CurrentPartition->SectorCount.QuadPart,
TRUE);
}
{
if (PartitionList->CurrentPartition->LogicalPartition)
{
- Error = LogicalPartitionCreationChecks(PartitionList);
+ Error = LogicalPartitionCreationChecks(PartitionList->CurrentPartition);
if (Error != NOT_AN_ERROR)
{
MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);
}
CreateLogicalPartition(PartitionList,
+ PartitionList->CurrentPartition,
0ULL,
TRUE);
}
else
{
- Error = PrimaryPartitionCreationChecks(PartitionList);
+ Error = PrimaryPartitionCreationChecks(PartitionList->CurrentPartition);
if (Error != NOT_AN_ERROR)
{
MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);
}
CreatePrimaryPartition(PartitionList,
+ PartitionList->CurrentPartition,
0ULL,
TRUE);
}
{
if (PartitionList->CurrentPartition->LogicalPartition == FALSE)
{
- Error = PrimaryPartitionCreationChecks(PartitionList);
+ Error = PrimaryPartitionCreationChecks(PartitionList->CurrentPartition);
if (Error != NOT_AN_ERROR)
{
MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);
{
if (PartitionList->CurrentPartition->LogicalPartition == FALSE)
{
- Error = ExtendedPartitionCreationChecks(PartitionList);
+ Error = ExtendedPartitionCreationChecks(PartitionList->CurrentPartition);
if (Error != NOT_AN_ERROR)
{
MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);
{
if (PartitionList->CurrentPartition->LogicalPartition)
{
- Error = LogicalPartitionCreationChecks(PartitionList);
+ Error = LogicalPartitionCreationChecks(PartitionList->CurrentPartition);
if (Error != NOT_AN_ERROR)
{
MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);
DPRINT ("Partition size: %I64u bytes\n", PartSize);
CreatePrimaryPartition(PartitionList,
+ PartitionList->CurrentPartition,
SectorCount,
FALSE);
DPRINT ("Partition size: %I64u bytes\n", PartSize);
CreateExtendedPartition(PartitionList,
+ PartitionList->CurrentPartition,
SectorCount);
return SELECT_PARTITION_PAGE;
DPRINT("Partition size: %I64u bytes\n", PartSize);
CreateLogicalPartition(PartitionList,
+ PartitionList->CurrentPartition,
SectorCount,
FALSE);
PartEntry = TempPartition;
DiskEntry = PartEntry->DiskEntry;
+ ASSERT(PartEntry->IsPartitioned && PartEntry->PartitionNumber != 0);
+
/* Adjust disk size */
DiskSize = DiskEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
if (DiskSize >= 10 * GB) /* 10 GB */
PartEntry = TempPartition;
DiskEntry = PartEntry->DiskEntry;
+ ASSERT(PartEntry->IsPartitioned && PartEntry->PartitionNumber != 0);
+
SelectedFileSystem = FileSystemList->Selected;
+ ASSERT(SelectedFileSystem && SelectedFileSystem->FileSystem);
while (TRUE)
{
return INSTALL_DIRECTORY_PAGE;
}
+ ASSERT(PartEntry->IsPartitioned && PartEntry->PartitionNumber != 0);
+
CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_CHECKINGPART));
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
+ ASSERT(PartitionList->SystemPartition->IsPartitioned && PartitionList->SystemPartition->PartitionNumber != 0);
+
RtlFreeUnicodeString(&USetupData.SystemRootPath);
RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
L"\\Device\\Harddisk%lu\\Partition%lu\\",