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()); }
public static List <DynamicVolume> GetDynamicDiskVolumes(DynamicDisk disk) { VolumeManagerDatabase database = VolumeManagerDatabase.ReadFromDisk(disk); List <DynamicDisk> disks = new List <DynamicDisk>(); disks.Add(disk); List <DynamicVolume> result = new List <DynamicVolume>(); if (database != null) { foreach (VolumeRecord volumeRecord in database.VolumeRecords) { DynamicVolume volume = GetVolume(disks, database, volumeRecord); if (volume != null) { foreach (DynamicDiskExtent extent in volume.Extents) { if (extent.DiskGuid == disk.DiskGuid) { result.Add(volume); break; } } } } } return(result); }
public static DynamicVolume GetVolume(List <DynamicDisk> disks, VolumeManagerDatabase database, VolumeRecord volumeRecord) { List <ComponentRecord> componentRecords = database.FindComponentsByVolumeID(volumeRecord.VolumeId); if (volumeRecord.NumberOfComponents != (ulong)componentRecords.Count || componentRecords.Count == 0) { // database record is invalid throw new InvalidDataException("Number of components in volume record does not match actual number of component records"); } if (componentRecords.Count == 1) { ComponentRecord componentRecord = componentRecords[0]; return(GetVolume(disks, database, volumeRecord, componentRecord)); } else // Mirrored volume { // Mirrored Simple Volume is the only kind of mirror suppored by Windows (only 2-way mirror is supported) // Veritas also supports Mirrored Stripe / Mirrored RAID-5 / Mirrored Spanned Volume (up to 32-way mirror is supported) List <DynamicVolume> volumes = new List <DynamicVolume>(); foreach (ComponentRecord componentRecord in componentRecords) { DynamicVolume volume = GetVolume(disks, database, volumeRecord, componentRecord); volumes.Add(volume); } MirroredVolume mirroredVolume = new MirroredVolume(volumes, volumeRecord.VolumeGuid, database.DiskGroupGuid); mirroredVolume.VolumeID = volumeRecord.VolumeId; mirroredVolume.Name = volumeRecord.Name; return(mirroredVolume); } }
private static DynamicVolume GetVolume(List <DynamicDisk> disks, VolumeManagerDatabase database, VolumeRecord volumeRecord, ComponentRecord componentRecord) { if (componentRecord.ExtentLayout == ExtentLayoutName.Concatenated) { if (componentRecord.NumberOfExtents == 1) { // Simple volume return(GetSimpleVolume(disks, database, componentRecord, volumeRecord));; } else { // spanned volume SpannedVolume volume = GetSpannedVolume(disks, database, componentRecord, volumeRecord); return(volume); } } else if (componentRecord.ExtentLayout == ExtentLayoutName.Stripe) { // striped volume StripedVolume volume = GetStripedVolume(disks, database, componentRecord, volumeRecord); return(volume); } else if (componentRecord.ExtentLayout == ExtentLayoutName.RAID5) { Raid5Volume volume = GetRAID5Volume(disks, database, componentRecord, volumeRecord); return(volume); } else { return(null); } }
public static void ListPhysicalDisks() { List <PhysicalDisk> disks = PhysicalDiskHelper.GetPhysicalDisks(); Console.WriteLine("Disk ## Size GPT Dyn DiskID Disk Group Name "); Console.WriteLine("------- ------- --- --- ------ ------------------"); foreach (PhysicalDisk disk in disks) { int index = disk.PhysicalDiskIndex; string diskNumber = index.ToString().PadLeft(2); MasterBootRecord mbr = MasterBootRecord.ReadFromDisk(disk); string isGPTStr = (mbr != null && mbr.IsGPTBasedDisk) ? " * " : " "; string isDynStr = DynamicDisk.IsDynamicDisk(disk) ? " * " : " "; string diskID = String.Empty; string diskGroupName = String.Empty; VolumeManagerDatabase database = VolumeManagerDatabase.ReadFromDisk(disk); if (database != null) { PrivateHeader privateHeader = PrivateHeader.ReadFromDisk(disk); DiskRecord diskRecord = database.FindDiskByDiskGuid(privateHeader.DiskGuid); diskID = diskRecord.DiskId.ToString(); diskGroupName = database.DiskGroupName; } diskID = diskID.PadLeft(6); Console.WriteLine("Disk {0} {1} {2} {3} {4} {5}", diskNumber, GetStandardSizeString(disk.Size), isGPTStr, isDynStr, diskID, diskGroupName); } }
public static string GetDiskInformation(Disk disk) { StringBuilder builder = new StringBuilder(); if (disk is PhysicalDisk) { PhysicalDisk physicalDisk = (PhysicalDisk)disk; builder.AppendLine(physicalDisk.Description); builder.AppendLine("S/N: " + physicalDisk.SerialNumber); builder.AppendLine(); } builder.AppendFormat("Size: {0} bytes\n", disk.Size.ToString("###,###,###,###,##0")); builder.AppendFormat("Bytes per sector (logical): {0}\n", disk.BytesPerSector); if (disk is PhysicalDisk) { PhysicalDisk physicalDisk = (PhysicalDisk)disk; builder.AppendFormat("Geometry: Cylinders: {0}, Heads: {1}, Sectors Per Track: {2}\n", physicalDisk.Cylinders, physicalDisk.TracksPerCylinder, physicalDisk.SectorsPerTrack); } else if (disk is DiskImage) { DiskImage diskImage = (DiskImage)disk; builder.AppendFormat("Disk image path: {0}\n", diskImage.Path); } builder.AppendLine(); MasterBootRecord mbr = MasterBootRecord.ReadFromDisk(disk); if (mbr != null) { builder.AppendFormat("Partitioning scheme: {0}\n", (mbr.IsGPTBasedDisk ? "GPT" : "MBR")); } DynamicDisk dynamicDisk = DynamicDisk.ReadFromDisk(disk); builder.AppendFormat("Disk type: {0}\n", ((dynamicDisk != null) ? "Dynamic Disk" : "Basic Disk")); if (dynamicDisk != null) { VolumeManagerDatabase database = VolumeManagerDatabase.ReadFromDisk(dynamicDisk); if (database != null) { DiskRecord diskRecord = database.FindDiskByDiskGuid(dynamicDisk.PrivateHeader.DiskGuid); if (diskRecord != null) { builder.AppendLine("Disk ID: " + diskRecord.DiskId); } } builder.AppendLine("Disk GUID: " + dynamicDisk.PrivateHeader.DiskGuid); builder.AppendLine("Disk Group GUID: " + dynamicDisk.PrivateHeader.DiskGroupGuidString); builder.AppendLine(); builder.AppendLine("Public region start sector: " + dynamicDisk.PrivateHeader.PublicRegionStartLBA); builder.AppendLine("Public region size (sectors): " + dynamicDisk.PrivateHeader.PublicRegionSizeLBA); builder.AppendLine(); builder.AppendLine("Private region start sector: " + dynamicDisk.PrivateHeader.PrivateRegionStartLBA); builder.AppendLine("Private region size (sectors): " + dynamicDisk.PrivateHeader.PrivateRegionSizeLBA); } return(builder.ToString()); }
private static SpannedVolume GetSpannedVolume(List <DynamicDisk> disks, VolumeManagerDatabase database, ComponentRecord componentRecord, VolumeRecord volumeRecord) { List <DynamicColumn> columns = GetDynamicVolumeColumns(disks, database, componentRecord, volumeRecord); SpannedVolume volume = new SpannedVolume(columns[0], volumeRecord.VolumeGuid, database.DiskGroupGuid); volume.VolumeID = volumeRecord.VolumeId; volume.Name = volumeRecord.Name; volume.DiskGroupName = database.DiskGroupName; return(volume); }
private static Raid5Volume GetRAID5Volume(List <DynamicDisk> disks, VolumeManagerDatabase database, ComponentRecord componentRecord, VolumeRecord volumeRecord) { List <DynamicColumn> columns = GetDynamicVolumeColumns(disks, database, componentRecord, volumeRecord); Raid5Volume volume = new Raid5Volume(columns, (int)componentRecord.StripeSizeLBA, volumeRecord.VolumeGuid, database.DiskGroupGuid); volume.VolumeID = volumeRecord.VolumeId; volume.Name = volumeRecord.Name; volume.DiskGroupName = database.DiskGroupName; return(volume); }
/// <summary> /// Sorted by first sector /// </summary> /// <returns>null if there was a problem reading extent information from disk</returns> public static List <DynamicDiskExtent> GetDiskExtents(DynamicDisk disk) { List <DynamicDiskExtent> result = new List <DynamicDiskExtent>(); PrivateHeader privateHeader = disk.PrivateHeader; if (privateHeader != null) { VolumeManagerDatabase database = VolumeManagerDatabase.ReadFromDisk(disk); if (database != null) { DiskRecord diskRecord = database.FindDiskByDiskGuid(privateHeader.DiskGuid); List <ExtentRecord> extentRecords = database.FindExtentsByDiskID(diskRecord.DiskId); foreach (ExtentRecord extentRecord in extentRecords) { DynamicDiskExtent extent = GetDiskExtent(disk, extentRecord); result.Add(extent); } SortExtentsByFirstSector(result); return(result); } } return(null); }
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"); } }
private static List <DynamicColumn> GetDynamicVolumeColumns(List <DynamicDisk> disks, VolumeManagerDatabase database, ComponentRecord componentRecord, VolumeRecord volumeRecord) { // extentRecords are sorted by offset in column List <ExtentRecord> extentRecords = database.FindExtentsByComponentID(componentRecord.ComponentId); if (componentRecord.NumberOfExtents != extentRecords.Count || extentRecords.Count == 0) { // database record is invalid throw new InvalidDataException("Number of extents in component record does not match actual number of extent records"); } SortedList <uint, List <DynamicDiskExtent> > columns = new SortedList <uint, List <DynamicDiskExtent> >(); foreach (ExtentRecord extentRecord in extentRecords) { DiskRecord diskRecord = database.FindDiskByDiskID(extentRecord.DiskId); DynamicDisk disk = DynamicDiskHelper.FindDisk(disks, diskRecord.DiskGuid); // we add nulls as well DynamicDiskExtent extent = DynamicDiskExtentHelper.GetDiskExtent(disk, extentRecord); if (columns.ContainsKey(extentRecord.ColumnIndex)) { columns[extentRecord.ColumnIndex].Add(extent); } else { List <DynamicDiskExtent> list = new List <DynamicDiskExtent>(); list.Add(extent); columns.Add(extentRecord.ColumnIndex, list); } } List <DynamicColumn> result = new List <DynamicColumn>(); foreach (List <DynamicDiskExtent> extents in columns.Values) { result.Add(new DynamicColumn(extents)); } return(result); }
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"); } }