|
- DiscImageChef version
+ DiscImageChef version
+
has been used times.
|
@@ -106,6 +109,7 @@
entropy command has been run times
extract-files command has been run times
formats command has been run times
+ image-info command has been run times
list-devices command has been run times
list-encodings command has been run times
ls command has been run times
diff --git a/DiscImageChef.Server/Statistics.aspx.cs b/DiscImageChef.Server/Statistics.aspx.cs
index 0952253d9..0d272b199 100644
--- a/DiscImageChef.Server/Statistics.aspx.cs
+++ b/DiscImageChef.Server/Statistics.aspx.cs
@@ -51,13 +51,13 @@ namespace DiscImageChef.Server
///
public partial class Statistics : Page
{
- List devices;
+ List devices;
List operatingSystems;
- List realMedia;
+ List realMedia;
- Stats statistics;
+ Stats statistics;
List versions;
- List virtualMedia;
+ List virtualMedia;
protected void Page_Load(object sender, EventArgs e)
{
@@ -68,19 +68,19 @@ namespace DiscImageChef.Server
if(!File.Exists(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(),
"Statistics", "Statistics.xml")))
{
-#if DEBUG
+ #if DEBUG
content.InnerHtml =
$"Sorry, cannot load data file \"{Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Statistics", "Statistics.xml")}\"";
-#else
+ #else
content.InnerHtml = "Sorry, cannot load data file";
-#endif
+ #endif
return;
}
statistics = new Stats();
XmlSerializer xs = new XmlSerializer(statistics.GetType());
- FileStream fs =
+ FileStream fs =
WaitForFile(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Statistics", "Statistics.xml"),
FileMode.Open, FileAccess.Read, FileShare.Read);
statistics = (Stats)xs.Deserialize(fs);
@@ -117,26 +117,27 @@ namespace DiscImageChef.Server
if(statistics.Commands != null)
{
- lblAnalyze.Text = statistics.Commands.Analyze.ToString();
- lblCompare.Text = statistics.Commands.Compare.ToString();
- lblChecksum.Text = statistics.Commands.Checksum.ToString();
- lblEntropy.Text = statistics.Commands.Entropy.ToString();
- lblVerify.Text = statistics.Commands.Verify.ToString();
- lblPrintHex.Text = statistics.Commands.PrintHex.ToString();
- lblDecode.Text = statistics.Commands.Decode.ToString();
- lblDeviceInfo.Text = statistics.Commands.DeviceInfo.ToString();
- lblMediaInfo.Text = statistics.Commands.MediaInfo.ToString();
- lblMediaScan.Text = statistics.Commands.MediaScan.ToString();
- lblFormats.Text = statistics.Commands.Formats.ToString();
- lblBenchmark.Text = statistics.Commands.Benchmark.ToString();
+ lblAnalyze.Text = statistics.Commands.Analyze.ToString();
+ lblCompare.Text = statistics.Commands.Compare.ToString();
+ lblChecksum.Text = statistics.Commands.Checksum.ToString();
+ lblEntropy.Text = statistics.Commands.Entropy.ToString();
+ lblVerify.Text = statistics.Commands.Verify.ToString();
+ lblPrintHex.Text = statistics.Commands.PrintHex.ToString();
+ lblDecode.Text = statistics.Commands.Decode.ToString();
+ lblDeviceInfo.Text = statistics.Commands.DeviceInfo.ToString();
+ lblMediaInfo.Text = statistics.Commands.MediaInfo.ToString();
+ lblMediaScan.Text = statistics.Commands.MediaScan.ToString();
+ lblFormats.Text = statistics.Commands.Formats.ToString();
+ lblBenchmark.Text = statistics.Commands.Benchmark.ToString();
lblCreateSidecar.Text = statistics.Commands.CreateSidecar.ToString();
- lblDumpMedia.Text = statistics.Commands.DumpMedia.ToString();
- lblDeviceReport.Text = statistics.Commands.DeviceReport.ToString();
- lblLs.Text = statistics.Commands.Ls.ToString();
- lblExtractFiles.Text = statistics.Commands.ExtractFiles.ToString();
- lblListDevices.Text = statistics.Commands.ListDevices.ToString();
+ lblDumpMedia.Text = statistics.Commands.DumpMedia.ToString();
+ lblDeviceReport.Text = statistics.Commands.DeviceReport.ToString();
+ lblLs.Text = statistics.Commands.Ls.ToString();
+ lblExtractFiles.Text = statistics.Commands.ExtractFiles.ToString();
+ lblListDevices.Text = statistics.Commands.ListDevices.ToString();
lblListEncodings.Text = statistics.Commands.ListEncodings.ToString();
- lblConvertImage.Text = statistics.Commands.ConvertImage.ToString();
+ lblConvertImage.Text = statistics.Commands.ConvertImage.ToString();
+ lblImageInfo.Text = statistics.Commands.ImageInfo.ToString();
}
else divCommands.Visible = false;
@@ -170,16 +171,16 @@ namespace DiscImageChef.Server
if(statistics.Medias != null)
{
- realMedia = new List();
+ realMedia = new List();
virtualMedia = new List();
foreach(MediaStats nvs in statistics.Medias)
{
MediaType
- .MediaTypeToString((CommonTypes.MediaType)Enum.Parse(typeof(CommonTypes.MediaType), nvs.type),
- out string type, out string subtype);
+ .MediaTypeToString((CommonTypes.MediaType)Enum.Parse(typeof(CommonTypes.MediaType), nvs.type),
+ out string type, out string subtype);
if(nvs.real) realMedia.Add(new MediaItem {Type = type, SubType = subtype, Count = nvs.Value});
- else virtualMedia.Add(new MediaItem {Type = type, SubType = subtype, Count = nvs.Value});
+ else virtualMedia.Add(new MediaItem {Type = type, SubType = subtype, Count = nvs.Value});
}
if(realMedia.Count > 0)
@@ -200,7 +201,7 @@ namespace DiscImageChef.Server
}
else
{
- divRealMedia.Visible = false;
+ divRealMedia.Visible = false;
divVirtualMedia.Visible = false;
}
@@ -212,29 +213,30 @@ namespace DiscImageChef.Server
string url;
string xmlFile;
if(!string.IsNullOrWhiteSpace(device.Manufacturer) &&
- !string.IsNullOrWhiteSpace(device.Model) && !string.IsNullOrWhiteSpace(device.Revision))
+ !string.IsNullOrWhiteSpace(device.Model) &&
+ !string.IsNullOrWhiteSpace(device.Revision))
{
xmlFile = device.Manufacturer + "_" + device.Model + "_" + device.Revision + ".xml";
- url =
+ url =
$"ViewReport.aspx?manufacturer={HttpUtility.UrlPathEncode(device.Manufacturer)}&model={HttpUtility.UrlPathEncode(device.Model)}&revision={HttpUtility.UrlPathEncode(device.Revision)}";
}
else if(!string.IsNullOrWhiteSpace(device.Manufacturer) &&
!string.IsNullOrWhiteSpace(device.Model))
{
xmlFile = device.Manufacturer + "_" + device.Model + ".xml";
- url =
+ url =
$"ViewReport.aspx?manufacturer={HttpUtility.UrlPathEncode(device.Manufacturer)}&model={HttpUtility.UrlPathEncode(device.Model)}";
}
else if(!string.IsNullOrWhiteSpace(device.Model) && !string.IsNullOrWhiteSpace(device.Revision))
{
xmlFile = device.Model + "_" + device.Revision + ".xml";
- url =
+ url =
$"ViewReport.aspx?model={HttpUtility.UrlPathEncode(device.Model)}&revision={HttpUtility.UrlPathEncode(device.Revision)}";
}
else
{
xmlFile = device.Model + ".xml";
- url = $"ViewReport.aspx?model={HttpUtility.UrlPathEncode(device.Model)}";
+ url = $"ViewReport.aspx?model={HttpUtility.UrlPathEncode(device.Model)}";
}
xmlFile = xmlFile.Replace('/', '_').Replace('\\', '_').Replace('?', '_');
@@ -244,10 +246,10 @@ namespace DiscImageChef.Server
devices.Add(new DeviceItem
{
Manufacturer = device.Manufacturer,
- Model = device.Model,
- Revision = device.Revision,
- Bus = device.Bus,
- ReportLink = url == null ? "No" : $"Yes"
+ Model = device.Model,
+ Revision = device.Revision,
+ Bus = device.Bus,
+ ReportLink = url == null ? "No" : $"Yes"
});
}
@@ -261,9 +263,9 @@ namespace DiscImageChef.Server
catch(Exception)
{
content.InnerHtml = "Could not load statistics";
-#if DEBUG
+ #if DEBUG
throw;
-#endif
+ #endif
}
}
@@ -289,18 +291,18 @@ namespace DiscImageChef.Server
class MediaItem
{
- public string Type { get; set; }
+ public string Type { get; set; }
public string SubType { get; set; }
- public long Count { get; set; }
+ public long Count { get; set; }
}
class DeviceItem
{
public string Manufacturer { get; set; }
- public string Model { get; set; }
- public string Revision { get; set; }
- public string Bus { get; set; }
- public string ReportLink { get; set; }
+ public string Model { get; set; }
+ public string Revision { get; set; }
+ public string Bus { get; set; }
+ public string ReportLink { get; set; }
}
}
}
\ No newline at end of file
diff --git a/DiscImageChef.Server/Statistics.aspx.designer.cs b/DiscImageChef.Server/Statistics.aspx.designer.cs
index 7aa64165d..b87616b3e 100644
--- a/DiscImageChef.Server/Statistics.aspx.designer.cs
+++ b/DiscImageChef.Server/Statistics.aspx.designer.cs
@@ -56,7 +56,9 @@ namespace DiscImageChef.Server {
protected Label lblExtractFiles;
- protected Label lblFormats;
+ protected Label lblFormats;
+
+ protected Label lblImageInfo;
protected Label lblListDevices;
diff --git a/DiscImageChef/Commands/Analyze.cs b/DiscImageChef/Commands/Analyze.cs
index 61e5d85cc..70c871b03 100644
--- a/DiscImageChef/Commands/Analyze.cs
+++ b/DiscImageChef/Commands/Analyze.cs
@@ -51,6 +51,7 @@ namespace DiscImageChef.Commands
DicConsole.DebugWriteLine("Analyze command", "--input={0}", options.InputFile);
DicConsole.DebugWriteLine("Analyze command", "--filesystems={0}", options.SearchForFilesystems);
DicConsole.DebugWriteLine("Analyze command", "--partitions={0}", options.SearchForPartitions);
+ DicConsole.DebugWriteLine("Analyze command", "--encoding={0}", options.EncodingName);
FiltersList filtersList = new FiltersList();
IFilter inputFilter = filtersList.GetFilter(options.InputFile);
@@ -93,6 +94,7 @@ namespace DiscImageChef.Commands
DicConsole.VerboseWriteLine("Image format identified by {0} ({1}).", imageFormat.Name,
imageFormat.Id);
else DicConsole.WriteLine("Image format identified by {0}.", imageFormat.Name);
+ DicConsole.WriteLine();
try
{
@@ -103,12 +105,11 @@ namespace DiscImageChef.Commands
return;
}
- DicConsole.DebugWriteLine("Analyze command", "Correctly opened image file.");
- DicConsole.DebugWriteLine("Analyze command", "Image without headers is {0} bytes.",
- imageFormat.Info.ImageSize);
- DicConsole.DebugWriteLine("Analyze command", "Image has {0} sectors.", imageFormat.Info.Sectors);
- DicConsole.DebugWriteLine("Analyze command", "Image identifies disk type as {0}.",
- imageFormat.Info.MediaType);
+ if(options.Verbose)
+ {
+ Core.ImageInfo.PrintImageInfo(imageFormat);
+ DicConsole.WriteLine();
+ }
Core.Statistics.AddMediaFormat(imageFormat.Format);
Core.Statistics.AddMedia(imageFormat.Info.MediaType, false);
diff --git a/DiscImageChef/Commands/Compare.cs b/DiscImageChef/Commands/Compare.cs
index c47de930e..2c17dfc35 100644
--- a/DiscImageChef/Commands/Compare.cs
+++ b/DiscImageChef/Commands/Compare.cs
@@ -44,15 +44,15 @@ namespace DiscImageChef.Commands
{
internal static void DoCompare(CompareOptions options)
{
- DicConsole.DebugWriteLine("Compare command", "--debug={0}", options.Debug);
+ DicConsole.DebugWriteLine("Compare command", "--debug={0}", options.Debug);
DicConsole.DebugWriteLine("Compare command", "--verbose={0}", options.Verbose);
- DicConsole.DebugWriteLine("Compare command", "--input1={0}", options.InputFile1);
- DicConsole.DebugWriteLine("Compare command", "--input2={0}", options.InputFile2);
+ DicConsole.DebugWriteLine("Compare command", "--input1={0}", options.InputFile1);
+ DicConsole.DebugWriteLine("Compare command", "--input2={0}", options.InputFile2);
- FiltersList filtersList = new FiltersList();
- IFilter inputFilter1 = filtersList.GetFilter(options.InputFile1);
- filtersList = new FiltersList();
- IFilter inputFilter2 = filtersList.GetFilter(options.InputFile2);
+ FiltersList filtersList = new FiltersList();
+ IFilter inputFilter1 = filtersList.GetFilter(options.InputFile1);
+ filtersList = new FiltersList();
+ IFilter inputFilter2 = filtersList.GetFilter(options.InputFile2);
if(inputFilter1 == null)
{
@@ -107,8 +107,8 @@ namespace DiscImageChef.Commands
{
sb.AppendLine("\tDisc image 1\tDisc image 2");
sb.AppendLine("================================");
- sb.AppendFormat("File\t{0}\t{1}", options.InputFile1, options.InputFile2).AppendLine();
- sb.AppendFormat("Disc image format\t{0}\t{1}", input1Format.Name, input2Format.Name).AppendLine();
+ sb.AppendFormat("File\t{0}\t{1}", options.InputFile1, options.InputFile2).AppendLine();
+ sb.AppendFormat("Disc image format\t{0}\t{1}", input1Format.Name, input2Format.Name).AppendLine();
}
else
{
@@ -118,45 +118,45 @@ namespace DiscImageChef.Commands
bool imagesDiffer = false;
- ImageInfo image1Info = new ImageInfo();
- ImageInfo image2Info = new ImageInfo();
- List image1Sessions = new List();
- List image2Sessions = new List();
+ DiscImages.ImageInfo image1Info = new DiscImages.ImageInfo();
+ DiscImages.ImageInfo image2Info = new DiscImages.ImageInfo();
+ List image1Sessions = new List();
+ List image2Sessions = new List();
Dictionary image1DiskTags = new Dictionary();
Dictionary image2DiskTags = new Dictionary();
image1Info.HasPartitions = input1Format.Info.HasPartitions;
-#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
+ #pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
try { image1Sessions = input1Format.Sessions; }
catch
{
// ignored
}
-#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
- image1Info.HasSessions |= image1Sessions.Count > 0;
- image1Info.ImageSize = input1Format.Info.ImageSize;
- image1Info.Sectors = input1Format.Info.Sectors;
- image1Info.SectorSize = input1Format.Info.SectorSize;
- image1Info.CreationTime = input1Format.Info.CreationTime;
- image1Info.LastModificationTime = input1Format.Info.LastModificationTime;
- image1Info.MediaType = input1Format.Info.MediaType;
- image1Info.Version = input1Format.Info.Version;
- image1Info.Application = input1Format.Info.Application;
- image1Info.ApplicationVersion = input1Format.Info.ApplicationVersion;
- image1Info.Creator = input1Format.Info.Creator;
- image1Info.MediaTitle = input1Format.Info.MediaTitle;
- image1Info.Comments = input1Format.Info.Comments;
- image1Info.MediaManufacturer = input1Format.Info.MediaManufacturer;
- image1Info.MediaModel = input1Format.Info.MediaModel;
- image1Info.MediaSerialNumber = input1Format.Info.MediaSerialNumber;
- image1Info.MediaBarcode = input1Format.Info.MediaBarcode;
- image1Info.MediaPartNumber = input1Format.Info.MediaPartNumber;
- image1Info.MediaSequence = input1Format.Info.MediaSequence;
- image1Info.LastMediaSequence = input1Format.Info.LastMediaSequence;
- image1Info.DriveManufacturer = input1Format.Info.DriveManufacturer;
- image1Info.DriveModel = input1Format.Info.DriveModel;
- image1Info.DriveSerialNumber = input1Format.Info.DriveSerialNumber;
- image1Info.DriveFirmwareRevision = input1Format.Info.DriveFirmwareRevision;
+ #pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
+ image1Info.HasSessions |= image1Sessions.Count > 0;
+ image1Info.ImageSize = input1Format.Info.ImageSize;
+ image1Info.Sectors = input1Format.Info.Sectors;
+ image1Info.SectorSize = input1Format.Info.SectorSize;
+ image1Info.CreationTime = input1Format.Info.CreationTime;
+ image1Info.LastModificationTime = input1Format.Info.LastModificationTime;
+ image1Info.MediaType = input1Format.Info.MediaType;
+ image1Info.Version = input1Format.Info.Version;
+ image1Info.Application = input1Format.Info.Application;
+ image1Info.ApplicationVersion = input1Format.Info.ApplicationVersion;
+ image1Info.Creator = input1Format.Info.Creator;
+ image1Info.MediaTitle = input1Format.Info.MediaTitle;
+ image1Info.Comments = input1Format.Info.Comments;
+ image1Info.MediaManufacturer = input1Format.Info.MediaManufacturer;
+ image1Info.MediaModel = input1Format.Info.MediaModel;
+ image1Info.MediaSerialNumber = input1Format.Info.MediaSerialNumber;
+ image1Info.MediaBarcode = input1Format.Info.MediaBarcode;
+ image1Info.MediaPartNumber = input1Format.Info.MediaPartNumber;
+ image1Info.MediaSequence = input1Format.Info.MediaSequence;
+ image1Info.LastMediaSequence = input1Format.Info.LastMediaSequence;
+ image1Info.DriveManufacturer = input1Format.Info.DriveManufacturer;
+ image1Info.DriveModel = input1Format.Info.DriveModel;
+ image1Info.DriveSerialNumber = input1Format.Info.DriveSerialNumber;
+ image1Info.DriveFirmwareRevision = input1Format.Info.DriveFirmwareRevision;
foreach(MediaTagType disktag in Enum.GetValues(typeof(MediaTagType)))
{
try
@@ -164,46 +164,46 @@ namespace DiscImageChef.Commands
byte[] temparray = input1Format.ReadDiskTag(disktag);
image1DiskTags.Add(disktag, temparray);
}
-#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
+ #pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
catch
{
// ignored
}
-#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
+ #pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
}
image2Info.HasPartitions = input2Format.Info.HasPartitions;
-#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
+ #pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
try { image2Sessions = input2Format.Sessions; }
catch
{
// ignored
}
-#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
- image2Info.HasSessions |= image2Sessions.Count > 0;
- image2Info.ImageSize = input2Format.Info.ImageSize;
- image2Info.Sectors = input2Format.Info.Sectors;
- image2Info.SectorSize = input2Format.Info.SectorSize;
- image2Info.CreationTime = input2Format.Info.CreationTime;
- image2Info.LastModificationTime = input2Format.Info.LastModificationTime;
- image2Info.MediaType = input2Format.Info.MediaType;
- image2Info.Version = input2Format.Info.Version;
- image2Info.Application = input2Format.Info.Application;
- image2Info.ApplicationVersion = input2Format.Info.ApplicationVersion;
- image2Info.Creator = input2Format.Info.Creator;
- image2Info.MediaTitle = input2Format.Info.MediaTitle;
- image2Info.Comments = input2Format.Info.Comments;
- image2Info.MediaManufacturer = input2Format.Info.MediaManufacturer;
- image2Info.MediaModel = input2Format.Info.MediaModel;
- image2Info.MediaSerialNumber = input2Format.Info.MediaSerialNumber;
- image2Info.MediaBarcode = input2Format.Info.MediaBarcode;
- image2Info.MediaPartNumber = input2Format.Info.MediaPartNumber;
- image2Info.MediaSequence = input2Format.Info.MediaSequence;
- image2Info.LastMediaSequence = input2Format.Info.LastMediaSequence;
- image2Info.DriveManufacturer = input2Format.Info.DriveManufacturer;
- image2Info.DriveModel = input2Format.Info.DriveModel;
- image2Info.DriveSerialNumber = input2Format.Info.DriveSerialNumber;
- image2Info.DriveFirmwareRevision = input2Format.Info.DriveFirmwareRevision;
+ #pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
+ image2Info.HasSessions |= image2Sessions.Count > 0;
+ image2Info.ImageSize = input2Format.Info.ImageSize;
+ image2Info.Sectors = input2Format.Info.Sectors;
+ image2Info.SectorSize = input2Format.Info.SectorSize;
+ image2Info.CreationTime = input2Format.Info.CreationTime;
+ image2Info.LastModificationTime = input2Format.Info.LastModificationTime;
+ image2Info.MediaType = input2Format.Info.MediaType;
+ image2Info.Version = input2Format.Info.Version;
+ image2Info.Application = input2Format.Info.Application;
+ image2Info.ApplicationVersion = input2Format.Info.ApplicationVersion;
+ image2Info.Creator = input2Format.Info.Creator;
+ image2Info.MediaTitle = input2Format.Info.MediaTitle;
+ image2Info.Comments = input2Format.Info.Comments;
+ image2Info.MediaManufacturer = input2Format.Info.MediaManufacturer;
+ image2Info.MediaModel = input2Format.Info.MediaModel;
+ image2Info.MediaSerialNumber = input2Format.Info.MediaSerialNumber;
+ image2Info.MediaBarcode = input2Format.Info.MediaBarcode;
+ image2Info.MediaPartNumber = input2Format.Info.MediaPartNumber;
+ image2Info.MediaSequence = input2Format.Info.MediaSequence;
+ image2Info.LastMediaSequence = input2Format.Info.LastMediaSequence;
+ image2Info.DriveManufacturer = input2Format.Info.DriveManufacturer;
+ image2Info.DriveModel = input2Format.Info.DriveModel;
+ image2Info.DriveSerialNumber = input2Format.Info.DriveSerialNumber;
+ image2Info.DriveFirmwareRevision = input2Format.Info.DriveFirmwareRevision;
foreach(MediaTagType disktag in Enum.GetValues(typeof(MediaTagType)))
{
try
@@ -211,39 +211,37 @@ namespace DiscImageChef.Commands
byte[] temparray = input2Format.ReadDiskTag(disktag);
image2DiskTags.Add(disktag, temparray);
}
-#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
+ #pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
catch
{
// ignored
}
-#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
+ #pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
}
if(options.Verbose)
{
- sb.AppendFormat("Has partitions?\t{0}\t{1}", image1Info.HasPartitions,
- image2Info.HasPartitions).AppendLine();
+ sb.AppendFormat("Has partitions?\t{0}\t{1}", image1Info.HasPartitions, image2Info.HasPartitions)
+ .AppendLine();
sb.AppendFormat("Has sessions?\t{0}\t{1}", image1Info.HasSessions, image2Info.HasSessions)
.AppendLine();
- sb.AppendFormat("Image size\t{0}\t{1}", image1Info.ImageSize, image2Info.ImageSize).AppendLine();
- sb.AppendFormat("Sectors\t{0}\t{1}", image1Info.Sectors, image2Info.Sectors).AppendLine();
- sb.AppendFormat("Sector size\t{0}\t{1}", image1Info.SectorSize, image2Info.SectorSize).AppendLine();
+ sb.AppendFormat("Image size\t{0}\t{1}", image1Info.ImageSize, image2Info.ImageSize).AppendLine();
+ sb.AppendFormat("Sectors\t{0}\t{1}", image1Info.Sectors, image2Info.Sectors).AppendLine();
+ sb.AppendFormat("Sector size\t{0}\t{1}", image1Info.SectorSize, image2Info.SectorSize).AppendLine();
sb.AppendFormat("Creation time\t{0}\t{1}", image1Info.CreationTime, image2Info.CreationTime)
.AppendLine();
sb.AppendFormat("Last modification time\t{0}\t{1}", image1Info.LastModificationTime,
image2Info.LastModificationTime).AppendLine();
- sb.AppendFormat("Disk type\t{0}\t{1}", image1Info.MediaType, image2Info.MediaType).AppendLine();
- sb.AppendFormat("Image version\t{0}\t{1}", image1Info.Version, image2Info.Version)
+ sb.AppendFormat("Disk type\t{0}\t{1}", image1Info.MediaType, image2Info.MediaType)
.AppendLine();
+ sb.AppendFormat("Image version\t{0}\t{1}", image1Info.Version, image2Info.Version).AppendLine();
sb.AppendFormat("Image application\t{0}\t{1}", image1Info.Application, image2Info.Application)
.AppendLine();
sb.AppendFormat("Image application version\t{0}\t{1}", image1Info.ApplicationVersion,
image2Info.ApplicationVersion).AppendLine();
- sb.AppendFormat("Image creator\t{0}\t{1}", image1Info.Creator, image2Info.Creator)
- .AppendLine();
- sb.AppendFormat("Image name\t{0}\t{1}", image1Info.MediaTitle, image2Info.MediaTitle).AppendLine();
- sb.AppendFormat("Image comments\t{0}\t{1}", image1Info.Comments, image2Info.Comments)
- .AppendLine();
+ sb.AppendFormat("Image creator\t{0}\t{1}", image1Info.Creator, image2Info.Creator).AppendLine();
+ sb.AppendFormat("Image name\t{0}\t{1}", image1Info.MediaTitle, image2Info.MediaTitle).AppendLine();
+ sb.AppendFormat("Image comments\t{0}\t{1}", image1Info.Comments, image2Info.Comments).AppendLine();
sb.AppendFormat("Disk manufacturer\t{0}\t{1}", image1Info.MediaManufacturer,
image2Info.MediaManufacturer).AppendLine();
sb.AppendFormat("Disk model\t{0}\t{1}", image1Info.MediaModel, image2Info.MediaModel).AppendLine();
@@ -276,121 +274,145 @@ namespace DiscImageChef.Commands
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image partitioned status differ");
}
+
if(image1Info.HasSessions != image2Info.HasSessions)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image session status differ");
}
+
if(image1Info.ImageSize != image2Info.ImageSize)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image size differ");
}
+
if(image1Info.Sectors != image2Info.Sectors)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image sectors differ");
}
+
if(image1Info.SectorSize != image2Info.SectorSize)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image sector size differ");
}
+
if(image1Info.CreationTime != image2Info.CreationTime)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image creation time differ");
}
+
if(image1Info.LastModificationTime != image2Info.LastModificationTime)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image last modification time differ");
}
+
if(image1Info.MediaType != image2Info.MediaType)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Disk type differ");
}
+
if(image1Info.Version != image2Info.Version)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image version differ");
}
+
if(image1Info.Application != image2Info.Application)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image application differ");
}
+
if(image1Info.ApplicationVersion != image2Info.ApplicationVersion)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image application version differ");
}
+
if(image1Info.Creator != image2Info.Creator)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image creator differ");
}
+
if(image1Info.MediaTitle != image2Info.MediaTitle)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image name differ");
}
+
if(image1Info.Comments != image2Info.Comments)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Image comments differ");
}
+
if(image1Info.MediaManufacturer != image2Info.MediaManufacturer)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Disk manufacturer differ");
}
+
if(image1Info.MediaModel != image2Info.MediaModel)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Disk model differ");
}
+
if(image1Info.MediaSerialNumber != image2Info.MediaSerialNumber)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Disk serial number differ");
}
+
if(image1Info.MediaBarcode != image2Info.MediaBarcode)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Disk barcode differ");
}
+
if(image1Info.MediaPartNumber != image2Info.MediaPartNumber)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Disk part number differ");
}
+
if(image1Info.MediaSequence != image2Info.MediaSequence)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Disk sequence differ");
}
+
if(image1Info.LastMediaSequence != image2Info.LastMediaSequence)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Last disk in sequence differ");
}
+
if(image1Info.DriveManufacturer != image2Info.DriveManufacturer)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Drive manufacturer differ");
}
+
if(image1Info.DriveModel != image2Info.DriveModel)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Drive model differ");
}
+
if(image1Info.DriveSerialNumber != image2Info.DriveSerialNumber)
{
imagesDiffer = true;
if(!options.Verbose) sb.AppendLine("Drive serial number differ");
}
+
if(image1Info.DriveFirmwareRevision != image2Info.DriveFirmwareRevision)
{
imagesDiffer = true;
@@ -410,7 +432,8 @@ namespace DiscImageChef.Commands
leastSectors = image2Info.Sectors;
if(!options.Verbose) sb.AppendLine("Image 1 has more sectors");
}
- else leastSectors = image1Info.Sectors;
+ else
+ leastSectors = image1Info.Sectors;
DicConsole.WriteLine("Comparing sectors...");
@@ -431,16 +454,16 @@ namespace DiscImageChef.Commands
{
imagesDiffer = true;
sb
- .AppendFormat("Sector {0} has different sizes ({1} bytes in image 1, {2} in image 2) but are otherwise identical",
- sector, image1Sector.LongLength, image2Sector.LongLength).AppendLine();
+ .AppendFormat("Sector {0} has different sizes ({1} bytes in image 1, {2} in image 2) but are otherwise identical",
+ sector, image1Sector.LongLength, image2Sector.LongLength).AppendLine();
}
}
-#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
+ #pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
catch
{
// ignored
}
-#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
+ #pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
}
DicConsole.WriteLine();
diff --git a/DiscImageChef/Commands/ConvertImage.cs b/DiscImageChef/Commands/ConvertImage.cs
index bc19d86b3..20764b074 100644
--- a/DiscImageChef/Commands/ConvertImage.cs
+++ b/DiscImageChef/Commands/ConvertImage.cs
@@ -67,11 +67,11 @@ namespace DiscImageChef.Commands
DicConsole.DebugWriteLine("Analyze command", "--drive-model={0}", options.DriveModel);
DicConsole.DebugWriteLine("Analyze command", "--drive-serial={0}", options.DriveSerialNumber);
DicConsole.DebugWriteLine("Analyze command", "--drive-revision={0}", options.DriveFirmwareRevision);
- DicConsole.DebugWriteLine("Analyze command", "--options={0}", options.Options);
+ DicConsole.DebugWriteLine("Analyze command", "--options={0}", options.Options);
Dictionary parsedOptions = Options.Parse(options.Options);
DicConsole.DebugWriteLine("Analyze command", "Parsed options:");
- foreach(KeyValuePair parsedOption in parsedOptions)
+ foreach(KeyValuePair parsedOption in parsedOptions)
DicConsole.DebugWriteLine("Analyze command", "{0} = {1}", parsedOption.Key, parsedOption.Value);
if(options.Count == 0)
@@ -212,7 +212,7 @@ namespace DiscImageChef.Commands
return;
}
- ImageInfo metadata = new ImageInfo
+ DiscImages.ImageInfo metadata = new DiscImages.ImageInfo
{
Application = "DiscImageChef",
ApplicationVersion = Version.GetVersion(),
diff --git a/DiscImageChef/Commands/DeviceInfo.cs b/DiscImageChef/Commands/DeviceInfo.cs
index 431f4d870..87ca1f965 100644
--- a/DiscImageChef/Commands/DeviceInfo.cs
+++ b/DiscImageChef/Commands/DeviceInfo.cs
@@ -47,9 +47,9 @@ namespace DiscImageChef.Commands
{
internal static void DoDeviceInfo(DeviceInfoOptions options)
{
- DicConsole.DebugWriteLine("Device-Info command", "--debug={0}", options.Debug);
- DicConsole.DebugWriteLine("Device-Info command", "--verbose={0}", options.Verbose);
- DicConsole.DebugWriteLine("Device-Info command", "--device={0}", options.DevicePath);
+ DicConsole.DebugWriteLine("Device-Info command", "--debug={0}", options.Debug);
+ DicConsole.DebugWriteLine("Device-Info command", "--verbose={0}", options.Verbose);
+ DicConsole.DebugWriteLine("Device-Info command", "--device={0}", options.DevicePath);
DicConsole.DebugWriteLine("Device-Info command", "--output-prefix={0}", options.OutputPrefix);
if(options.DevicePath.Length == 2 && options.DevicePath[1] == ':' && options.DevicePath[0] != '/' &&
@@ -71,11 +71,11 @@ namespace DiscImageChef.Commands
DicConsole.WriteLine("USB device");
if(dev.UsbDescriptors != null)
DicConsole.WriteLine("USB descriptor is {0} bytes", dev.UsbDescriptors.Length);
- DicConsole.WriteLine("USB Vendor ID: {0:X4}", dev.UsbVendorId);
- DicConsole.WriteLine("USB Product ID: {0:X4}", dev.UsbProductId);
- DicConsole.WriteLine("USB Manufacturer: {0}", dev.UsbManufacturerString);
- DicConsole.WriteLine("USB Product: {0}", dev.UsbProductString);
- DicConsole.WriteLine("USB Serial number: {0}", dev.UsbSerialString);
+ DicConsole.WriteLine("USB Vendor ID: {0:X4}", dev.UsbVendorId);
+ DicConsole.WriteLine("USB Product ID: {0:X4}", dev.UsbProductId);
+ DicConsole.WriteLine("USB Manufacturer: {0}", dev.UsbManufacturerString);
+ DicConsole.WriteLine("USB Product: {0}", dev.UsbProductString);
+ DicConsole.WriteLine("USB Serial number: {0}", dev.UsbSerialString);
DicConsole.WriteLine();
}
@@ -83,10 +83,10 @@ namespace DiscImageChef.Commands
{
DicConsole.WriteLine("FireWire device");
DicConsole.WriteLine("FireWire Vendor ID: {0:X6}", dev.FireWireVendor);
- DicConsole.WriteLine("FireWire Model ID: {0:X6}", dev.FireWireModel);
+ DicConsole.WriteLine("FireWire Model ID: {0:X6}", dev.FireWireModel);
DicConsole.WriteLine("FireWire Manufacturer: {0}", dev.FireWireVendorName);
- DicConsole.WriteLine("FireWire Model: {0}", dev.FireWireModelName);
- DicConsole.WriteLine("FireWire GUID: {0:X16}", dev.FireWireGuid);
+ DicConsole.WriteLine("FireWire Model: {0}", dev.FireWireModelName);
+ DicConsole.WriteLine("FireWire GUID: {0:X16}", dev.FireWireGuid);
DicConsole.WriteLine();
}
@@ -165,7 +165,7 @@ namespace DiscImageChef.Commands
if(sense)
{
DicConsole.DebugWriteLine("Device-Info command", "STATUS = 0x{0:X2}", errorRegisters.Status);
- DicConsole.DebugWriteLine("Device-Info command", "ERROR = 0x{0:X2}", errorRegisters.Error);
+ DicConsole.DebugWriteLine("Device-Info command", "ERROR = 0x{0:X2}", errorRegisters.Error);
DicConsole.DebugWriteLine("Device-Info command", "NSECTOR = 0x{0:X2}",
errorRegisters.SectorCount);
DicConsole.DebugWriteLine("Device-Info command", "SECTOR = 0x{0:X2}", errorRegisters.Sector);
@@ -229,7 +229,7 @@ namespace DiscImageChef.Commands
if(sense)
{
DicConsole.DebugWriteLine("Device-Info command", "STATUS = 0x{0:X2}", errorRegisters.Status);
- DicConsole.DebugWriteLine("Device-Info command", "ERROR = 0x{0:X2}", errorRegisters.Error);
+ DicConsole.DebugWriteLine("Device-Info command", "ERROR = 0x{0:X2}", errorRegisters.Error);
DicConsole.DebugWriteLine("Device-Info command", "NSECTOR = 0x{0:X2}",
errorRegisters.SectorCount);
DicConsole.DebugWriteLine("Device-Info command", "SECTOR = 0x{0:X2}", errorRegisters.Sector);
@@ -426,7 +426,7 @@ namespace DiscImageChef.Commands
}
else if(page == 0xC0 &&
StringHandlers
- .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
+ .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
"quantum")
{
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
@@ -439,7 +439,7 @@ namespace DiscImageChef.Commands
}
else if(page == 0xC0 &&
StringHandlers
- .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
+ .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
"seagate")
{
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
@@ -452,7 +452,7 @@ namespace DiscImageChef.Commands
}
else if(page == 0xC0 &&
StringHandlers
- .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
+ .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
"ibm")
{
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
@@ -465,7 +465,7 @@ namespace DiscImageChef.Commands
}
else if(page == 0xC1 &&
StringHandlers
- .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
+ .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
"ibm")
{
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
@@ -478,7 +478,7 @@ namespace DiscImageChef.Commands
}
else if((page == 0xC0 || page == 0xC1) &&
StringHandlers
- .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
+ .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
"certance")
{
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
@@ -489,10 +489,11 @@ namespace DiscImageChef.Commands
$"_scsi_evpd_{page:X2}h.bin", $"SCSI INQUIRY EVPD {page:X2}h",
inqBuf);
}
- else if(
- (page == 0xC2 || page == 0xC3 || page == 0xC4 || page == 0xC5 || page == 0xC6) &&
- StringHandlers.CToString(inq.Value.VendorIdentification).ToLowerInvariant()
- .Trim() == "certance")
+ else if((page == 0xC2 || page == 0xC3 || page == 0xC4 || page == 0xC5 ||
+ page == 0xC6) &&
+ StringHandlers
+ .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
+ "certance")
{
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
if(sense) continue;
@@ -505,8 +506,7 @@ namespace DiscImageChef.Commands
else if((page == 0xC0 || page == 0xC1 || page == 0xC2 || page == 0xC3 || page == 0xC4 ||
page == 0xC5) &&
StringHandlers
- .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
- "hp")
+ .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() == "hp")
{
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
if(sense) continue;
@@ -518,7 +518,7 @@ namespace DiscImageChef.Commands
}
else if(page == 0xDF &&
StringHandlers
- .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
+ .CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
"certance")
{
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
@@ -544,7 +544,7 @@ namespace DiscImageChef.Commands
}
}
- Modes.DecodedMode? decMode = null;
+ Modes.DecodedMode? decMode = null;
PeripheralDeviceTypes devType = (PeripheralDeviceTypes)inq.Value.PeripheralDeviceType;
sense = dev.ModeSense10(out byte[] modeBuf, out senseBuf, false, true,
@@ -572,300 +572,7 @@ namespace DiscImageChef.Commands
"SCSI MODE SENSE", modeBuf);
if(decMode.HasValue)
- {
- DicConsole.WriteLine(Modes.PrettifyModeHeader(decMode.Value.Header, devType));
-
- if(decMode.Value.Pages != null)
- foreach(Modes.ModePage page in decMode.Value.Pages)
- //DicConsole.WriteLine("Page {0:X2}h subpage {1:X2}h is {2} bytes long", page.Page, page.Subpage, page.PageResponse.Length);
- switch(page.Page)
- {
- case 0x00:
- {
- if(devType == PeripheralDeviceTypes.MultiMediaDevice && page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_00_SFF(page.PageResponse));
- else
- {
- if(page.Subpage != 0)
- DicConsole
- .WriteLine("Found unknown vendor mode page {0:X2}h subpage {1:X2}h",
- page.Page, page.Subpage);
- else
- DicConsole.WriteLine("Found unknown vendor mode page {0:X2}h",
- page.Page);
- }
- break;
- }
- case 0x01:
- {
- if(page.Subpage == 0)
- if(devType == PeripheralDeviceTypes.MultiMediaDevice)
- DicConsole.WriteLine(Modes.PrettifyModePage_01_MMC(page.PageResponse));
- else DicConsole.WriteLine(Modes.PrettifyModePage_01(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x02:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_02(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x03:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_03(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x04:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_04(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x05:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_05(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x06:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_06(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x07:
- {
- if(page.Subpage == 0)
- if(devType == PeripheralDeviceTypes.MultiMediaDevice)
- DicConsole.WriteLine(Modes.PrettifyModePage_07_MMC(page.PageResponse));
- else DicConsole.WriteLine(Modes.PrettifyModePage_07(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x08:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_08(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x0A:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_0A(page.PageResponse));
- else if(page.Subpage == 1)
- DicConsole.WriteLine(Modes.PrettifyModePage_0A_S01(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x0B:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_0B(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x0D:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_0D(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x0E:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_0E(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x0F:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_0F(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x10:
- {
- if(page.Subpage == 0)
- if(devType == PeripheralDeviceTypes.SequentialAccess)
- DicConsole.WriteLine(Modes.PrettifyModePage_10_SSC(page.PageResponse));
- else DicConsole.WriteLine(Modes.PrettifyModePage_10(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x11:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_11(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x12:
- case 0x13:
- case 0x14:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_12_13_14(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x1A:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_1A(page.PageResponse));
- else if(page.Subpage == 1)
- DicConsole.WriteLine(Modes.PrettifyModePage_1A_S01(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x1B:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_1B(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x1C:
- {
- if(page.Subpage == 0)
- if(devType == PeripheralDeviceTypes.MultiMediaDevice)
- DicConsole.WriteLine(Modes.PrettifyModePage_1C_SFF(page.PageResponse));
- else DicConsole.WriteLine(Modes.PrettifyModePage_1C(page.PageResponse));
- else if(page.Subpage == 1)
- DicConsole.WriteLine(Modes.PrettifyModePage_1C_S01(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x1D:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_1D(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x21:
- {
- if(StringHandlers.CToString(inq.Value.VendorIdentification).Trim() == "CERTANCE"
- ) DicConsole.WriteLine(Modes.PrettifyCertanceModePage_21(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x22:
- {
- if(StringHandlers.CToString(inq.Value.VendorIdentification).Trim() == "CERTANCE"
- ) DicConsole.WriteLine(Modes.PrettifyCertanceModePage_22(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x24:
- {
- if(StringHandlers.CToString(inq.Value.VendorIdentification).Trim() == "IBM")
- DicConsole.WriteLine(Modes.PrettifyIBMModePage_24(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x2A:
- {
- if(page.Subpage == 0)
- DicConsole.WriteLine(Modes.PrettifyModePage_2A(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x2F:
- {
- if(StringHandlers.CToString(inq.Value.VendorIdentification).Trim() == "IBM")
- DicConsole.WriteLine(Modes.PrettifyIBMModePage_2F(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x30:
- {
- if(Modes.IsAppleModePage_30(page.PageResponse))
- DicConsole.WriteLine("Drive identifies as Apple OEM drive");
- else goto default;
-
- break;
- }
- case 0x3B:
- {
- if(StringHandlers.CToString(inq.Value.VendorIdentification).Trim() == "HP")
- DicConsole.WriteLine(Modes.PrettifyHPModePage_3B(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x3C:
- {
- if(StringHandlers.CToString(inq.Value.VendorIdentification).Trim() == "HP")
- DicConsole.WriteLine(Modes.PrettifyHPModePage_3C(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x3D:
- {
- if(StringHandlers.CToString(inq.Value.VendorIdentification).Trim() == "IBM")
- DicConsole.WriteLine(Modes.PrettifyIBMModePage_3D(page.PageResponse));
- else if(StringHandlers.CToString(inq.Value.VendorIdentification).Trim() == "HP")
- DicConsole.WriteLine(Modes.PrettifyHPModePage_3D(page.PageResponse));
- else goto default;
-
- break;
- }
- case 0x3E:
- {
- if(StringHandlers.CToString(inq.Value.VendorIdentification).Trim() == "FUJITSU")
- DicConsole.WriteLine(Modes.PrettifyFujitsuModePage_3E(page.PageResponse));
- else if(StringHandlers.CToString(inq.Value.VendorIdentification).Trim() == "HP")
- DicConsole.WriteLine(Modes.PrettifyHPModePage_3E(page.PageResponse));
- else goto default;
-
- break;
- }
- default:
- {
- if(page.Subpage != 0)
- DicConsole.WriteLine("Found unknown mode page {0:X2}h subpage {1:X2}h",
- page.Page, page.Subpage);
- else DicConsole.WriteLine("Found unknown mode page {0:X2}h", page.Page);
- break;
- }
- }
- }
+ PrintScsiModePages.Print(decMode.Value, devType, inq.Value.VendorIdentification);
switch(devType)
{
@@ -1126,16 +833,16 @@ namespace DiscImageChef.Commands
#region Plextor
if(dev.Manufacturer == "PLEXTOR")
{
- bool plxtSense = true;
- bool plxtDvd = false;
- byte[] plxtBuf = null;
+ bool plxtSense = true;
+ bool plxtDvd = false;
+ byte[] plxtBuf = null;
switch(dev.Model)
{
case "DVDR PX-708A":
case "DVDR PX-708A2":
case "DVDR PX-712A":
- plxtDvd = true;
+ plxtDvd = true;
plxtSense = dev.PlextorReadEeprom(out plxtBuf, out senseBuf, dev.Timeout,
out _);
break;
@@ -1174,39 +881,39 @@ namespace DiscImageChef.Commands
"PLEXTOR READ EEPROM", plxtBuf);
ushort discs;
- uint cdReadTime, cdWriteTime, dvdReadTime = 0, dvdWriteTime = 0;
+ uint cdReadTime, cdWriteTime, dvdReadTime = 0, dvdWriteTime = 0;
BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian;
if(plxtDvd)
{
- discs = BigEndianBitConverter.ToUInt16(plxtBuf, 0x0120);
- cdReadTime = BigEndianBitConverter.ToUInt32(plxtBuf, 0x0122);
- cdWriteTime = BigEndianBitConverter.ToUInt32(plxtBuf, 0x0126);
- dvdReadTime = BigEndianBitConverter.ToUInt32(plxtBuf, 0x012A);
+ discs = BigEndianBitConverter.ToUInt16(plxtBuf, 0x0120);
+ cdReadTime = BigEndianBitConverter.ToUInt32(plxtBuf, 0x0122);
+ cdWriteTime = BigEndianBitConverter.ToUInt32(plxtBuf, 0x0126);
+ dvdReadTime = BigEndianBitConverter.ToUInt32(plxtBuf, 0x012A);
dvdWriteTime = BigEndianBitConverter.ToUInt32(plxtBuf, 0x012E);
}
else
{
- discs = BigEndianBitConverter.ToUInt16(plxtBuf, 0x0078);
- cdReadTime = BigEndianBitConverter.ToUInt32(plxtBuf, 0x006C);
+ discs = BigEndianBitConverter.ToUInt16(plxtBuf, 0x0078);
+ cdReadTime = BigEndianBitConverter.ToUInt32(plxtBuf, 0x006C);
cdWriteTime = BigEndianBitConverter.ToUInt32(plxtBuf, 0x007A);
}
DicConsole.WriteLine("Drive has loaded a total of {0} discs", discs);
DicConsole
- .WriteLine("Drive has spent {0} hours, {1} minutes and {2} seconds reading CDs",
- cdReadTime / 3600, cdReadTime / 60 % 60, cdReadTime % 60);
+ .WriteLine("Drive has spent {0} hours, {1} minutes and {2} seconds reading CDs",
+ cdReadTime / 3600, cdReadTime / 60 % 60, cdReadTime % 60);
DicConsole
- .WriteLine("Drive has spent {0} hours, {1} minutes and {2} seconds writing CDs",
- cdWriteTime / 3600, cdWriteTime / 60 % 60, cdWriteTime % 60);
+ .WriteLine("Drive has spent {0} hours, {1} minutes and {2} seconds writing CDs",
+ cdWriteTime / 3600, cdWriteTime / 60 % 60, cdWriteTime % 60);
if(plxtDvd)
{
DicConsole
- .WriteLine("Drive has spent {0} hours, {1} minutes and {2} seconds reading DVDs",
- dvdReadTime / 3600, dvdReadTime / 60 % 60, dvdReadTime % 60);
+ .WriteLine("Drive has spent {0} hours, {1} minutes and {2} seconds reading DVDs",
+ dvdReadTime / 3600, dvdReadTime / 60 % 60, dvdReadTime % 60);
DicConsole
- .WriteLine("Drive has spent {0} hours, {1} minutes and {2} seconds writing DVDs",
- dvdWriteTime / 3600, dvdWriteTime / 60 % 60, dvdWriteTime % 60);
+ .WriteLine("Drive has spent {0} hours, {1} minutes and {2} seconds writing DVDs",
+ dvdWriteTime / 3600, dvdWriteTime / 60 % 60, dvdWriteTime % 60);
}
}
@@ -1231,12 +938,12 @@ namespace DiscImageChef.Commands
{
if(plxtPwrRecSelected > 0)
DicConsole
- .WriteLine("Selected PoweRec speed for currently inserted media is {0} Kb/sec ({1}x)",
- plxtPwrRecSelected, plxtPwrRecSelected / 177);
+ .WriteLine("Selected PoweRec speed for currently inserted media is {0} Kb/sec ({1}x)",
+ plxtPwrRecSelected, plxtPwrRecSelected / 177);
if(plxtPwrRecMax > 0)
DicConsole
- .WriteLine("Maximum PoweRec speed for currently inserted media is {0} Kb/sec ({1}x)",
- plxtPwrRecMax, plxtPwrRecMax / 177);
+ .WriteLine("Maximum PoweRec speed for currently inserted media is {0} Kb/sec ({1}x)",
+ plxtPwrRecMax, plxtPwrRecMax / 177);
if(plxtPwrRecLast > 0)
DicConsole.WriteLine("Last used PoweRec was {0} Kb/sec ({1}x)",
plxtPwrRecLast, plxtPwrRecLast / 177);
@@ -1343,6 +1050,7 @@ namespace DiscImageChef.Commands
if(krFeatures.HasFlag(KreonFeatures.ErrorSkipping))
DicConsole.WriteLine("\tCan skip read errors");
}
+
break;
case PeripheralDeviceTypes.SequentialAccess:
@@ -1388,8 +1096,10 @@ namespace DiscImageChef.Commands
DicConsole.WriteLine("Medium types supported by device:");
DicConsole.WriteLine(DensitySupport.PrettifyMediumType(meds));
}
+
DicConsole.WriteLine(DensitySupport.PrettifyMediumType(seqBuf));
}
+
break;
}
@@ -1407,6 +1117,7 @@ namespace DiscImageChef.Commands
mmcBuf);
DicConsole.WriteLine("{0}", Decoders.MMC.Decoders.PrettifyCID(mmcBuf));
}
+
sense = dev.ReadCsd(out mmcBuf, out _, dev.Timeout, out _);
if(!sense)
{
@@ -1415,6 +1126,7 @@ namespace DiscImageChef.Commands
mmcBuf);
DicConsole.WriteLine("{0}", Decoders.MMC.Decoders.PrettifyCSD(mmcBuf));
}
+
sense = dev.ReadOcr(out mmcBuf, out _, dev.Timeout, out _);
if(!sense)
{
@@ -1423,6 +1135,7 @@ namespace DiscImageChef.Commands
mmcBuf);
DicConsole.WriteLine("{0}", Decoders.MMC.Decoders.PrettifyOCR(mmcBuf));
}
+
sense = dev.ReadExtendedCsd(out mmcBuf, out _, dev.Timeout, out _);
if(!sense)
{
@@ -1447,6 +1160,7 @@ namespace DiscImageChef.Commands
"SecureDigital CID", sdBuf);
DicConsole.WriteLine("{0}", Decoders.SecureDigital.Decoders.PrettifyCID(sdBuf));
}
+
sense = dev.ReadCsd(out sdBuf, out _, dev.Timeout, out _);
if(!sense)
{
@@ -1455,6 +1169,7 @@ namespace DiscImageChef.Commands
"SecureDigital CSD", sdBuf);
DicConsole.WriteLine("{0}", Decoders.SecureDigital.Decoders.PrettifyCSD(sdBuf));
}
+
sense = dev.ReadSdocr(out sdBuf, out _, dev.Timeout, out _);
if(!sense)
{
@@ -1463,6 +1178,7 @@ namespace DiscImageChef.Commands
"SecureDigital OCR", sdBuf);
DicConsole.WriteLine("{0}", Decoders.SecureDigital.Decoders.PrettifyOCR(sdBuf));
}
+
sense = dev.ReadScr(out sdBuf, out _, dev.Timeout, out _);
if(!sense)
{
diff --git a/DiscImageChef/Commands/ImageInfo.cs b/DiscImageChef/Commands/ImageInfo.cs
new file mode 100644
index 000000000..ea6f021ef
--- /dev/null
+++ b/DiscImageChef/Commands/ImageInfo.cs
@@ -0,0 +1,102 @@
+// /***************************************************************************
+// The Disc Image Chef
+// ----------------------------------------------------------------------------
+//
+// Filename : ImageInfo.cs
+// Author(s) : Natalia Portillo
+//
+// Component : Verbs.
+//
+// --[ Description ] ----------------------------------------------------------
+//
+// Implements the 'image-info' verb.
+//
+// --[ License ] --------------------------------------------------------------
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+// ----------------------------------------------------------------------------
+// Copyright © 2011-2018 Natalia Portillo
+// ****************************************************************************/
+
+using System;
+using DiscImageChef.Console;
+using DiscImageChef.Core;
+using DiscImageChef.DiscImages;
+using DiscImageChef.Filters;
+
+namespace DiscImageChef.Commands
+{
+ static class ImageInfo
+ {
+ internal static void GetImageInfo(ImageInfoOptions options)
+ {
+ DicConsole.DebugWriteLine("Analyze command", "--debug={0}", options.Debug);
+ DicConsole.DebugWriteLine("Analyze command", "--verbose={0}", options.Verbose);
+ DicConsole.DebugWriteLine("Analyze command", "--input={0}", options.InputFile);
+
+ FiltersList filtersList = new FiltersList();
+ IFilter inputFilter = filtersList.GetFilter(options.InputFile);
+
+ if(inputFilter == null)
+ {
+ DicConsole.ErrorWriteLine("Cannot open specified file.");
+ return;
+ }
+
+ try
+ {
+ IMediaImage imageFormat = ImageFormat.Detect(inputFilter);
+
+ if(imageFormat == null)
+ {
+ DicConsole.WriteLine("Image format not identified.");
+ return;
+ }
+
+ DicConsole.WriteLine("Image format identified by {0} ({1}).", imageFormat.Name, imageFormat.Id);
+ DicConsole.WriteLine();
+
+ try
+ {
+ if(!imageFormat.Open(inputFilter))
+ {
+ DicConsole.WriteLine("Unable to open image format");
+ DicConsole.WriteLine("No error given");
+ return;
+ }
+
+ Core.ImageInfo.PrintImageInfo(imageFormat);
+
+ Core.Statistics.AddMediaFormat(imageFormat.Format);
+ Core.Statistics.AddMedia(imageFormat.Info.MediaType, false);
+ Core.Statistics.AddFilter(inputFilter.Name);
+ }
+ catch(Exception ex)
+ {
+ DicConsole.ErrorWriteLine("Unable to open image format");
+ DicConsole.ErrorWriteLine("Error: {0}", ex.Message);
+ DicConsole.DebugWriteLine("Image-info command", "Stack trace: {0}", ex.StackTrace);
+ }
+ }
+ catch(Exception ex)
+ {
+ DicConsole.ErrorWriteLine($"Error reading file: {ex.Message}");
+ DicConsole.DebugWriteLine("Image-info command", ex.StackTrace);
+ }
+
+ Core.Statistics.AddCommand("image-info");
+ }
+ }
+}
\ No newline at end of file
diff --git a/DiscImageChef/Commands/Statistics.cs b/DiscImageChef/Commands/Statistics.cs
index 756c1aa11..5f02b35b1 100644
--- a/DiscImageChef/Commands/Statistics.cs
+++ b/DiscImageChef/Commands/Statistics.cs
@@ -63,6 +63,9 @@ namespace DiscImageChef.Commands
if(Core.Statistics.AllStats.Commands.Compare > 0)
DicConsole.WriteLine("You have called the Compare command {0} times",
Core.Statistics.AllStats.Commands.Compare);
+ if(Core.Statistics.AllStats.Commands.ConvertImage > 0)
+ DicConsole.WriteLine("You have called the Convert-Image command {0} times",
+ Core.Statistics.AllStats.Commands.ConvertImage);
if(Core.Statistics.AllStats.Commands.CreateSidecar > 0)
DicConsole.WriteLine("You have called the Create-Sidecar command {0} times",
Core.Statistics.AllStats.Commands.CreateSidecar);
@@ -84,6 +87,9 @@ namespace DiscImageChef.Commands
if(Core.Statistics.AllStats.Commands.Formats > 0)
DicConsole.WriteLine("You have called the Formats command {0} times",
Core.Statistics.AllStats.Commands.Formats);
+ if(Core.Statistics.AllStats.Commands.ImageInfo > 0)
+ DicConsole.WriteLine("You have called the Image-Info command {0} times",
+ Core.Statistics.AllStats.Commands.ImageInfo);
if(Core.Statistics.AllStats.Commands.MediaInfo > 0)
DicConsole.WriteLine("You have called the Media-Info command {0} times",
Core.Statistics.AllStats.Commands.MediaInfo);
@@ -171,8 +177,8 @@ namespace DiscImageChef.Commands
DicConsole.WriteLine("=================");
foreach(DeviceStats ds in Core.Statistics.AllStats.Devices)
DicConsole
- .WriteLine("Device model {0}, manufactured by {1}, with revision {2} and attached via {3}.",
- ds.Model, ds.Manufacturer, ds.Revision, ds.Bus);
+ .WriteLine("Device model {0}, manufactured by {1}, with revision {2} and attached via {3}.",
+ ds.Model, ds.Manufacturer, ds.Revision, ds.Bus);
DicConsole.WriteLine();
thereAreStats = true;
@@ -196,7 +202,7 @@ namespace DiscImageChef.Commands
DicConsole.WriteLine("=====================");
DicConsole.WriteLine("Scanned a total of {0} sectors",
Core.Statistics.AllStats.MediaScan.Sectors.Total);
- DicConsole.WriteLine("{0} of them correctly", Core.Statistics.AllStats.MediaScan.Sectors.Correct);
+ DicConsole.WriteLine("{0} of them correctly", Core.Statistics.AllStats.MediaScan.Sectors.Correct);
DicConsole.WriteLine("{0} of them had errors", Core.Statistics.AllStats.MediaScan.Sectors.Error);
DicConsole.WriteLine("{0} of them took less than 3 ms",
Core.Statistics.AllStats.MediaScan.Times.LessThan3ms);
diff --git a/DiscImageChef/DiscImageChef.csproj b/DiscImageChef/DiscImageChef.csproj
index 47bc3b6fc..a1df50aed 100644
--- a/DiscImageChef/DiscImageChef.csproj
+++ b/DiscImageChef/DiscImageChef.csproj
@@ -52,6 +52,7 @@
+
diff --git a/DiscImageChef/Main.cs b/DiscImageChef/Main.cs
index 462cb8c63..793f0f309 100644
--- a/DiscImageChef/Main.cs
+++ b/DiscImageChef/Main.cs
@@ -56,7 +56,7 @@ namespace DiscImageChef
typeof(ConvertImageOptions), typeof(CreateSidecarOptions),
typeof(DecodeOptions), typeof(DeviceInfoOptions), typeof(DeviceReportOptions),
typeof(DumpMediaOptions), typeof(EntropyOptions), typeof(ExtractFilesOptions),
- typeof(FormatsOptions), typeof(ListDevicesOptions),
+ typeof(FormatsOptions), typeof(ImageInfoOptions), typeof(ListDevicesOptions),
typeof(ListEncodingsOptions), typeof(ListOptionsOptions), typeof(LsOptions),
typeof(MediaInfoOptions), typeof(MediaScanOptions), typeof(PrintHexOptions),
typeof(StatsOptions), typeof(VerifyOptions))
@@ -186,6 +186,12 @@ namespace DiscImageChef
if(opts.Verbose) DicConsole.VerboseWriteLineEvent += System.Console.WriteLine;
PrintCopyright();
ConvertImage.DoConvert(opts);
+ }).WithParsed(opts =>
+ {
+ if(opts.Debug) DicConsole.DebugWriteLineEvent += System.Console.Error.WriteLine;
+ if(opts.Verbose) DicConsole.VerboseWriteLineEvent += System.Console.WriteLine;
+ PrintCopyright();
+ ImageInfo.GetImageInfo(opts);
}).WithParsed(opts =>
{
PrintCopyright();
diff --git a/DiscImageChef/Options.cs b/DiscImageChef/Options.cs
index e78e57c6e..400cd59a2 100644
--- a/DiscImageChef/Options.cs
+++ b/DiscImageChef/Options.cs
@@ -430,4 +430,12 @@ namespace DiscImageChef
HelpText = "Comma separated name=value pairs of options to pass to output image plugin")]
public string Options { get; set; }
}
+
+ [Verb("image-info", HelpText =
+ "Opens a media image and shows information about the media it represents and metadata.")]
+ public class ImageInfoOptions : CommonOptions
+ {
+ [Option('i', "input", Required = true, HelpText = "Media image.")]
+ public string InputFile { get; set; }
+ }
}
\ No newline at end of file