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);
            }
        }
Example #2
0
        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);
        }