Author: ekohl Date: Fri Jun 19 19:01:39 2015 New Revision: 68197
URL: http://svn.reactos.org/svn/reactos?rev=68197&view=rev Log: [USETUP] Implement CreateLogicalPartition. Now we can create logical partitons, but they will not be written to a disk yet.
Modified: trunk/reactos/base/setup/usetup/partlist.c
Modified: trunk/reactos/base/setup/usetup/partlist.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/setup/usetup/partlist.... ============================================================================== --- trunk/reactos/base/setup/usetup/partlist.c [iso-8859-1] (original) +++ trunk/reactos/base/setup/usetup/partlist.c [iso-8859-1] Fri Jun 19 19:01:39 2015 @@ -2621,9 +2621,9 @@ PPARTLIST List, ULONGLONG SectorCount) { -// PDISKENTRY DiskEntry; + PDISKENTRY DiskEntry; PPARTENTRY PartEntry; -// PPARTENTRY NewPartEntry; + PPARTENTRY NewPartEntry;
DPRINT1("CreateLogicalPartition(%I64u)\n", SectorCount);
@@ -2635,10 +2635,71 @@ return; }
-// DiskEntry = List->CurrentDisk; + DiskEntry = List->CurrentDisk; PartEntry = List->CurrentPartition;
DPRINT1("Current partition sector count: %I64u\n", PartEntry->SectorCount.QuadPart); + + if (Align(PartEntry->StartSector.QuadPart + SectorCount, DiskEntry->SectorAlignment) - PartEntry->StartSector.QuadPart == PartEntry->SectorCount.QuadPart) + { + DPRINT1("Convert existing partition entry\n"); + + /* Convert current entry to 'new (unformatted)' */ + PartEntry->IsPartitioned = TRUE; + PartEntry->PartitionType = PARTITION_ENTRY_UNUSED; + PartEntry->FormatState = Unformatted; + PartEntry->AutoCreate = FALSE; + PartEntry->New = TRUE; + PartEntry->BootIndicator = FALSE; + PartEntry->LogicalPartition = TRUE; + + DPRINT1("First Sector: %I64u\n", PartEntry->StartSector.QuadPart); + DPRINT1("Last Sector: %I64u\n", PartEntry->StartSector.QuadPart + PartEntry->SectorCount.QuadPart - 1); + DPRINT1("Total Sectors: %I64u\n", PartEntry->SectorCount.QuadPart); + } + else + { + DPRINT1("Add new partition entry\n"); + + /* Insert and initialize a new partition entry */ + NewPartEntry = RtlAllocateHeap(ProcessHeap, + HEAP_ZERO_MEMORY, + sizeof(PARTENTRY)); + if (NewPartEntry == NULL) + return; + + /* Insert the new entry into the list */ + InsertTailList(&PartEntry->ListEntry, + &NewPartEntry->ListEntry); + + NewPartEntry->DiskEntry = DiskEntry; + + NewPartEntry->IsPartitioned = TRUE; + NewPartEntry->StartSector.QuadPart = PartEntry->StartSector.QuadPart; + NewPartEntry->SectorCount.QuadPart = Align(NewPartEntry->StartSector.QuadPart + SectorCount, DiskEntry->SectorAlignment) - + NewPartEntry->StartSector.QuadPart; + NewPartEntry->PartitionType = PARTITION_ENTRY_UNUSED; + + DPRINT1("First Sector: %I64u\n", NewPartEntry->StartSector.QuadPart); + DPRINT1("Last Sector: %I64u\n", NewPartEntry->StartSector.QuadPart + NewPartEntry->SectorCount.QuadPart - 1); + DPRINT1("Total Sectors: %I64u\n", NewPartEntry->SectorCount.QuadPart); + + NewPartEntry->New = TRUE; + NewPartEntry->FormatState = Unformatted; + NewPartEntry->BootIndicator = FALSE; + NewPartEntry->LogicalPartition = TRUE; + + PartEntry->StartSector.QuadPart = NewPartEntry->StartSector.QuadPart + NewPartEntry->SectorCount.QuadPart; + PartEntry->SectorCount.QuadPart -= (PartEntry->StartSector.QuadPart - NewPartEntry->StartSector.QuadPart); + } + + UpdateDiskLayout(DiskEntry); + + DiskEntry->Dirty = TRUE; + + UpdatePartitionNumbers(DiskEntry); + + AssignDriveLetters(List); }