123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- using System;
- using System.Collections.Generic;
- using System.Text;
- using Utilities;
- namespace DiskAccessLibrary
- {
- public class BasicDiskHelper
- {
-
-
-
-
-
- public const int MBRDiskFirstUsableSector = 64;
- public static List<Partition> GetPartitions(Disk disk)
- {
- List<Partition> result = new List<Partition>();
- MasterBootRecord mbr = MasterBootRecord.ReadFromDisk(disk);
- if (mbr != null)
- {
- if (!mbr.IsGPTBasedDisk)
- {
- for (int index = 0; index < mbr.PartitionTable.Length; index++)
- {
- PartitionTableEntry entry = mbr.PartitionTable[index];
- if (entry.SectorCountLBA > 0)
- {
- long size = entry.SectorCountLBA * disk.BytesPerSector;
- MBRPartition partition = new MBRPartition(entry.PartitionType, disk, entry.FirstSectorLBA, size);
- result.Add(partition);
- }
- }
- }
- else
- {
- List<GuidPartitionEntry> entries = GuidPartitionTable.ReadEntriesFromDisk(disk);
- if (entries != null)
- {
- foreach (GuidPartitionEntry entry in entries)
- {
- GPTPartition partition = new GPTPartition(entry.PartitionGuid, entry.PartitionTypeGuid, entry.PartitionName, disk, (long)entry.FirstLBA, (long)(entry.SizeLBA * (uint)disk.BytesPerSector));
- result.Add(partition);
- }
- }
- }
- }
- return result;
- }
- public static Partition GetPartitionByStartOffset(Disk disk, long firstSector)
- {
- List<Partition> partitions = BasicDiskHelper.GetPartitions(disk);
- foreach (Partition partition in partitions)
- {
- if (partition.FirstSector == firstSector)
- {
- return partition;
- }
- }
- return null;
- }
- public static List<DiskExtent> GetUnallocatedExtents(Disk disk)
- {
- MasterBootRecord mbr = MasterBootRecord.ReadFromDisk(disk);
- List<DiskExtent> result = new List<DiskExtent>();
- if (mbr == null)
- {
- result.Add(new DiskExtent(disk, 0, disk.Size));
- return result;
- }
- else
- {
- long dataRegionStartSector;
- long dataRegionSize;
- if (!mbr.IsGPTBasedDisk)
- {
- dataRegionStartSector = MBRDiskFirstUsableSector;
- dataRegionSize = Math.Min(disk.Size, UInt32.MaxValue * disk.BytesPerSector) - dataRegionStartSector;
- }
- else
- {
- GuidPartitionTableHeader gptHeader = GuidPartitionTableHeader.ReadFromDisk(disk);
- dataRegionStartSector = (long)gptHeader.FirstUsableLBA;
- dataRegionSize = (long)(gptHeader.LastUsableLBA - gptHeader.FirstUsableLBA + 1) * disk.BytesPerSector;
- }
- List<Partition> partitions = GetPartitions(disk);
- List<DiskExtent> usedExtents = new List<DiskExtent>();
- foreach (Partition partition in partitions)
- {
- usedExtents.Add(partition.Extent);
- }
- return DiskExtentsHelper.GetUnallocatedExtents(disk, dataRegionStartSector, dataRegionSize, usedExtents);
- }
- }
- }
- }
|