public static bool IsDynamicDisk(Disk disk) { MasterBootRecord mbr = MasterBootRecord.ReadFromDisk(disk); if (mbr != null) { if (mbr.PartitionTable[0].PartitionType == (byte)PartitionTypeName.DynamicData) { return(true); } else if (mbr.IsGPTBasedDisk) { List <GuidPartitionEntry> entries = GuidPartitionTable.ReadEntriesFromDisk(disk); if (entries != null) { if (GuidPartitionEntryCollection.ContainsPartitionTypeGuid(entries, GPTPartition.PrivateRegionPartitionTypeGuid) && GuidPartitionEntryCollection.ContainsPartitionTypeGuid(entries, GPTPartition.PublicRegionPartitionTypeGuid)) { return(true); } } } return(false); } else { // if the disk has no master boot record, it can be a dynamic disk if it has a valid PrivateHeader at sector 6 PrivateHeader privateHeader = PrivateHeader.ReadFromDiskStart(disk); return(privateHeader != null); } }
public static PrivateHeader ReadFromGPTBasedDisk(Disk disk) { List <GuidPartitionEntry> entries = GuidPartitionTable.ReadEntriesFromDisk(disk); int index = GuidPartitionEntryCollection.GetIndexOfPartitionTypeGuid(entries, GPTPartition.PrivateRegionPartitionTypeGuid); // the private header will be located at the last sector of the private region PrivateHeader privateHeader = PrivateHeader.ReadFromDisk(disk, (long)entries[index].LastLBA, true); if (privateHeader != null) { if (privateHeader.IsChecksumValid) { return(privateHeader); } else { // primary has invalid checksum, try secondary private header long sectorIndex = (long)(privateHeader.PrivateRegionStartLBA + privateHeader.SecondaryPrivateHeaderLBA); return(ReadFromDisk(disk, sectorIndex, false)); } } return(null); }