Author: ekohl
Date: Wed Jun 24 20:06:33 2015
New Revision: 68257
URL: 
http://svn.reactos.org/svn/reactos?rev=68257&view=rev
Log:
[USETUP]
- ReAllocateLayoutBuffer: Write all new partition table entries to the disk.
- UpdateDiskLayout:
  - Create link entries for logical partitions.
  - Wipe unused logical partiton table entries.
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] Wed Jun 24 20:06:33 2015
@@ -2192,7 +2192,6 @@
 }
-#if 0
 static
 BOOLEAN
 IsEmptyLayoutEntry(
@@ -2200,12 +2199,10 @@
 {
     if (PartitionInfo->StartingOffset.QuadPart == 0 &&
         PartitionInfo->PartitionLength.QuadPart == 0)
-//        PartitionInfo->PartitionType == 0)
         return TRUE;
     return FALSE;
 }
-#endif
 static
@@ -2280,6 +2277,7 @@
     ULONG NewPartitionCount;
     ULONG CurrentPartitionCount = 0;
     ULONG LayoutBufferSize;
+    ULONG i;
     DPRINT1("ReAllocateLayoutBuffer()\n");
@@ -2306,6 +2304,13 @@
         return FALSE;
     }
+    /* If the layout buffer grows, make sure the new (empty) entries are written to the
disk */
+    if (NewPartitionCount > CurrentPartitionCount)
+    {
+         for (i = CurrentPartitionCount; i < NewPartitionCount; i++)
+             NewLayoutBuffer->PartitionEntry[i].RewritePartition = TRUE;
+    }
+
     DiskEntry->LayoutBuffer = NewLayoutBuffer;
     DiskEntry->LayoutBuffer->PartitionCount = NewPartitionCount;
@@ -2319,6 +2324,7 @@
     IN PDISKENTRY DiskEntry)
 {
     PPARTITION_INFORMATION PartitionInfo;
+    PPARTITION_INFORMATION LinkInfo = NULL;
     PLIST_ENTRY ListEntry;
     PPARTENTRY PartEntry;
     ULONG Index;
@@ -2350,7 +2356,7 @@
                 PartitionInfo->StartingOffset.QuadPart =
PartEntry->StartSector.QuadPart * DiskEntry->BytesPerSector;
                 PartitionInfo->PartitionLength.QuadPart =
PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
-                PartitionInfo->HiddenSectors = PartEntry->StartSector.LowPart;
+                PartitionInfo->HiddenSectors =
(ULONG)PartEntry->StartSector.QuadPart;
                 PartitionInfo->PartitionNumber =
(!IsContainerPartition(PartEntry->PartitionType)) ? PartitionNumber : 0;
                 PartitionInfo->PartitionType = PartEntry->PartitionType;
                 PartitionInfo->BootIndicator = PartEntry->BootIndicator;
@@ -2395,6 +2401,22 @@
             PartEntry->PartitionNumber = PartitionNumber;
             PartEntry->PartitionIndex = Index;
+            /* Fill the link entry of the previous partition table */
+            if (LinkInfo != NULL)
+            {
+                LinkInfo->StartingOffset.QuadPart =
(PartEntry->StartSector.QuadPart - DiskEntry->SectorAlignment) *
DiskEntry->BytesPerSector;
+                LinkInfo->PartitionLength.QuadPart =
(PartEntry->StartSector.QuadPart + DiskEntry->SectorAlignment) *
DiskEntry->BytesPerSector;
+                LinkInfo->HiddenSectors = (ULONG)(PartEntry->StartSector.QuadPart -
DiskEntry->SectorAlignment - DiskEntry->ExtendedPartition->StartSector.QuadPart);
+                LinkInfo->PartitionNumber = 0;
+                LinkInfo->PartitionType = PARTITION_EXTENDED;
+                LinkInfo->BootIndicator = FALSE;
+                LinkInfo->RecognizedPartition = FALSE;
+                LinkInfo->RewritePartition = TRUE;
+            }
+
+            /* Save a pointer to the link entry of the current partition table */
+            LinkInfo = &DiskEntry->LayoutBuffer->PartitionEntry[Index + 1];
+
             PartitionNumber++;
             Index += 4;
         }
@@ -2402,26 +2424,52 @@
         ListEntry = ListEntry->Flink;
     }
-#if 0
-    for (;Index < 4; Index++)
-    {
+    /* Wipe unused primary partition table entries */
+    for (Index = GetPrimaryPartitionCount(DiskEntry); Index < 4; Index++)
+    {
+        DPRINT1("Primary partition entry %lu\n", Index);
+
         PartitionInfo = &DiskEntry->LayoutBuffer->PartitionEntry[Index];
         if (!IsEmptyLayoutEntry(PartitionInfo))
         {
-            DPRINT1("Wiping partition entry %lu\n", Index);
+            DPRINT1("Wiping primary partition entry %lu\n", Index);
             PartitionInfo->StartingOffset.QuadPart = 0;
             PartitionInfo->PartitionLength.QuadPart = 0;
             PartitionInfo->HiddenSectors = 0;
             PartitionInfo->PartitionNumber = 0;
-            PartitionInfo->PartitionType = 0;
+            PartitionInfo->PartitionType = PARTITION_ENTRY_UNUSED;
             PartitionInfo->BootIndicator = FALSE;
             PartitionInfo->RecognizedPartition = FALSE;
             PartitionInfo->RewritePartition = TRUE;
         }
     }
-#endif
+
+    /* Wipe unused logical partition table entries */
+    for (Index = 4; Index < DiskEntry->LayoutBuffer->PartitionCount; Index++)
+    {
+        if (Index % 4 >= 2)
+        {
+            DPRINT1("Logical partition entry %lu\n", Index);
+
+            PartitionInfo = &DiskEntry->LayoutBuffer->PartitionEntry[Index];
+
+            if (!IsEmptyLayoutEntry(PartitionInfo))
+            {
+                DPRINT1("Wiping partition entry %lu\n", Index);
+
+                PartitionInfo->StartingOffset.QuadPart = 0;
+                PartitionInfo->PartitionLength.QuadPart = 0;
+                PartitionInfo->HiddenSectors = 0;
+                PartitionInfo->PartitionNumber = 0;
+                PartitionInfo->PartitionType = PARTITION_ENTRY_UNUSED;
+                PartitionInfo->BootIndicator = FALSE;
+                PartitionInfo->RecognizedPartition = FALSE;
+                PartitionInfo->RewritePartition = TRUE;
+            }
+        }
+    }
 #ifdef DUMP_PARTITION_TABLE
     DumpPartitionTable(DiskEntry);