Skip to content

Commit c197e7c

Browse files
committed
[DISKPART] Prepare for GPT support
- Use DRIVE_LAYOUT_INFORMATION_EX instead of DRIVE_LAYOUT_INFORMATION. - Show GPT disks in the 'list disk' command.
1 parent 0ec4dc2 commit c197e7c

File tree

7 files changed

+105
-54
lines changed

7 files changed

+105
-54
lines changed

base/system/diskpart/clean.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,13 @@ clean_main(
9999
CurrentDisk->ExtendedPartition = NULL;
100100
CurrentDisk->Dirty = FALSE;
101101
CurrentDisk->NewDisk = TRUE;
102-
CurrentDisk->NoMbr = TRUE;
102+
CurrentDisk->PartitionStyle = PARTITION_STYLE_RAW;
103103

104104
/* Wipe the layout buffer */
105105
RtlFreeHeap(RtlGetProcessHeap(), 0, CurrentDisk->LayoutBuffer);
106106

107-
LayoutBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) +
108-
((4 - ANYSIZE_ARRAY) * sizeof(PARTITION_INFORMATION));
107+
LayoutBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
108+
((4 - ANYSIZE_ARRAY) * sizeof(PARTITION_INFORMATION_EX));
109109
CurrentDisk->LayoutBuffer = RtlAllocateHeap(RtlGetProcessHeap(),
110110
HEAP_ZERO_MEMORY,
111111
LayoutBufferSize);
@@ -115,6 +115,8 @@ clean_main(
115115
return TRUE;
116116
}
117117

118+
CurrentDisk->LayoutBuffer->PartitionStyle = PARTITION_STYLE_RAW;
119+
118120
/* Allocate a 1MB sectors buffer */
119121
SectorsBuffer = RtlAllocateHeap(RtlGetProcessHeap(),
120122
HEAP_ZERO_MEMORY,

base/system/diskpart/create.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ CreateExtendedPartition(
3535
return TRUE;
3636
}
3737

38+
if (CurrentDisk->PartitionStyle == PARTITION_STYLE_GPT)
39+
{
40+
ConPuts(StdOut, L"GPT Partitions are not supported yet!\n");
41+
return TRUE;
42+
}
43+
else if (CurrentDisk->PartitionStyle == PARTITION_STYLE_RAW)
44+
{
45+
/* FIXME: Initialize disk properly! */
46+
CurrentDisk->PartitionStyle == PARTITION_STYLE_MBR;
47+
}
48+
3849
for (i = 3; i < argc; i++)
3950
{
4051
if (HasPrefix(argv[i], L"size=", &pszSuffix))
@@ -215,6 +226,12 @@ CreateLogicalPartition(
215226
return TRUE;
216227
}
217228

229+
if (CurrentDisk->PartitionStyle != PARTITION_STYLE_MBR)
230+
{
231+
ConPuts(StdOut, L"Invalid partition style!\n");
232+
return TRUE;
233+
}
234+
218235
for (i = 3; i < argc; i++)
219236
{
220237
if (HasPrefix(argv[i], L"size=", &pszSuffix))
@@ -415,6 +432,17 @@ CreatePrimaryPartition(
415432
return TRUE;
416433
}
417434

435+
if (CurrentDisk->PartitionStyle == PARTITION_STYLE_GPT)
436+
{
437+
ConPuts(StdOut, L"GPT Partitions are not supported yet!\n");
438+
return TRUE;
439+
}
440+
else if (CurrentDisk->PartitionStyle == PARTITION_STYLE_RAW)
441+
{
442+
/* FIXME: Initialize disk properly! */
443+
CurrentDisk->PartitionStyle == PARTITION_STYLE_MBR;
444+
}
445+
418446
for (i = 3; i < argc; i++)
419447
{
420448
if (HasPrefix(argv[i], L"size=", &pszSuffix))

base/system/diskpart/detail.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ DetailDisk(
8989

9090
/* TODO: Print more disk details */
9191
ConPuts(StdOut, L"\n");
92-
ConResPrintf(StdOut, IDS_DETAIL_INFO_DISK_ID, CurrentDisk->LayoutBuffer->Signature);
92+
ConResPrintf(StdOut, IDS_DETAIL_INFO_DISK_ID, CurrentDisk->LayoutBuffer->Mbr.Signature);
9393
ConResPrintf(StdOut, IDS_DETAIL_INFO_PATH, CurrentDisk->PathId);
9494
ConResPrintf(StdOut, IDS_DETAIL_INFO_TARGET, CurrentDisk->TargetId);
9595
ConResPrintf(StdOut, IDS_DETAIL_INFO_LUN_ID, CurrentDisk->Lun);

base/system/diskpart/diskpart.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,11 @@ typedef struct _DISKENTRY
173173
BOOLEAN Dirty;
174174

175175
BOOLEAN NewDisk;
176-
BOOLEAN NoMbr; /* MBR is absent */
176+
DWORD PartitionStyle;
177177

178178
UNICODE_STRING DriverName;
179179

180-
PDRIVE_LAYOUT_INFORMATION LayoutBuffer;
180+
PDRIVE_LAYOUT_INFORMATION_EX LayoutBuffer;
181181

182182
PPARTENTRY ExtendedPartition;
183183

base/system/diskpart/list.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ PrintDisk(
5151
FreeSize,
5252
lpFreeUnit,
5353
L" ",
54-
L" ");
54+
(DiskEntry->PartitionStyle == PARTITION_STYLE_GPT) ? L"*" : L" ");
5555
}
5656

5757

base/system/diskpart/partlist.c

Lines changed: 66 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -404,12 +404,12 @@ AddPartitionToDisk(
404404
ULONG PartitionIndex,
405405
BOOLEAN LogicalPartition)
406406
{
407-
PPARTITION_INFORMATION PartitionInfo;
407+
PPARTITION_INFORMATION_EX PartitionInfo;
408408
PPARTENTRY PartEntry;
409409

410410
PartitionInfo = &DiskEntry->LayoutBuffer->PartitionEntry[PartitionIndex];
411-
if (PartitionInfo->PartitionType == 0 ||
412-
(LogicalPartition == TRUE && IsContainerPartition(PartitionInfo->PartitionType)))
411+
if (PartitionInfo->Mbr.PartitionType == 0 ||
412+
(LogicalPartition == TRUE && IsContainerPartition(PartitionInfo->Mbr.PartitionType)))
413413
return;
414414

415415
PartEntry = RtlAllocateHeap(RtlGetProcessHeap(),
@@ -425,8 +425,8 @@ AddPartitionToDisk(
425425
PartEntry->StartSector.QuadPart = (ULONGLONG)PartitionInfo->StartingOffset.QuadPart / DiskEntry->BytesPerSector;
426426
PartEntry->SectorCount.QuadPart = (ULONGLONG)PartitionInfo->PartitionLength.QuadPart / DiskEntry->BytesPerSector;
427427

428-
PartEntry->BootIndicator = PartitionInfo->BootIndicator;
429-
PartEntry->PartitionType = PartitionInfo->PartitionType;
428+
PartEntry->BootIndicator = PartitionInfo->Mbr.BootIndicator;
429+
PartEntry->PartitionType = PartitionInfo->Mbr.PartitionType;
430430

431431
PartEntry->LogicalPartition = LogicalPartition;
432432
PartEntry->IsPartitioned = TRUE;
@@ -782,7 +782,7 @@ AddDiskToList(
782782
PLIST_ENTRY ListEntry;
783783
PBIOSDISKENTRY BiosDiskEntry;
784784
ULONG LayoutBufferSize;
785-
PDRIVE_LAYOUT_INFORMATION NewLayoutBuffer;
785+
PDRIVE_LAYOUT_INFORMATION_EX NewLayoutBuffer;
786786

787787
Status = NtDeviceIoControlFile(FileHandle,
788788
NULL,
@@ -871,11 +871,25 @@ AddDiskToList(
871871
// DiskEntry->Signature = Signature;
872872
DiskEntry->BiosFound = FALSE;
873873

874-
/* Check if this disk has a valid MBR */
874+
/* Check the disk partition style */
875875
if (Mbr->Magic != MBR_MAGIC)
876-
DiskEntry->NoMbr = TRUE;
876+
{
877+
DPRINT("Partition style: RAW\n");
878+
DiskEntry->PartitionStyle = PARTITION_STYLE_RAW;
879+
}
877880
else
878-
DiskEntry->NoMbr = FALSE;
881+
{
882+
if (Mbr->Partition[0].PartitionType == PARTITION_GPT)
883+
{
884+
DPRINT("Partition style: GPT\n");
885+
DiskEntry->PartitionStyle = PARTITION_STYLE_GPT;
886+
}
887+
else
888+
{
889+
DPRINT("Partition style: MBR\n");
890+
DiskEntry->PartitionStyle = PARTITION_STYLE_MBR;
891+
}
892+
}
879893

880894
/* Free Mbr sector buffer */
881895
RtlFreeHeap(RtlGetProcessHeap(), 0, Mbr);
@@ -954,8 +968,8 @@ AddDiskToList(
954968
InsertAscendingList(&DiskListHead, DiskEntry, DISKENTRY, ListEntry, DiskNumber);
955969

956970
/* Allocate a layout buffer with 4 partition entries first */
957-
LayoutBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) +
958-
((4 - ANYSIZE_ARRAY) * sizeof(PARTITION_INFORMATION));
971+
LayoutBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
972+
((4 - ANYSIZE_ARRAY) * sizeof(PARTITION_INFORMATION_EX));
959973
DiskEntry->LayoutBuffer = RtlAllocateHeap(RtlGetProcessHeap(),
960974
HEAP_ZERO_MEMORY,
961975
LayoutBufferSize);
@@ -973,7 +987,7 @@ AddDiskToList(
973987
NULL,
974988
NULL,
975989
&Iosb,
976-
IOCTL_DISK_GET_DRIVE_LAYOUT,
990+
IOCTL_DISK_GET_DRIVE_LAYOUT_EX,
977991
NULL,
978992
0,
979993
DiskEntry->LayoutBuffer,
@@ -987,7 +1001,7 @@ AddDiskToList(
9871001
return;
9881002
}
9891003

990-
LayoutBufferSize += 4 * sizeof(PARTITION_INFORMATION);
1004+
LayoutBufferSize += 4 * sizeof(PARTITION_INFORMATION_EX);
9911005
NewLayoutBuffer = RtlReAllocateHeap(RtlGetProcessHeap(),
9921006
HEAP_ZERO_MEMORY,
9931007
DiskEntry->LayoutBuffer,
@@ -1009,7 +1023,7 @@ AddDiskToList(
10091023

10101024
if (DiskEntry->LayoutBuffer->PartitionEntry[0].StartingOffset.QuadPart != 0 &&
10111025
DiskEntry->LayoutBuffer->PartitionEntry[0].PartitionLength.QuadPart != 0 &&
1012-
DiskEntry->LayoutBuffer->PartitionEntry[0].PartitionType != 0)
1026+
DiskEntry->LayoutBuffer->PartitionEntry[0].Mbr.PartitionType != 0)
10131027
{
10141028
if ((DiskEntry->LayoutBuffer->PartitionEntry[0].StartingOffset.QuadPart / DiskEntry->BytesPerSector) % DiskEntry->SectorsPerTrack == 0)
10151029
{
@@ -1487,7 +1501,7 @@ WritePartitions(
14871501
HANDLE FileHandle;
14881502
IO_STATUS_BLOCK Iosb;
14891503
ULONG BufferSize;
1490-
PPARTITION_INFORMATION PartitionInfo;
1504+
PPARTITION_INFORMATION_EX PartitionInfo;
14911505
ULONG PartitionCount;
14921506
PLIST_ENTRY ListEntry;
14931507
PPARTENTRY PartEntry;
@@ -1532,14 +1546,14 @@ WritePartitions(
15321546
PartitionCount = DiskEntry->LayoutBuffer->PartitionCount;
15331547

15341548
/* Set the new disk layout and retrieve its updated version with possibly modified partition numbers */
1535-
BufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) +
1536-
((PartitionCount - 1) * sizeof(PARTITION_INFORMATION));
1549+
BufferSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
1550+
((PartitionCount - 1) * sizeof(PARTITION_INFORMATION_EX));
15371551
Status = NtDeviceIoControlFile(FileHandle,
15381552
NULL,
15391553
NULL,
15401554
NULL,
15411555
&Iosb,
1542-
IOCTL_DISK_SET_DRIVE_LAYOUT,
1556+
IOCTL_DISK_SET_DRIVE_LAYOUT_EX,
15431557
DiskEntry->LayoutBuffer,
15441558
BufferSize,
15451559
DiskEntry->LayoutBuffer,
@@ -1604,7 +1618,7 @@ WritePartitions(
16041618
static
16051619
BOOLEAN
16061620
IsEmptyLayoutEntry(
1607-
IN PPARTITION_INFORMATION PartitionInfo)
1621+
IN PPARTITION_INFORMATION_EX PartitionInfo)
16081622
{
16091623
if (PartitionInfo->StartingOffset.QuadPart == 0 &&
16101624
PartitionInfo->PartitionLength.QuadPart == 0)
@@ -1619,7 +1633,7 @@ IsEmptyLayoutEntry(
16191633
static
16201634
BOOLEAN
16211635
IsSamePrimaryLayoutEntry(
1622-
IN PPARTITION_INFORMATION PartitionInfo,
1636+
IN PPARTITION_INFORMATION_EX PartitionInfo,
16231637
IN PDISKENTRY DiskEntry,
16241638
IN PPARTENTRY PartEntry)
16251639
{
@@ -1681,7 +1695,7 @@ BOOLEAN
16811695
ReAllocateLayoutBuffer(
16821696
_In_ PDISKENTRY DiskEntry)
16831697
{
1684-
PDRIVE_LAYOUT_INFORMATION NewLayoutBuffer;
1698+
PDRIVE_LAYOUT_INFORMATION_EX NewLayoutBuffer;
16851699
ULONG NewPartitionCount;
16861700
ULONG CurrentPartitionCount = 0;
16871701
ULONG LayoutBufferSize;
@@ -1700,8 +1714,8 @@ ReAllocateLayoutBuffer(
17001714
if (CurrentPartitionCount == NewPartitionCount)
17011715
return TRUE;
17021716

1703-
LayoutBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) +
1704-
((NewPartitionCount - ANYSIZE_ARRAY) * sizeof(PARTITION_INFORMATION));
1717+
LayoutBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
1718+
((NewPartitionCount - ANYSIZE_ARRAY) * sizeof(PARTITION_INFORMATION_EX));
17051719
NewLayoutBuffer = RtlReAllocateHeap(RtlGetProcessHeap(),
17061720
HEAP_ZERO_MEMORY,
17071721
DiskEntry->LayoutBuffer,
@@ -1733,8 +1747,8 @@ VOID
17331747
UpdateDiskLayout(
17341748
_In_ PDISKENTRY DiskEntry)
17351749
{
1736-
PPARTITION_INFORMATION PartitionInfo;
1737-
PPARTITION_INFORMATION LinkInfo = NULL;
1750+
PPARTITION_INFORMATION_EX PartitionInfo;
1751+
PPARTITION_INFORMATION_EX LinkInfo = NULL;
17381752
PLIST_ENTRY ListEntry;
17391753
PPARTENTRY PartEntry;
17401754
LARGE_INTEGER HiddenSectors64;
@@ -1750,6 +1764,8 @@ UpdateDiskLayout(
17501764
return;
17511765
}
17521766

1767+
DiskEntry->LayoutBuffer->PartitionStyle = PARTITION_STYLE_MBR;
1768+
17531769
/* Update the primary partition table */
17541770
Index = 0;
17551771
for (ListEntry = DiskEntry->PrimaryPartListHead.Flink;
@@ -1775,13 +1791,14 @@ UpdateDiskLayout(
17751791
{
17761792
DPRINT1("Updating primary partition entry %lu\n", Index);
17771793

1794+
PartitionInfo->PartitionStyle = PARTITION_STYLE_MBR;
17781795
PartitionInfo->StartingOffset.QuadPart = PartEntry->StartSector.QuadPart * DiskEntry->BytesPerSector;
17791796
PartitionInfo->PartitionLength.QuadPart = PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
1780-
PartitionInfo->HiddenSectors = PartEntry->StartSector.LowPart;
1797+
PartitionInfo->Mbr.HiddenSectors = PartEntry->StartSector.LowPart;
17811798
PartitionInfo->PartitionNumber = PartEntry->PartitionNumber;
1782-
PartitionInfo->PartitionType = PartEntry->PartitionType;
1783-
PartitionInfo->BootIndicator = PartEntry->BootIndicator;
1784-
PartitionInfo->RecognizedPartition = IsRecognizedPartition(PartEntry->PartitionType);
1799+
PartitionInfo->Mbr.PartitionType = PartEntry->PartitionType;
1800+
PartitionInfo->Mbr.BootIndicator = PartEntry->BootIndicator;
1801+
PartitionInfo->Mbr.RecognizedPartition = IsRecognizedPartition(PartEntry->PartitionType);
17851802
PartitionInfo->RewritePartition = TRUE;
17861803
}
17871804

@@ -1817,26 +1834,28 @@ UpdateDiskLayout(
18171834

18181835
DPRINT1("Updating logical partition entry %lu\n", Index);
18191836

1837+
PartitionInfo->PartitionStyle = PARTITION_STYLE_MBR;
18201838
PartitionInfo->StartingOffset.QuadPart = PartEntry->StartSector.QuadPart * DiskEntry->BytesPerSector;
18211839
PartitionInfo->PartitionLength.QuadPart = PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
1822-
PartitionInfo->HiddenSectors = DiskEntry->SectorAlignment;
1840+
PartitionInfo->Mbr.HiddenSectors = DiskEntry->SectorAlignment;
18231841
PartitionInfo->PartitionNumber = PartEntry->PartitionNumber;
1824-
PartitionInfo->PartitionType = PartEntry->PartitionType;
1825-
PartitionInfo->BootIndicator = FALSE;
1826-
PartitionInfo->RecognizedPartition = IsRecognizedPartition(PartEntry->PartitionType);
1842+
PartitionInfo->Mbr.PartitionType = PartEntry->PartitionType;
1843+
PartitionInfo->Mbr.BootIndicator = FALSE;
1844+
PartitionInfo->Mbr.RecognizedPartition = IsRecognizedPartition(PartEntry->PartitionType);
18271845
PartitionInfo->RewritePartition = TRUE;
18281846

18291847
/* Fill the link entry of the previous partition entry */
18301848
if (LinkInfo != NULL)
18311849
{
1850+
LinkInfo->PartitionStyle = PARTITION_STYLE_MBR;
18321851
LinkInfo->StartingOffset.QuadPart = (PartEntry->StartSector.QuadPart - DiskEntry->SectorAlignment) * DiskEntry->BytesPerSector;
18331852
LinkInfo->PartitionLength.QuadPart = (PartEntry->StartSector.QuadPart + DiskEntry->SectorAlignment) * DiskEntry->BytesPerSector;
18341853
HiddenSectors64.QuadPart = PartEntry->StartSector.QuadPart - DiskEntry->SectorAlignment - DiskEntry->ExtendedPartition->StartSector.QuadPart;
1835-
LinkInfo->HiddenSectors = HiddenSectors64.LowPart;
1854+
LinkInfo->Mbr.HiddenSectors = HiddenSectors64.LowPart;
18361855
LinkInfo->PartitionNumber = 0;
1837-
LinkInfo->PartitionType = PARTITION_EXTENDED;
1838-
LinkInfo->BootIndicator = FALSE;
1839-
LinkInfo->RecognizedPartition = FALSE;
1856+
LinkInfo->Mbr.PartitionType = PARTITION_EXTENDED;
1857+
LinkInfo->Mbr.BootIndicator = FALSE;
1858+
LinkInfo->Mbr.RecognizedPartition = FALSE;
18401859
LinkInfo->RewritePartition = TRUE;
18411860
}
18421861

@@ -1859,13 +1878,14 @@ UpdateDiskLayout(
18591878
{
18601879
DPRINT1("Wiping primary partition entry %lu\n", Index);
18611880

1881+
PartitionInfo->PartitionStyle = PARTITION_STYLE_MBR;
18621882
PartitionInfo->StartingOffset.QuadPart = 0;
18631883
PartitionInfo->PartitionLength.QuadPart = 0;
1864-
PartitionInfo->HiddenSectors = 0;
1884+
PartitionInfo->Mbr.HiddenSectors = 0;
18651885
PartitionInfo->PartitionNumber = 0;
1866-
PartitionInfo->PartitionType = PARTITION_ENTRY_UNUSED;
1867-
PartitionInfo->BootIndicator = FALSE;
1868-
PartitionInfo->RecognizedPartition = FALSE;
1886+
PartitionInfo->Mbr.PartitionType = PARTITION_ENTRY_UNUSED;
1887+
PartitionInfo->Mbr.BootIndicator = FALSE;
1888+
PartitionInfo->Mbr.RecognizedPartition = FALSE;
18691889
PartitionInfo->RewritePartition = TRUE;
18701890
}
18711891
}
@@ -1883,13 +1903,14 @@ UpdateDiskLayout(
18831903
{
18841904
DPRINT1("Wiping partition entry %lu\n", Index);
18851905

1906+
PartitionInfo->PartitionStyle = PARTITION_STYLE_MBR;
18861907
PartitionInfo->StartingOffset.QuadPart = 0;
18871908
PartitionInfo->PartitionLength.QuadPart = 0;
1888-
PartitionInfo->HiddenSectors = 0;
1909+
PartitionInfo->Mbr.HiddenSectors = 0;
18891910
PartitionInfo->PartitionNumber = 0;
1890-
PartitionInfo->PartitionType = PARTITION_ENTRY_UNUSED;
1891-
PartitionInfo->BootIndicator = FALSE;
1892-
PartitionInfo->RecognizedPartition = FALSE;
1911+
PartitionInfo->Mbr.PartitionType = PARTITION_ENTRY_UNUSED;
1912+
PartitionInfo->Mbr.BootIndicator = FALSE;
1913+
PartitionInfo->Mbr.RecognizedPartition = FALSE;
18931914
PartitionInfo->RewritePartition = TRUE;
18941915
}
18951916
}

0 commit comments

Comments
 (0)