if (IsContainerPartition(PartEntry->PartitionType))
{
PartEntry->FormatState = Unformatted;
+ PartEntry->FileSystem = NULL;
if (LogicalPartition == FALSE && DiskEntry->ExtendedPartition == NULL)
DiskEntry->ExtendedPartition = PartEntry;
}
+#if 0
+ else if (IsRecognizedPartition(PartEntry->PartitionType))
+ {
+ // FIXME FIXME! We should completely rework how we get this 'FileSystemList' available...
+ PartEntry->FileSystem = GetFileSystem(FileSystemList, PartEntry);
+ if (!PartEntry->FileSystem)
+ PartEntry->FormatState = Preformatted;
+ else
+ PartEntry->FormatState = Unformatted;
+ // PartEntry->FormatState = UnknownFormat;
+ }
+ else
+ {
+ /* Unknown partition, so unknown partition format (may or may not be actually formatted) */
+ PartEntry->FormatState = UnknownFormat;
+ }
+#endif
else if ((PartEntry->PartitionType == PARTITION_FAT_12) ||
(PartEntry->PartitionType == PARTITION_FAT_16) ||
(PartEntry->PartitionType == PARTITION_HUGE) ||
DPRINT1("Total Sectors: %I64u\n", NewPartEntry->SectorCount.QuadPart);
NewPartEntry->FormatState = Unformatted;
+ NewPartEntry->FileSystem = NULL;
InsertTailList(&DiskEntry->PrimaryPartListHead,
&NewPartEntry->ListEntry);
DPRINT1("Total Sectors: %I64u\n", NewPartEntry->SectorCount.QuadPart);
NewPartEntry->FormatState = Unformatted;
+ NewPartEntry->FileSystem = NULL;
/* Insert the table into the list */
InsertTailList(&PartEntry->ListEntry,
DPRINT("Total Sectors: %I64u\n", NewPartEntry->SectorCount.QuadPart);
NewPartEntry->FormatState = Unformatted;
+ NewPartEntry->FileSystem = NULL;
/* Append the table to the list */
InsertTailList(&DiskEntry->PrimaryPartListHead,
DPRINT1("Total Sectors: %I64u\n", NewPartEntry->SectorCount.QuadPart);
NewPartEntry->FormatState = Unformatted;
+ NewPartEntry->FileSystem = NULL;
InsertTailList(&DiskEntry->LogicalPartListHead,
&NewPartEntry->ListEntry);
DPRINT("Total Sectors: %I64u\n", NewPartEntry->SectorCount.QuadPart);
NewPartEntry->FormatState = Unformatted;
+ NewPartEntry->FileSystem = NULL;
/* Insert the table into the list */
InsertTailList(&PartEntry->ListEntry,
DPRINT("Total Sectors: %I64u\n", NewPartEntry->SectorCount.QuadPart);
NewPartEntry->FormatState = Unformatted;
+ NewPartEntry->FileSystem = NULL;
/* Append the table to the list */
InsertTailList(&DiskEntry->LogicalPartListHead,
if (!NT_SUCCESS(Status))
return;
+ /*
+ * Check whether the disk is initialized, by looking at its MBR.
+ * NOTE that this must be generalized to GPT disks as well!
+ */
+
Mbr = (PARTITION_SECTOR*)RtlAllocateHeap(ProcessHeap,
0,
DiskGeometry.BytesPerSector);
DiskEntry->BiosFound = FALSE;
/* Check if this disk has a valid MBR */
+ // FIXME: Check for the MBR signature as well, etc...
if (Mbr->BootCode[0] == 0 && Mbr->BootCode[1] == 0)
DiskEntry->NoMbr = TRUE;
else
/* Free the MBR sector buffer */
RtlFreeHeap(ProcessHeap, 0, Mbr);
+
ListEntry = List->BiosDiskListHead.Flink;
while (ListEntry != &List->BiosDiskListHead)
{
List->CurrentDisk = NULL;
List->CurrentPartition = NULL;
- List->SystemDisk = NULL;
List->SystemPartition = NULL;
- List->OriginalSystemDisk = NULL;
List->OriginalSystemPartition = NULL;
- List->TempDisk = NULL;
List->TempPartition = NULL;
List->FormatState = Start;
PartEntry->IsPartitioned = TRUE;
PartEntry->PartitionType = PARTITION_ENTRY_UNUSED;
PartEntry->FormatState = Unformatted;
+ PartEntry->FileSystem = NULL;
PartEntry->AutoCreate = AutoCreate;
PartEntry->New = TRUE;
PartEntry->BootIndicator = FALSE;
NewPartEntry->New = TRUE;
NewPartEntry->FormatState = Unformatted;
+ NewPartEntry->FileSystem = NULL;
NewPartEntry->BootIndicator = FALSE;
PartEntry->StartSector.QuadPart = NewPartEntry->StartSector.QuadPart + NewPartEntry->SectorCount.QuadPart;
DPRINT1("Total Sectors: %I64u\n", NewPartEntry->SectorCount.QuadPart);
NewPartEntry->FormatState = Unformatted;
+ NewPartEntry->FileSystem = NULL;
InsertTailList(&DiskEntry->LogicalPartListHead,
&NewPartEntry->ListEntry);
/* Convert current entry to 'new (unformatted)' */
PartEntry->IsPartitioned = TRUE;
- PartEntry->FormatState = Formatted;
+ PartEntry->FormatState = Formatted; // FIXME? Possibly to make GetNextUnformattedPartition work (i.e. skip the extended partition container)
+ PartEntry->FileSystem = NULL;
PartEntry->AutoCreate = FALSE;
PartEntry->New = FALSE;
PartEntry->BootIndicator = FALSE;
NewPartEntry->StartSector.QuadPart;
NewPartEntry->New = FALSE;
- NewPartEntry->FormatState = Formatted;
+ NewPartEntry->FormatState = Formatted; // FIXME? Possibly to make GetNextUnformattedPartition work (i.e. skip the extended partition container)
+ NewPartEntry->FileSystem = NULL;
NewPartEntry->BootIndicator = FALSE;
if (NewPartEntry->StartSector.QuadPart < 1450560)
PartEntry->IsPartitioned = TRUE;
PartEntry->PartitionType = PARTITION_ENTRY_UNUSED;
PartEntry->FormatState = Unformatted;
+ PartEntry->FileSystem = NULL;
PartEntry->AutoCreate = FALSE;
PartEntry->New = TRUE;
PartEntry->BootIndicator = FALSE;
NewPartEntry->New = TRUE;
NewPartEntry->FormatState = Unformatted;
+ NewPartEntry->FileSystem = NULL;
NewPartEntry->BootIndicator = FALSE;
NewPartEntry->LogicalPartition = TRUE;
/* Clear the system disk and partition pointers if the system partition is being deleted */
if (List->SystemPartition == List->CurrentPartition)
{
- List->SystemDisk = NULL;
List->SystemPartition = NULL;
}
PartEntry->IsPartitioned = FALSE;
PartEntry->PartitionType = PARTITION_ENTRY_UNUSED;
PartEntry->FormatState = Unformatted;
+ PartEntry->FileSystem = NULL;
PartEntry->DriveLetter = 0;
}
/* Check for empty disk list */
if (IsListEmpty(&List->DiskListHead))
{
- List->SystemDisk = NULL;
List->SystemPartition = NULL;
- List->OriginalSystemDisk = NULL;
List->OriginalSystemPartition = NULL;
return;
}
/* Check for empty partition list */
if (IsListEmpty(&DiskEntry->PrimaryPartListHead))
{
- List->SystemDisk = NULL;
List->SystemPartition = NULL;
- List->OriginalSystemDisk = NULL;
List->OriginalSystemPartition = NULL;
return;
}
- if (List->SystemDisk != NULL && List->SystemPartition != NULL)
+ if (List->SystemPartition != NULL)
{
/* We already have an active system partition */
DPRINT1("Use the current system partition %lu in disk %lu, drive letter %c\n",
List->SystemPartition->PartitionNumber,
- List->SystemDisk->DiskNumber,
+ List->SystemPartition->DiskEntry->DiskNumber,
(List->SystemPartition->DriveLetter == 0) ? '-' : List->SystemPartition->DriveLetter);
return;
}
DPRINT1("We are here (1)!\n");
- List->SystemDisk = NULL;
List->SystemPartition = NULL;
- List->OriginalSystemDisk = NULL;
List->OriginalSystemPartition = NULL;
/* Retrieve the first partition of the disk */
PartEntry = CONTAINING_RECORD(DiskEntry->PrimaryPartListHead.Flink,
PARTENTRY,
ListEntry);
- List->SystemDisk = DiskEntry;
+ ASSERT(DiskEntry == PartEntry->DiskEntry);
List->SystemPartition = PartEntry;
//
{
if (PartEntry->PartitionType == PARTITION_ENTRY_UNUSED || PartEntry->BootIndicator == FALSE)
{
- /* FIXME: Might be incorrect if partitions were created by Linux FDISK */
- List->SystemDisk = DiskEntry;
+ ASSERT(DiskEntry == PartEntry->DiskEntry);
List->SystemPartition = PartEntry;
- List->OriginalSystemDisk = List->SystemDisk;
List->OriginalSystemPartition = List->SystemPartition;
DPRINT1("Use new first active system partition %lu in disk %lu, drive letter %c\n",
List->SystemPartition->PartitionNumber,
- List->SystemDisk->DiskNumber,
+ List->SystemPartition->DiskEntry->DiskNumber,
(List->SystemPartition->DriveLetter == 0) ? '-' : List->SystemPartition->DriveLetter);
goto SetSystemPartition;
* OK we haven't encountered any used and active partition,
* so use the first one as the system partition.
*/
-
- /* FIXME: Might be incorrect if partitions were created by Linux FDISK */
- List->OriginalSystemDisk = List->SystemDisk; // DiskEntry
+ ASSERT(DiskEntry == List->SystemPartition->DiskEntry);
List->OriginalSystemPartition = List->SystemPartition; // First PartEntry
DPRINT1("Use first active system partition %lu in disk %lu, drive letter %c\n",
List->SystemPartition->PartitionNumber,
- List->SystemDisk->DiskNumber,
+ List->SystemPartition->DiskEntry->DiskNumber,
(List->SystemPartition->DriveLetter == 0) ? '-' : List->SystemPartition->DriveLetter);
goto SetSystemPartition;
}
- List->SystemDisk = NULL;
List->SystemPartition = NULL;
- List->OriginalSystemDisk = NULL;
List->OriginalSystemPartition = NULL;
DPRINT1("We are here (3)!\n");
if (PartEntry->BootIndicator)
{
/* Yes, we found it */
- List->SystemDisk = DiskEntry;
+ ASSERT(DiskEntry == PartEntry->DiskEntry);
List->SystemPartition = PartEntry;
DPRINT1("Found active system partition %lu in disk %lu, drive letter %c\n",
}
/* Check if we have found the system partition */
- if (List->SystemDisk == NULL || List->SystemPartition == NULL)
+ if (List->SystemPartition == NULL)
{
/* Nothing, use the alternative system partition */
DPRINT1("No system partition found, use the alternative partition!\n");
goto UseAlternativeSystemPartition;
}
- /* Save them */
- List->OriginalSystemDisk = List->SystemDisk;
+ /* Save it */
List->OriginalSystemPartition = List->SystemPartition;
/*
{
DPRINT1("System partition %lu in disk %lu with no FS?!\n",
List->OriginalSystemPartition->PartitionNumber,
- List->OriginalSystemDisk->DiskNumber);
+ List->OriginalSystemPartition->DiskEntry->DiskNumber);
goto FindAndUseAlternativeSystemPartition;
}
// HACK: WARNING: We cannot write on this FS yet!
DPRINT1("Use existing active system partition %lu in disk %lu, drive letter %c\n",
List->SystemPartition->PartitionNumber,
- List->SystemDisk->DiskNumber,
+ List->SystemPartition->DiskEntry->DiskNumber,
(List->SystemPartition->DriveLetter == 0) ? '-' : List->SystemPartition->DriveLetter);
return;
/* Unset the old system partition */
List->SystemPartition->BootIndicator = FALSE;
- List->SystemDisk->LayoutBuffer->PartitionEntry[List->SystemPartition->PartitionIndex].BootIndicator = FALSE;
- List->SystemDisk->LayoutBuffer->PartitionEntry[List->SystemPartition->PartitionIndex].RewritePartition = TRUE;
- List->SystemDisk->Dirty = TRUE;
+ List->SystemPartition->DiskEntry->LayoutBuffer->PartitionEntry[List->SystemPartition->PartitionIndex].BootIndicator = FALSE;
+ List->SystemPartition->DiskEntry->LayoutBuffer->PartitionEntry[List->SystemPartition->PartitionIndex].RewritePartition = TRUE;
+ List->SystemPartition->DiskEntry->Dirty = TRUE;
UseAlternativeSystemPartition:
- List->SystemDisk = List->CurrentDisk;
List->SystemPartition = List->CurrentPartition;
DPRINT1("Use alternative active system partition %lu in disk %lu, drive letter %c\n",
List->SystemPartition->PartitionNumber,
- List->SystemDisk->DiskNumber,
+ List->SystemPartition->DiskEntry->DiskNumber,
(List->SystemPartition->DriveLetter == 0) ? '-' : List->SystemPartition->DriveLetter);
SetSystemPartition:
/* Set the new active system partition */
List->SystemPartition->BootIndicator = TRUE;
- List->SystemDisk->LayoutBuffer->PartitionEntry[List->SystemPartition->PartitionIndex].BootIndicator = TRUE;
- List->SystemDisk->LayoutBuffer->PartitionEntry[List->SystemPartition->PartitionIndex].RewritePartition = TRUE;
- List->SystemDisk->Dirty = TRUE;
+ List->SystemPartition->DiskEntry->LayoutBuffer->PartitionEntry[List->SystemPartition->PartitionIndex].BootIndicator = TRUE;
+ List->SystemPartition->DiskEntry->LayoutBuffer->PartitionEntry[List->SystemPartition->PartitionIndex].RewritePartition = TRUE;
+ List->SystemPartition->DiskEntry->Dirty = TRUE;
}
if (FileHandle != NULL)
NtClose(FileHandle);
+ //
+ // NOTE: Originally (see r40437), we used to install here also a new MBR
+ // for this disk (by calling InstallMbrBootCodeToDisk), only if:
+ // DiskEntry->NewDisk == TRUE and DiskEntry->BiosDiskNumber == 0.
+ // Then after that, both DiskEntry->NewDisk and DiskEntry->NoMbr were set
+ // to FALSE. In the other place (in usetup.c) where InstallMbrBootCodeToDisk
+ // was called too, the installation test was modified by checking whether
+ // DiskEntry->NoMbr was TRUE (instead of NewDisk).
+ //
+
return Status;
}
Entry2 = Entry2->Flink;
}
+ Entry2 = DiskEntry->LogicalPartListHead.Flink;
+ while (Entry2 != &DiskEntry->LogicalPartListHead)
+ {
+ PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
+ if (PartEntry->IsPartitioned)
+ {
+ /* Assign a "\DosDevices\#:" mount point to this partition */
+ if (PartEntry->DriveLetter)
+ {
+ StartingOffset.QuadPart = PartEntry->StartSector.QuadPart * DiskEntry->BytesPerSector;
+ if (!SetMountedDeviceValue(PartEntry->DriveLetter,
+ DiskEntry->LayoutBuffer->Signature,
+ StartingOffset))
+ {
+ return FALSE;
+ }
+ }
+ }
+
+ Entry2 = Entry2->Flink;
+ }
+
Entry1 = Entry1->Flink;
}
return TRUE;
}
+VOID
+SetPartitionType(
+ IN PPARTENTRY PartEntry,
+ IN UCHAR PartitionType)
+{
+ PDISKENTRY DiskEntry = PartEntry->DiskEntry;
+
+ PartEntry->PartitionType = PartitionType;
+
+ DiskEntry->Dirty = TRUE;
+ DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].PartitionType = PartitionType;
+ DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].RewritePartition = TRUE;
+}
ULONG
PrimaryPartitionCreationChecks(
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
if (PartEntry->IsPartitioned && PartEntry->New)
{
- *pDiskEntry = DiskEntry;
- *pPartEntry = PartEntry;
- return TRUE;
+ ASSERT(DiskEntry == PartEntry->DiskEntry);
+ if (pDiskEntry) *pDiskEntry = DiskEntry;
+ *pPartEntry = PartEntry;
+ return TRUE;
}
Entry2 = Entry2->Flink;
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
if (PartEntry->IsPartitioned && PartEntry->New)
{
- *pDiskEntry = DiskEntry;
- *pPartEntry = PartEntry;
- return TRUE;
+ ASSERT(DiskEntry == PartEntry->DiskEntry);
+ if (pDiskEntry) *pDiskEntry = DiskEntry;
+ *pPartEntry = PartEntry;
+ return TRUE;
}
Entry2 = Entry2->Flink;
Entry1 = Entry1->Flink;
}
- *pDiskEntry = NULL;
+ if (pDiskEntry) *pDiskEntry = NULL;
*pPartEntry = NULL;
return FALSE;
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
if (PartEntry->NeedsCheck == TRUE)
{
- *pDiskEntry = DiskEntry;
- *pPartEntry = PartEntry;
- return TRUE;
+ ASSERT(DiskEntry == PartEntry->DiskEntry);
+ if (pDiskEntry) *pDiskEntry = DiskEntry;
+ *pPartEntry = PartEntry;
+ return TRUE;
}
Entry2 = Entry2->Flink;
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
if (PartEntry->NeedsCheck == TRUE)
{
- *pDiskEntry = DiskEntry;
- *pPartEntry = PartEntry;
- return TRUE;
+ ASSERT(DiskEntry == PartEntry->DiskEntry);
+ if (pDiskEntry) *pDiskEntry = DiskEntry;
+ *pPartEntry = PartEntry;
+ return TRUE;
}
Entry2 = Entry2->Flink;
Entry1 = Entry1->Flink;
}
- *pDiskEntry = NULL;
+ if (pDiskEntry) *pDiskEntry = NULL;
*pPartEntry = NULL;
return FALSE;
/* Find or set the active system partition */
CheckActiveSystemPartition(PartitionList, FileSystemList);
-
- if (PartitionList->SystemDisk == NULL ||
- PartitionList->SystemPartition == NULL)
+ if (PartitionList->SystemPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
case Start:
if (PartitionList->CurrentPartition != PartitionList->SystemPartition)
{
- PartitionList->TempDisk = PartitionList->SystemDisk;
PartitionList->TempPartition = PartitionList->SystemPartition;
PartitionList->TempPartition->NeedsCheck = TRUE;
}
else
{
- PartitionList->TempDisk = PartitionList->CurrentDisk;
PartitionList->TempPartition = PartitionList->CurrentPartition;
PartitionList->TempPartition->NeedsCheck = TRUE;
break;
case FormatSystemPartition:
- PartitionList->TempDisk = PartitionList->CurrentDisk;
PartitionList->TempPartition = PartitionList->CurrentPartition;
PartitionList->TempPartition->NeedsCheck = TRUE;
case FormatInstallPartition:
if (GetNextUnformattedPartition(PartitionList,
- &PartitionList->TempDisk,
+ NULL,
&PartitionList->TempPartition))
{
PartitionList->FormatState = FormatOtherPartition;
case FormatOtherPartition:
if (GetNextUnformattedPartition(PartitionList,
- &PartitionList->TempDisk,
+ NULL,
&PartitionList->TempPartition))
{
PartitionList->FormatState = FormatOtherPartition;
return QUIT_PAGE;
}
- DiskEntry = PartitionList->TempDisk;
PartEntry = PartitionList->TempPartition;
+ DiskEntry = PartEntry->DiskEntry;
/* Adjust disk size */
DiskSize = DiskEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
MUIDisplayPage(FORMAT_PARTITION_PAGE);
if (PartitionList == NULL ||
- PartitionList->TempDisk == NULL ||
PartitionList->TempPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
- DiskEntry = PartitionList->TempDisk;
PartEntry = PartitionList->TempPartition;
+ DiskEntry = PartEntry->DiskEntry;
while (TRUE)
{
if (PartEntry->SectorCount.QuadPart < 8192)
{
/* FAT12 CHS partition (disk is smaller than 4.1MB) */
- PartEntry->PartitionType = PARTITION_FAT_12;
+ SetPartitionType(PartEntry, PARTITION_FAT_12);
}
else if (PartEntry->StartSector.QuadPart < 1450560)
{
if (PartEntry->SectorCount.QuadPart < 65536)
{
/* FAT16 CHS partition (partition size < 32MB) */
- PartEntry->PartitionType = PARTITION_FAT_16;
+ SetPartitionType(PartEntry, PARTITION_FAT_16);
}
else if (PartEntry->SectorCount.QuadPart < 1048576)
{
/* FAT16 CHS partition (partition size < 512MB) */
- PartEntry->PartitionType = PARTITION_HUGE;
+ SetPartitionType(PartEntry, PARTITION_HUGE);
}
else
{
/* FAT32 CHS partition (partition size >= 512MB) */
- PartEntry->PartitionType = PARTITION_FAT32;
+ SetPartitionType(PartEntry, PARTITION_FAT32);
}
}
else
if (PartEntry->SectorCount.QuadPart < 1048576)
{
/* FAT16 LBA partition (partition size < 512MB) */
- PartEntry->PartitionType = PARTITION_XINT13;
+ SetPartitionType(PartEntry, PARTITION_XINT13);
}
else
{
/* FAT32 LBA partition (partition size >= 512MB) */
- PartEntry->PartitionType = PARTITION_FAT32_XINT13;
+ SetPartitionType(PartEntry, PARTITION_FAT32_XINT13);
}
}
-
- DiskEntry->Dirty = TRUE;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].PartitionType = PartEntry->PartitionType;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].RewritePartition = TRUE;
}
#if 0
else if (wcscmp(PartEntry->FileSystem->FileSystemName, L"EXT2") == 0)
{
- PartEntry->PartitionType = PARTITION_EXT2;
-
- DiskEntry->Dirty = TRUE;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].PartitionType = PartEntry->PartitionType;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].RewritePartition = TRUE;
+ SetPartitionType(PartEntry, PARTITION_EXT2);
}
else if (wcscmp(PartEntry->FileSystem->FileSystemName, L"NTFS") == 0)
{
- PartEntry->PartitionType = PARTITION_IFS;
-
- DiskEntry->Dirty = TRUE;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].PartitionType = PartEntry->PartitionType;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].RewritePartition = TRUE;
+ SetPartitionType(PartEntry, PARTITION_IFS);
}
#endif
else if (!PartEntry->FileSystem->FormatFunc)
RtlFreeUnicodeString(&SystemRootPath);
swprintf(PathBuffer,
L"\\Device\\Harddisk%lu\\Partition%lu",
- PartitionList->SystemDisk->DiskNumber,
+ PartitionList->SystemPartition->DiskEntry->DiskNumber,
PartitionList->SystemPartition->PartitionNumber);
RtlCreateUnicodeString(&SystemRootPath, PathBuffer);
DPRINT1("SystemRootPath: %wZ\n", &SystemRootPath);
/* Step 2: Write the MBR */
swprintf(DestinationDevicePathBuffer,
L"\\Device\\Harddisk%d\\Partition0",
- PartitionList->SystemDisk->DiskNumber);
+ PartitionList->SystemPartition->DiskEntry->DiskNumber);
wcscpy(SourceMbrPathBuffer, SourceRootPath.Buffer);
wcscat(SourceMbrPathBuffer, L"\\loader\\dosmbr.bin");