public static string GetExtentsInformation(DynamicVolume volume) { List <DynamicDiskExtent> extents = volume.DynamicExtents; StringBuilder builder = new StringBuilder(); for (int extentIndex = 0; extentIndex < extents.Count; extentIndex++) { DynamicDiskExtent extent = extents[extentIndex]; string extentOffsetString; string diskIDString = String.Empty; if (extent.Disk != null) { long extentOffset = extent.FirstSector * extent.Disk.BytesPerSector; extentOffsetString = FormattingHelper.GetStandardSizeString(extentOffset); VolumeManagerDatabase database = VolumeManagerDatabase.ReadFromDisk(extent.Disk); if (database != null) { ExtentRecord extentRecord = database.FindExtentByExtentID(extent.ExtentID); if (extentRecord != null) { diskIDString = extentRecord.DiskId.ToString(); } } } else { extentOffsetString = "N/A"; } string extentSizeString = FormattingHelper.GetStandardSizeString(extent.Size); builder.AppendFormat("Extent {0}, ID: {1}, Name: {2}, Size: {3}, Disk ID: {4}, Offset: {5}, Start Sector: {6}\n", extentIndex, extent.ExtentID, extent.Name, extentSizeString, diskIDString, extentOffsetString, extent.FirstSector); } return(builder.ToString()); }
/// <summary> /// Support null disks /// </summary> public static ulong GetExtentStartSector(DynamicDisk disk, ExtentRecord extentRecord) { ulong dataStartLBA = 0; if (disk != null) { PrivateHeader privateHeader = disk.PrivateHeader; dataStartLBA = privateHeader.PublicRegionStartLBA; } ulong extentStartSector = dataStartLBA + extentRecord.DiskOffsetLBA; return(extentStartSector); }
/// <summary> /// Support null disks /// </summary> public static DynamicDiskExtent GetDiskExtent(DynamicDisk dynamicDisk, ExtentRecord extentRecord) { ulong extentStartSector = GetExtentStartSector(dynamicDisk, extentRecord); int bytesPerSector = 512; // default for missing disk Disk disk = null; Guid diskGuid = Guid.Empty; if (dynamicDisk != null) { bytesPerSector = dynamicDisk.BytesPerSector; disk = dynamicDisk.Disk; diskGuid = dynamicDisk.DiskGuid; } DynamicDiskExtent extent = new DynamicDiskExtent(disk, (long)extentStartSector, (long)extentRecord.SizeLBA * bytesPerSector, extentRecord.ExtentId); extent.Name = extentRecord.Name; extent.DiskGuid = diskGuid; return(extent); }
private static SimpleVolume GetSimpleVolume(List <DynamicDisk> disks, VolumeManagerDatabase database, ComponentRecord componentRecord, VolumeRecord volumeRecord) { List <ExtentRecord> extentRecords = database.FindExtentsByComponentID(componentRecord.ComponentId); if (extentRecords.Count == 1) { ExtentRecord extentRecord = extentRecords[0]; DiskRecord diskRecord = database.FindDiskByDiskID(extentRecord.DiskId); DynamicDisk disk = DynamicDiskHelper.FindDisk(disks, diskRecord.DiskGuid); // we add nulls as well DynamicDiskExtent extent = DynamicDiskExtentHelper.GetDiskExtent(disk, extentRecord); SimpleVolume volume = new SimpleVolume(extent, volumeRecord.VolumeGuid, database.DiskGroupGuid); volume.VolumeID = volumeRecord.VolumeId; volume.Name = volumeRecord.Name; volume.DiskGroupName = database.DiskGroupName; return(volume); } else { // component / extent records are invalid throw new InvalidDataException("Number of extents in component record does not match actual number of extent records"); } }
public static void ListExtents() { if (m_selectedVolume != null) { Console.WriteLine("Extent ## ID Name Size DiskID Offset Start Sector"); Console.WriteLine("--------- ---- --------- ------- ------ ------- ------------"); for (int index = 0; index < m_selectedVolume.Extents.Count; index++) { DiskExtent extent = m_selectedVolume.Extents[index]; string extentNumber = index.ToString().PadLeft(2); ulong extentID = 0; ulong diskID = 0; string name = String.Empty; if (extent is DynamicDiskExtent) { extentID = ((DynamicDiskExtent)extent).ExtentID; name = ((DynamicDiskExtent)extent).Name; if (extent.Disk != null) { VolumeManagerDatabase database = VolumeManagerDatabase.ReadFromDisk(extent.Disk); if (database != null) { ExtentRecord extentRecord = database.FindExtentByExtentID(extentID); diskID = extentRecord.DiskId; } } } string offsetString; if (extent.Disk != null) { long offset = extent.FirstSector * extent.Disk.BytesPerSector; offsetString = GetStandardSizeString(offset); } else { offsetString = " N/A"; } long size = extent.Size; name = name.ToString().PadRight(9); string extentIDString = String.Empty; if (extentID != 0) { extentIDString = extentID.ToString(); } extentIDString = extentIDString.PadLeft(4); string diskIDString = String.Empty; if (diskID != 0) { diskIDString = diskID.ToString(); } diskIDString = diskIDString.PadLeft(6); string startSector = extent.FirstSector.ToString().PadLeft(12); Console.WriteLine("Extent {0} {1} {2} {3} {4} {5} {6}", extentNumber, extentIDString, name, GetStandardSizeString(size), diskIDString, offsetString, startSector); } } else { Console.WriteLine("No volume has been selected"); } }