@@ -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(
16041618static
16051619BOOLEAN
16061620IsEmptyLayoutEntry (
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(
16191633static
16201634BOOLEAN
16211635IsSamePrimaryLayoutEntry (
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
16811695ReAllocateLayoutBuffer (
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
17331747UpdateDiskLayout (
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