private static void WriteParentLocations(DiskImageFileInfo info) { Console.Write(" Parent Locations: "); bool first = true; foreach (var entry in info.ParentLocatorEntries) { if (!first) { Console.WriteLine(" "); } first = false; Console.WriteLine("{0} -> {1}", entry.Key, entry.Value); } if (first) { Console.WriteLine(); } }
protected override void DoRun() { using (DiskImageFile vhdxFile = new DiskImageFile(_vhdxFile.Value, FileAccess.Read)) { DiskImageFileInfo info = vhdxFile.Information; FileInfo fileInfo = new FileInfo(_vhdxFile.Value); Console.WriteLine("File Info"); Console.WriteLine("---------"); Console.WriteLine(" File Name: {0}", fileInfo.FullName); Console.WriteLine(" File Size: {0} ({1} bytes)", Utilities.ApproximateDiskSize(fileInfo.Length), fileInfo.Length); Console.WriteLine(" File Creation Time: {0} (UTC)", fileInfo.CreationTimeUtc); Console.WriteLine(" File Write Time: {0} (UTC)", fileInfo.LastWriteTimeUtc); Console.WriteLine(); Console.WriteLine("VHDX File Info"); Console.WriteLine("--------------"); Console.WriteLine(" Signature: {0:x8}", info.Signature); Console.WriteLine(" Creator: {0:x8}", info.Creator); Console.WriteLine(" Block Size: {0} (0x{0:X8})", info.BlockSize); Console.WriteLine("Leave Blocks Alloced: {0}", info.LeaveBlocksAllocated); Console.WriteLine(" Has Parent: {0}", info.HasParent); Console.WriteLine(" Disk Size: {0} ({1} (0x{1:X8}))", Utilities.ApproximateDiskSize(info.DiskSize), info.DiskSize); Console.WriteLine(" Logical Sector Size: {0} (0x{0:X8})", info.LogicalSectorSize); Console.WriteLine("Physical Sector Size: {0} (0x{0:X8})", info.PhysicalSectorSize); Console.WriteLine(" Parent Locator Type: {0}", info.ParentLocatorType); WriteParentLocations(info); Console.WriteLine(); WriteHeaderInfo(info.FirstHeader); WriteHeaderInfo(info.SecondHeader); if (info.ActiveHeader.LogGuid != Guid.Empty) { Console.WriteLine("Log Info (Active Sequence)"); Console.WriteLine("--------------------------"); foreach (var entry in info.ActiveLogSequence) { Console.WriteLine(" Log Entry"); Console.WriteLine(" ---------"); Console.WriteLine(" Sequence Number: {0}", entry.SequenceNumber); Console.WriteLine(" Tail: {0}", entry.Tail); Console.WriteLine(" Flushed File Offset: {0} (0x{0:X8})", entry.FlushedFileOffset); Console.WriteLine(" Last File Offset: {0} (0x{0:X8})", entry.LastFileOffset); Console.WriteLine(" File Extents: {0}", entry.IsEmpty ? "<none>" : ""); foreach (var extent in entry.ModifiedExtents) { Console.WriteLine(" {0} +{1} (0x{0:X8} +0x{1:X8})", extent.Offset, extent.Count); } Console.WriteLine(); } } RegionTableInfo regionTable = info.RegionTable; Console.WriteLine("Region Table Info"); Console.WriteLine("-----------------"); Console.WriteLine(" Signature: {0}", regionTable.Signature); Console.WriteLine(" Checksum: {0:x8}", regionTable.Checksum); Console.WriteLine(" Entry Count: {0}", regionTable.Count); Console.WriteLine(); foreach (var entry in regionTable) { Console.WriteLine("Region Table Entry Info"); Console.WriteLine("-----------------------"); Console.WriteLine(" Guid: {0}", entry.Guid); Console.WriteLine(" Well-Known Name: {0}", entry.WellKnownName); Console.WriteLine(" File Offset: {0} (0x{0:X8})", entry.FileOffset); Console.WriteLine(" Length: {0} (0x{0:X8})", entry.Length); Console.WriteLine(" Is Required: {0}", entry.IsRequired); Console.WriteLine(); } MetadataTableInfo metadataTable = info.MetadataTable; Console.WriteLine("Metadata Table Info"); Console.WriteLine("-------------------"); Console.WriteLine(" Signature: {0}", metadataTable.Signature); Console.WriteLine(" Entry Count: {0}", metadataTable.Count); Console.WriteLine(); foreach (var entry in metadataTable) { Console.WriteLine("Metadata Table Entry Info"); Console.WriteLine("-------------------------"); Console.WriteLine(" Item Id: {0}", entry.ItemId); Console.WriteLine(" Well-Known Name: {0}", entry.WellKnownName); Console.WriteLine(" Offset: {0} (0x{0:X8})", entry.Offset); Console.WriteLine(" Length: {0} (0x{0:X8})", entry.Length); Console.WriteLine(" Is User: {0}", entry.IsUser); Console.WriteLine(" Is Required: {0}", entry.IsRequired); Console.WriteLine(" Is Virtual Disk: {0}", entry.IsVirtualDisk); Console.WriteLine(); } } }
protected override void DoRun() { if (!_dontCheck.IsPresent) { using (Stream s = new FileStream(_vhdFile.Value, FileMode.Open, FileAccess.Read)) { FileChecker vhdChecker = new FileChecker(s); if (!vhdChecker.Check(Console.Out, ReportLevels.All)) { Console.WriteLine("Aborting: Invalid VHD file"); Environment.Exit(1); } } } using (DiskImageFile vhdFile = new DiskImageFile(_vhdFile.Value, FileAccess.Read)) { DiskImageFileInfo info = vhdFile.Information; FileInfo fileInfo = new FileInfo(_vhdFile.Value); Console.WriteLine("File Info"); Console.WriteLine("---------"); Console.WriteLine(" File Name: {0}", fileInfo.FullName); Console.WriteLine(" File Size: {0} bytes", fileInfo.Length); Console.WriteLine(" File Creation Time: {0} (UTC)", fileInfo.CreationTimeUtc); Console.WriteLine(" File Write Time: {0} (UTC)", fileInfo.LastWriteTimeUtc); Console.WriteLine(); Console.WriteLine("Common Disk Info"); Console.WriteLine("-----------------"); Console.WriteLine(" Cookie: {0:x8}", info.Cookie); Console.WriteLine(" Features: {0:x8}", info.Features); Console.WriteLine(" File Format Version: {0}.{1}", ((info.FileFormatVersion >> 16) & 0xFFFF), (info.FileFormatVersion & 0xFFFF)); Console.WriteLine(" Creation Time: {0} (UTC)", info.CreationTimestamp); Console.WriteLine(" Creator App: {0:x8}", info.CreatorApp); Console.WriteLine(" Creator Version: {0}.{1}", ((info.CreatorVersion >> 16) & 0xFFFF), (info.CreatorVersion & 0xFFFF)); Console.WriteLine(" Creator Host OS: {0}", info.CreatorHostOS); Console.WriteLine(" Original Size: {0} bytes", info.OriginalSize); Console.WriteLine(" Current Size: {0} bytes", info.CurrentSize); Console.WriteLine(" Geometry (C/H/S): {0}", info.Geometry); Console.WriteLine(" Disk Type: {0}", info.DiskType); Console.WriteLine(" Checksum: {0:x8}", info.FooterChecksum); Console.WriteLine(" Unique Id: {0}", info.UniqueId); Console.WriteLine(" Saved State: {0}", info.SavedState); Console.WriteLine(); if (info.DiskType == FileType.Differencing || info.DiskType == FileType.Dynamic) { Console.WriteLine(); Console.WriteLine("Dynamic Disk Info"); Console.WriteLine("-----------------"); Console.WriteLine(" Cookie: {0}", info.DynamicCookie); Console.WriteLine(" Header Version: {0}.{1}", ((info.DynamicHeaderVersion >> 16) & 0xFFFF), (info.DynamicHeaderVersion & 0xFFFF)); Console.WriteLine(" Block Count: {0}", info.DynamicBlockCount); Console.WriteLine(" Block Size: {0} bytes", info.DynamicBlockSize); Console.WriteLine(" Checksum: {0:x8}", info.DynamicChecksum); Console.WriteLine(" Parent Unique Id: {0}", info.DynamicParentUniqueId); Console.WriteLine(" Parent Write Time: {0} (UTC)", info.DynamicParentTimestamp); Console.WriteLine(" Parent Name: {0}", info.DynamicParentUnicodeName); Console.Write(" Parent Locations: "); foreach (string parentLocation in info.DynamicParentLocators) { Console.Write("{0}\n ", parentLocation); } Console.WriteLine(); } } }