mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Add 'image-info' verb.
This commit is contained in:
3
.idea/.idea.DiscImageChef/.idea/contentModel.xml
generated
3
.idea/.idea.DiscImageChef/.idea/contentModel.xml
generated
@@ -31,6 +31,7 @@
|
|||||||
<e p="Entropy.cs" t="Include" />
|
<e p="Entropy.cs" t="Include" />
|
||||||
<e p="ExtractFiles.cs" t="Include" />
|
<e p="ExtractFiles.cs" t="Include" />
|
||||||
<e p="Formats.cs" t="Include" />
|
<e p="Formats.cs" t="Include" />
|
||||||
|
<e p="ImageInfo.cs" t="Include" />
|
||||||
<e p="ListDevices.cs" t="Include" />
|
<e p="ListDevices.cs" t="Include" />
|
||||||
<e p="ListEncodings.cs" t="Include" />
|
<e p="ListEncodings.cs" t="Include" />
|
||||||
<e p="ListOptions.cs" t="Include" />
|
<e p="ListOptions.cs" t="Include" />
|
||||||
@@ -155,6 +156,7 @@
|
|||||||
<e p="DiscImageChef.Core.csproj" t="IncludeRecursive" />
|
<e p="DiscImageChef.Core.csproj" t="IncludeRecursive" />
|
||||||
<e p="Filesystems.cs" t="Include" />
|
<e p="Filesystems.cs" t="Include" />
|
||||||
<e p="ImageFormat.cs" t="Include" />
|
<e p="ImageFormat.cs" t="Include" />
|
||||||
|
<e p="ImageInfo.cs" t="Include" />
|
||||||
<e p="Logging" t="Include">
|
<e p="Logging" t="Include">
|
||||||
<e p="DumpLog.cs" t="Include" />
|
<e p="DumpLog.cs" t="Include" />
|
||||||
<e p="IBGLog.cs" t="Include" />
|
<e p="IBGLog.cs" t="Include" />
|
||||||
@@ -163,6 +165,7 @@
|
|||||||
<e p="Options.cs" t="Include" />
|
<e p="Options.cs" t="Include" />
|
||||||
<e p="Partitions.cs" t="Include" />
|
<e p="Partitions.cs" t="Include" />
|
||||||
<e p="PluginBase.cs" t="Include" />
|
<e p="PluginBase.cs" t="Include" />
|
||||||
|
<e p="PrintScsiModePages.cs" t="Include" />
|
||||||
<e p="Properties" t="Include">
|
<e p="Properties" t="Include">
|
||||||
<e p="AssemblyInfo.cs" t="Include" />
|
<e p="AssemblyInfo.cs" t="Include" />
|
||||||
</e>
|
</e>
|
||||||
|
|||||||
@@ -37,9 +37,11 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="ImageInfo.cs" />
|
||||||
<Compile Include="Options.cs" />
|
<Compile Include="Options.cs" />
|
||||||
<Compile Include="PluginBase.cs" />
|
<Compile Include="PluginBase.cs" />
|
||||||
<Compile Include="ImageFormat.cs" />
|
<Compile Include="ImageFormat.cs" />
|
||||||
|
<Compile Include="PrintScsiModePages.cs" />
|
||||||
<Compile Include="Statistics.cs" />
|
<Compile Include="Statistics.cs" />
|
||||||
<Compile Include="Checksum.cs" />
|
<Compile Include="Checksum.cs" />
|
||||||
<Compile Include="Logging\IBGLog.cs" />
|
<Compile Include="Logging\IBGLog.cs" />
|
||||||
|
|||||||
497
DiscImageChef.Core/ImageInfo.cs
Normal file
497
DiscImageChef.Core/ImageInfo.cs
Normal file
@@ -0,0 +1,497 @@
|
|||||||
|
// /***************************************************************************
|
||||||
|
// The Disc Image Chef
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Filename : ImageInfo.cs
|
||||||
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
||||||
|
//
|
||||||
|
// Component : Core algorithms.
|
||||||
|
//
|
||||||
|
// --[ Description ] ----------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Prints image information to console.
|
||||||
|
//
|
||||||
|
// --[ 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 <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Copyright © 2011-2018 Natalia Portillo
|
||||||
|
// ****************************************************************************/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using DiscImageChef.Console;
|
||||||
|
using DiscImageChef.Decoders.ATA;
|
||||||
|
using DiscImageChef.Decoders.Bluray;
|
||||||
|
using DiscImageChef.Decoders.CD;
|
||||||
|
using DiscImageChef.Decoders.DVD;
|
||||||
|
using DiscImageChef.Decoders.PCMCIA;
|
||||||
|
using DiscImageChef.Decoders.SCSI;
|
||||||
|
using DiscImageChef.Decoders.Xbox;
|
||||||
|
using DiscImageChef.DiscImages;
|
||||||
|
using DDS = DiscImageChef.Decoders.DVD.DDS;
|
||||||
|
using DMI = DiscImageChef.Decoders.Xbox.DMI;
|
||||||
|
using Tuple = DiscImageChef.Decoders.PCMCIA.Tuple;
|
||||||
|
|
||||||
|
namespace DiscImageChef.Core
|
||||||
|
{
|
||||||
|
public static class ImageInfo
|
||||||
|
{
|
||||||
|
public static void PrintImageInfo(IMediaImage imageFormat)
|
||||||
|
{
|
||||||
|
DicConsole.WriteLine("Image information:");
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Version))
|
||||||
|
DicConsole.WriteLine("Format: {0} version {1}", imageFormat.Format, imageFormat.Info.Version);
|
||||||
|
else DicConsole.WriteLine("Format: {0}", imageFormat.Format);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Application) &&
|
||||||
|
!string.IsNullOrWhiteSpace(imageFormat.Info.ApplicationVersion))
|
||||||
|
DicConsole.WriteLine("Was created with {0} version {1}", imageFormat.Info.Application,
|
||||||
|
imageFormat.Info.ApplicationVersion);
|
||||||
|
else if(!string.IsNullOrWhiteSpace(imageFormat.Info.Application))
|
||||||
|
DicConsole.WriteLine("Was created with {0}", imageFormat.Info.Application);
|
||||||
|
DicConsole.WriteLine("Image without headers is {0} bytes long", imageFormat.Info.ImageSize);
|
||||||
|
DicConsole.WriteLine("Contains a media of {0} sectors with a maximum sector size of {1} bytes (if all sectors are of the same size this would be {2} bytes)",
|
||||||
|
imageFormat.Info.Sectors, imageFormat.Info.SectorSize,
|
||||||
|
imageFormat.Info.Sectors * imageFormat.Info.SectorSize);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Creator))
|
||||||
|
DicConsole.WriteLine("Created by: {0}", imageFormat.Info.Creator);
|
||||||
|
if(imageFormat.Info.CreationTime != DateTime.MinValue)
|
||||||
|
DicConsole.WriteLine("Created on {0}", imageFormat.Info.CreationTime);
|
||||||
|
if(imageFormat.Info.LastModificationTime != DateTime.MinValue)
|
||||||
|
DicConsole.WriteLine("Last modified on {0}", imageFormat.Info.LastModificationTime);
|
||||||
|
DicConsole.WriteLine("Contains a media of type {0} and XML type {1}", imageFormat.Info.MediaType,
|
||||||
|
imageFormat.Info.XmlMediaType);
|
||||||
|
DicConsole.WriteLine("{0} partitions", imageFormat.Info.HasPartitions ? "Has" : "Doesn't have");
|
||||||
|
DicConsole.WriteLine("{0} sessions", imageFormat.Info.HasSessions ? "Has" : "Doesn't have");
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Comments))
|
||||||
|
DicConsole.WriteLine("Comments: {0}", imageFormat.Info.Comments);
|
||||||
|
if(imageFormat.Info.MediaSequence != 0 && imageFormat.Info.LastMediaSequence != 0)
|
||||||
|
DicConsole.WriteLine("Media is number {0} on a set of {1} medias", imageFormat.Info.MediaSequence,
|
||||||
|
imageFormat.Info.LastMediaSequence);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaTitle))
|
||||||
|
DicConsole.WriteLine("Media title: {0}", imageFormat.Info.MediaTitle);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaManufacturer))
|
||||||
|
DicConsole.WriteLine("Media manufacturer: {0}", imageFormat.Info.MediaManufacturer);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaModel))
|
||||||
|
DicConsole.WriteLine("Media model: {0}", imageFormat.Info.MediaModel);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaSerialNumber))
|
||||||
|
DicConsole.WriteLine("Media serial number: {0}", imageFormat.Info.MediaSerialNumber);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaBarcode))
|
||||||
|
DicConsole.WriteLine("Media barcode: {0}", imageFormat.Info.MediaBarcode);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaPartNumber))
|
||||||
|
DicConsole.WriteLine("Media part number: {0}", imageFormat.Info.MediaPartNumber);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveManufacturer))
|
||||||
|
DicConsole.WriteLine("Drive manufacturer: {0}", imageFormat.Info.DriveManufacturer);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveModel))
|
||||||
|
DicConsole.WriteLine("Drive model: {0}", imageFormat.Info.DriveModel);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveSerialNumber))
|
||||||
|
DicConsole.WriteLine("Drive serial number: {0}", imageFormat.Info.DriveSerialNumber);
|
||||||
|
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveFirmwareRevision))
|
||||||
|
DicConsole.WriteLine("Drive firmware info: {0}", imageFormat.Info.DriveFirmwareRevision);
|
||||||
|
if(imageFormat.Info.Cylinders > 0 && imageFormat.Info.Heads > 0 && imageFormat.Info.SectorsPerTrack > 0)
|
||||||
|
DicConsole.WriteLine("Media geometry: {0} cylinders, {1} heads, {2} sectors per track",
|
||||||
|
imageFormat.Info.Cylinders, imageFormat.Info.Heads,
|
||||||
|
imageFormat.Info.SectorsPerTrack);
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null && imageFormat.Info.ReadableMediaTags.Count > 0)
|
||||||
|
{
|
||||||
|
DicConsole.WriteLine("Contains {0} readable media tags:", imageFormat.Info.ReadableMediaTags.Count);
|
||||||
|
foreach(MediaTagType tag in imageFormat.Info.ReadableMediaTags.OrderBy(t => t)) DicConsole.Write("{0} ", tag);
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableSectorTags != null && imageFormat.Info.ReadableSectorTags.Count > 0)
|
||||||
|
{
|
||||||
|
DicConsole.WriteLine("Contains {0} readable sector tags:", imageFormat.Info.ReadableSectorTags.Count);
|
||||||
|
foreach(SectorTagType tag in imageFormat.Info.ReadableSectorTags.OrderBy(t => t)) DicConsole.Write("{0} ", tag);
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
PeripheralDeviceTypes scsiDeviceType = PeripheralDeviceTypes.DirectAccess;
|
||||||
|
byte[] scsiVendorId = null;
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SCSI_INQUIRY))
|
||||||
|
{
|
||||||
|
byte[] inquiry = imageFormat.ReadDiskTag(MediaTagType.SCSI_INQUIRY);
|
||||||
|
|
||||||
|
scsiDeviceType = (PeripheralDeviceTypes)(inquiry[0] & 0x1F);
|
||||||
|
if(inquiry.Length >= 16)
|
||||||
|
{
|
||||||
|
scsiVendorId = new byte[8];
|
||||||
|
Array.Copy(inquiry, 8, scsiVendorId, 0, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
DicConsole.WriteLine("SCSI INQUIRY contained in image:");
|
||||||
|
DicConsole.Write("{0}", Inquiry.Prettify(inquiry));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.ATA_IDENTIFY))
|
||||||
|
{
|
||||||
|
byte[] identify = imageFormat.ReadDiskTag(MediaTagType.ATA_IDENTIFY);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("ATA IDENTIFY contained in image:");
|
||||||
|
DicConsole.Write("{0}", Identify.Prettify(identify));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.ATAPI_IDENTIFY))
|
||||||
|
{
|
||||||
|
byte[] identify = imageFormat.ReadDiskTag(MediaTagType.ATAPI_IDENTIFY);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("ATAPI IDENTIFY contained in image:");
|
||||||
|
DicConsole.Write("{0}", Identify.Prettify(identify));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SCSI_MODESENSE_10))
|
||||||
|
{
|
||||||
|
byte[] modeSense10 = imageFormat.ReadDiskTag(MediaTagType.SCSI_MODESENSE_10);
|
||||||
|
Modes.DecodedMode? decMode = Modes.DecodeMode10(modeSense10, scsiDeviceType);
|
||||||
|
|
||||||
|
if(decMode.HasValue)
|
||||||
|
{
|
||||||
|
DicConsole.WriteLine("SCSI MODE SENSE (10) contained in image:");
|
||||||
|
PrintScsiModePages.Print(decMode.Value, scsiDeviceType, scsiVendorId);
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SCSI_MODESENSE_6))
|
||||||
|
{
|
||||||
|
byte[] modeSense6 = imageFormat.ReadDiskTag(MediaTagType.SCSI_MODESENSE_6);
|
||||||
|
Modes.DecodedMode? decMode = Modes.DecodeMode6(modeSense6, scsiDeviceType);
|
||||||
|
|
||||||
|
if(decMode.HasValue)
|
||||||
|
{
|
||||||
|
DicConsole.WriteLine("SCSI MODE SENSE (6) contained in image:");
|
||||||
|
PrintScsiModePages.Print(decMode.Value, scsiDeviceType, scsiVendorId);
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SCSI_MODEPAGE_2A))
|
||||||
|
{
|
||||||
|
byte[] mode2A = imageFormat.ReadDiskTag(MediaTagType.SCSI_MODEPAGE_2A);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("SCSI INQUIRY contained in image:");
|
||||||
|
DicConsole.Write("{0}", Modes.PrettifyModePage_2A(mode2A));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_FullTOC))
|
||||||
|
{
|
||||||
|
byte[] toc = imageFormat.ReadDiskTag(MediaTagType.CD_FullTOC);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("CompactDisc Table of Contents contained in image:");
|
||||||
|
DicConsole.Write("{0}", FullTOC.Prettify(toc));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_PMA))
|
||||||
|
{
|
||||||
|
byte[] pma = imageFormat.ReadDiskTag(MediaTagType.CD_PMA);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("CompactDisc Power Management Area contained in image:");
|
||||||
|
DicConsole.Write("{0}", PMA.Prettify(pma));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_ATIP))
|
||||||
|
{
|
||||||
|
byte[] atip = imageFormat.ReadDiskTag(MediaTagType.CD_ATIP);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("CompactDisc Absolute Time In Pregroove (ATIP) contained in image:");
|
||||||
|
DicConsole.Write("{0}", ATIP.Prettify(atip));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_TEXT))
|
||||||
|
{
|
||||||
|
byte[] cdtext = imageFormat.ReadDiskTag(MediaTagType.CD_TEXT);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("CompactDisc Lead-in's CD-Text contained in image:");
|
||||||
|
DicConsole.Write("{0}", CDTextOnLeadIn.Prettify(cdtext));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_MCN))
|
||||||
|
{
|
||||||
|
byte[] mcn = imageFormat.ReadDiskTag(MediaTagType.CD_MCN);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("CompactDisc Media Catalogue Number contained in image: {0}",
|
||||||
|
Encoding.UTF8.GetString(mcn));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVD_PFI))
|
||||||
|
{
|
||||||
|
byte[] pfi = imageFormat.ReadDiskTag(MediaTagType.DVD_PFI);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("DVD Physical Format Information contained in image:");
|
||||||
|
DicConsole.Write("{0}", PFI.Prettify(pfi));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDRAM_DDS))
|
||||||
|
{
|
||||||
|
byte[] dds = imageFormat.ReadDiskTag(MediaTagType.DVDRAM_DDS);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("DVD-RAM Disc Definition Structure contained in image:");
|
||||||
|
DicConsole.Write("{0}", DDS.Prettify(dds));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDR_PFI))
|
||||||
|
{
|
||||||
|
byte[] pfi = imageFormat.ReadDiskTag(MediaTagType.DVDR_PFI);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("DVD-R Physical Format Information contained in image:");
|
||||||
|
DicConsole.Write("{0}", PFI.Prettify(pfi));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.BD_DI))
|
||||||
|
{
|
||||||
|
byte[] di = imageFormat.ReadDiskTag(MediaTagType.BD_DI);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("Bluray Disc Information contained in image:");
|
||||||
|
DicConsole.Write("{0}", DI.Prettify(di));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.BD_DDS))
|
||||||
|
{
|
||||||
|
byte[] dds = imageFormat.ReadDiskTag(MediaTagType.BD_DDS);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("Bluray Disc Definition Structure contained in image:");
|
||||||
|
DicConsole.Write("{0}", Decoders.Bluray.DDS.Prettify(dds));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.PCMCIA_CIS))
|
||||||
|
{
|
||||||
|
byte[] cis = imageFormat.ReadDiskTag(MediaTagType.PCMCIA_CIS);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("PCMCIA CIS:");
|
||||||
|
Tuple[] tuples = CIS.GetTuples(cis);
|
||||||
|
if(tuples != null)
|
||||||
|
foreach(Tuple tuple in tuples)
|
||||||
|
switch(tuple.Code)
|
||||||
|
{
|
||||||
|
case TupleCodes.CISTPL_NULL:
|
||||||
|
case TupleCodes.CISTPL_END: break;
|
||||||
|
case TupleCodes.CISTPL_DEVICEGEO:
|
||||||
|
case TupleCodes.CISTPL_DEVICEGEO_A:
|
||||||
|
DicConsole.WriteLine("{0}", CIS.PrettifyDeviceGeometryTuple(tuple));
|
||||||
|
break;
|
||||||
|
case TupleCodes.CISTPL_MANFID:
|
||||||
|
DicConsole.WriteLine("{0}", CIS.PrettifyManufacturerIdentificationTuple(tuple));
|
||||||
|
break;
|
||||||
|
case TupleCodes.CISTPL_VERS_1:
|
||||||
|
DicConsole.WriteLine("{0}", CIS.PrettifyLevel1VersionTuple(tuple));
|
||||||
|
break;
|
||||||
|
case TupleCodes.CISTPL_ALTSTR:
|
||||||
|
case TupleCodes.CISTPL_BAR:
|
||||||
|
case TupleCodes.CISTPL_BATTERY:
|
||||||
|
case TupleCodes.CISTPL_BYTEORDER:
|
||||||
|
case TupleCodes.CISTPL_CFTABLE_ENTRY:
|
||||||
|
case TupleCodes.CISTPL_CFTABLE_ENTRY_CB:
|
||||||
|
case TupleCodes.CISTPL_CHECKSUM:
|
||||||
|
case TupleCodes.CISTPL_CONFIG:
|
||||||
|
case TupleCodes.CISTPL_CONFIG_CB:
|
||||||
|
case TupleCodes.CISTPL_DATE:
|
||||||
|
case TupleCodes.CISTPL_DEVICE:
|
||||||
|
case TupleCodes.CISTPL_DEVICE_A:
|
||||||
|
case TupleCodes.CISTPL_DEVICE_OA:
|
||||||
|
case TupleCodes.CISTPL_DEVICE_OC:
|
||||||
|
case TupleCodes.CISTPL_EXTDEVIC:
|
||||||
|
case TupleCodes.CISTPL_FORMAT:
|
||||||
|
case TupleCodes.CISTPL_FORMAT_A:
|
||||||
|
case TupleCodes.CISTPL_FUNCE:
|
||||||
|
case TupleCodes.CISTPL_FUNCID:
|
||||||
|
case TupleCodes.CISTPL_GEOMETRY:
|
||||||
|
case TupleCodes.CISTPL_INDIRECT:
|
||||||
|
case TupleCodes.CISTPL_JEDEC_A:
|
||||||
|
case TupleCodes.CISTPL_JEDEC_C:
|
||||||
|
case TupleCodes.CISTPL_LINKTARGET:
|
||||||
|
case TupleCodes.CISTPL_LONGLINK_A:
|
||||||
|
case TupleCodes.CISTPL_LONGLINK_C:
|
||||||
|
case TupleCodes.CISTPL_LONGLINK_CB:
|
||||||
|
case TupleCodes.CISTPL_LONGLINK_MFC:
|
||||||
|
case TupleCodes.CISTPL_NO_LINK:
|
||||||
|
case TupleCodes.CISTPL_ORG:
|
||||||
|
case TupleCodes.CISTPL_PWR_MGMNT:
|
||||||
|
case TupleCodes.CISTPL_SPCL:
|
||||||
|
case TupleCodes.CISTPL_SWIL:
|
||||||
|
case TupleCodes.CISTPL_VERS_2:
|
||||||
|
DicConsole.DebugWriteLine("Device-Info command", "Found undecoded tuple ID {0}",
|
||||||
|
tuple.Code);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
DicConsole.DebugWriteLine("Device-Info command", "Found unknown tuple ID 0x{0:X2}",
|
||||||
|
(byte)tuple.Code);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else DicConsole.DebugWriteLine("Device-Info command", "Could not get tuples");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SD_CID))
|
||||||
|
{
|
||||||
|
byte[] cid = imageFormat.ReadDiskTag(MediaTagType.SD_CID);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("SecureDigital CID contained in image:");
|
||||||
|
DicConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifyCID(cid));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SD_CSD))
|
||||||
|
{
|
||||||
|
byte[] csd = imageFormat.ReadDiskTag(MediaTagType.SD_CSD);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("SecureDigital CSD contained in image:");
|
||||||
|
DicConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifyCSD(csd));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SD_SCR))
|
||||||
|
{
|
||||||
|
byte[] scr = imageFormat.ReadDiskTag(MediaTagType.SD_SCR);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("SecureDigital SCR contained in image:");
|
||||||
|
DicConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifySCR(scr));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SD_OCR))
|
||||||
|
{
|
||||||
|
byte[] ocr = imageFormat.ReadDiskTag(MediaTagType.SD_OCR);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("SecureDigital OCR contained in image:");
|
||||||
|
DicConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifyOCR(ocr));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.MMC_CID))
|
||||||
|
{
|
||||||
|
byte[] cid = imageFormat.ReadDiskTag(MediaTagType.MMC_CID);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("MultiMediaCard CID contained in image:");
|
||||||
|
DicConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyCID(cid));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.MMC_CSD))
|
||||||
|
{
|
||||||
|
byte[] csd = imageFormat.ReadDiskTag(MediaTagType.MMC_CSD);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("MultiMediaCard CSD contained in image:");
|
||||||
|
DicConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyCSD(csd));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.MMC_ExtendedCSD))
|
||||||
|
{
|
||||||
|
byte[] ecsd = imageFormat.ReadDiskTag(MediaTagType.MMC_ExtendedCSD);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("MultiMediaCard ExtendedCSD contained in image:");
|
||||||
|
DicConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyExtendedCSD(ecsd));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.MMC_OCR))
|
||||||
|
{
|
||||||
|
byte[] ocr = imageFormat.ReadDiskTag(MediaTagType.MMC_OCR);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("MultiMediaCard OCR contained in image:");
|
||||||
|
DicConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyOCR(ocr));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.Xbox_PFI))
|
||||||
|
{
|
||||||
|
byte[] xpfi = imageFormat.ReadDiskTag(MediaTagType.Xbox_PFI);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("Xbox Physical Format Information contained in image:");
|
||||||
|
DicConsole.Write("{0}", PFI.Prettify(xpfi));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.Xbox_DMI))
|
||||||
|
{
|
||||||
|
byte[] xdmi = imageFormat.ReadDiskTag(MediaTagType.Xbox_DMI);
|
||||||
|
|
||||||
|
if(DMI.IsXbox(xdmi))
|
||||||
|
{
|
||||||
|
DMI.XboxDMI? xmi = DMI.DecodeXbox(xdmi);
|
||||||
|
if(xmi.HasValue)
|
||||||
|
{
|
||||||
|
DicConsole.WriteLine("Xbox DMI contained in image:");
|
||||||
|
DicConsole.Write("{0}", DMI.PrettifyXbox(xmi));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DMI.IsXbox360(xdmi))
|
||||||
|
{
|
||||||
|
DMI.Xbox360DMI? xmi = DMI.DecodeXbox360(xdmi);
|
||||||
|
if(xmi.HasValue)
|
||||||
|
{
|
||||||
|
DicConsole.WriteLine("Xbox 360 DMI contained in image:");
|
||||||
|
DicConsole.Write("{0}", DMI.PrettifyXbox360(xmi));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(imageFormat.Info.ReadableMediaTags != null &&
|
||||||
|
imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.Xbox_SecuritySector))
|
||||||
|
{
|
||||||
|
byte[] toc = imageFormat.ReadDiskTag(MediaTagType.Xbox_SecuritySector);
|
||||||
|
|
||||||
|
DicConsole.WriteLine("Xbox Security Sectors contained in image:");
|
||||||
|
DicConsole.Write("{0}", SS.Prettify(toc));
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
291
DiscImageChef.Core/PrintScsiModePages.cs
Normal file
291
DiscImageChef.Core/PrintScsiModePages.cs
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
using DiscImageChef.Console;
|
||||||
|
using DiscImageChef.Decoders.SCSI;
|
||||||
|
|
||||||
|
namespace DiscImageChef.Core
|
||||||
|
{
|
||||||
|
public class PrintScsiModePages
|
||||||
|
{
|
||||||
|
public static void Print(Modes.DecodedMode decMode, PeripheralDeviceTypes devType, byte[] vendorId)
|
||||||
|
{
|
||||||
|
DicConsole.WriteLine(Modes.PrettifyModeHeader(decMode.Header, devType));
|
||||||
|
|
||||||
|
if(decMode.Pages == null) return;
|
||||||
|
|
||||||
|
foreach(Modes.ModePage page in decMode.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)
|
||||||
|
DicConsole.WriteLine(devType == PeripheralDeviceTypes.MultiMediaDevice
|
||||||
|
? Modes.PrettifyModePage_01_MMC(page.PageResponse)
|
||||||
|
: 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)
|
||||||
|
DicConsole.WriteLine(devType == PeripheralDeviceTypes.MultiMediaDevice
|
||||||
|
? Modes.PrettifyModePage_07_MMC(page.PageResponse)
|
||||||
|
: 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)
|
||||||
|
DicConsole.WriteLine(devType == PeripheralDeviceTypes.SequentialAccess
|
||||||
|
? Modes.PrettifyModePage_10_SSC(page.PageResponse)
|
||||||
|
: 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)
|
||||||
|
DicConsole.WriteLine(devType == PeripheralDeviceTypes.MultiMediaDevice
|
||||||
|
? Modes.PrettifyModePage_1C_SFF(page.PageResponse)
|
||||||
|
: 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(vendorId).Trim() == "CERTANCE")
|
||||||
|
DicConsole.WriteLine(Modes.PrettifyCertanceModePage_21(page.PageResponse));
|
||||||
|
else goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x22:
|
||||||
|
{
|
||||||
|
if(StringHandlers.CToString(vendorId).Trim() == "CERTANCE")
|
||||||
|
DicConsole.WriteLine(Modes.PrettifyCertanceModePage_22(page.PageResponse));
|
||||||
|
else goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x24:
|
||||||
|
{
|
||||||
|
if(StringHandlers.CToString(vendorId).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(vendorId).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(vendorId).Trim() == "HP")
|
||||||
|
DicConsole.WriteLine(Modes.PrettifyHPModePage_3B(page.PageResponse));
|
||||||
|
else goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x3C:
|
||||||
|
{
|
||||||
|
if(StringHandlers.CToString(vendorId).Trim() == "HP")
|
||||||
|
DicConsole.WriteLine(Modes.PrettifyHPModePage_3C(page.PageResponse));
|
||||||
|
else goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x3D:
|
||||||
|
{
|
||||||
|
if(StringHandlers.CToString(vendorId).Trim() == "IBM")
|
||||||
|
DicConsole.WriteLine(Modes.PrettifyIBMModePage_3D(page.PageResponse));
|
||||||
|
else if(StringHandlers.CToString(vendorId).Trim() == "HP")
|
||||||
|
DicConsole.WriteLine(Modes.PrettifyHPModePage_3D(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x3E:
|
||||||
|
{
|
||||||
|
if(StringHandlers.CToString(vendorId).Trim() == "FUJITSU")
|
||||||
|
DicConsole.WriteLine(Modes.PrettifyFujitsuModePage_3E(page.PageResponse));
|
||||||
|
else if(StringHandlers.CToString(vendorId).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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -360,6 +360,10 @@ namespace DiscImageChef.Core
|
|||||||
AllStats.Commands.ConvertImage++;
|
AllStats.Commands.ConvertImage++;
|
||||||
CurrentStats.Commands.ConvertImage++;
|
CurrentStats.Commands.ConvertImage++;
|
||||||
break;
|
break;
|
||||||
|
case "image-info":
|
||||||
|
AllStats.Commands.ImageInfo++;
|
||||||
|
CurrentStats.Commands.ImageInfo++;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ namespace DiscImageChef.Metadata
|
|||||||
public long Entropy;
|
public long Entropy;
|
||||||
public long ExtractFiles;
|
public long ExtractFiles;
|
||||||
public long Formats;
|
public long Formats;
|
||||||
|
public long ImageInfo;
|
||||||
public long ListDevices;
|
public long ListDevices;
|
||||||
public long ListEncodings;
|
public long ListEncodings;
|
||||||
public long Ls;
|
public long Ls;
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ namespace DiscImageChef.Server.Controllers
|
|||||||
oldStats.Commands.ListDevices += newStats.Commands.ListDevices;
|
oldStats.Commands.ListDevices += newStats.Commands.ListDevices;
|
||||||
oldStats.Commands.ListEncodings += newStats.Commands.ListEncodings;
|
oldStats.Commands.ListEncodings += newStats.Commands.ListEncodings;
|
||||||
oldStats.Commands.ConvertImage += newStats.Commands.ConvertImage;
|
oldStats.Commands.ConvertImage += newStats.Commands.ConvertImage;
|
||||||
|
oldStats.Commands.ImageInfo += newStats.Commands.ImageInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(newStats.OperatingSystems != null)
|
if(newStats.OperatingSystems != null)
|
||||||
|
|||||||
@@ -52,7 +52,8 @@
|
|||||||
</head>
|
</head>
|
||||||
<body id="body" runat="server">
|
<body id="body" runat="server">
|
||||||
<h1 align="center">
|
<h1 align="center">
|
||||||
Welcome to <i>
|
Welcome to
|
||||||
|
<i>
|
||||||
<a href="http://github.com/claunia/discimagechef" target="_blank">DiscImageChef</a>
|
<a href="http://github.com/claunia/discimagechef" target="_blank">DiscImageChef</a>
|
||||||
</i> Server version <asp:Label id="lblVersion" runat="server"/>
|
</i> Server version <asp:Label id="lblVersion" runat="server"/>
|
||||||
</h1>
|
</h1>
|
||||||
@@ -64,7 +65,8 @@
|
|||||||
<ItemTemplate>
|
<ItemTemplate>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
DiscImageChef has run on <i>
|
DiscImageChef has run on
|
||||||
|
<i>
|
||||||
<asp:Label runat="server" Text='<%# Eval("name") %>'/>
|
<asp:Label runat="server" Text='<%# Eval("name") %>'/>
|
||||||
</i> <asp:Label runat="server" Text='<%# Eval("Value") %>'/> times.
|
</i> <asp:Label runat="server" Text='<%# Eval("Value") %>'/> times.
|
||||||
</td>
|
</td>
|
||||||
@@ -80,7 +82,8 @@
|
|||||||
<ItemTemplate>
|
<ItemTemplate>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
DiscImageChef version <i>
|
DiscImageChef version
|
||||||
|
<i>
|
||||||
<asp:Label runat="server" Text='<%# Eval("name") %>'/>
|
<asp:Label runat="server" Text='<%# Eval("name") %>'/>
|
||||||
</i> has been used <asp:Label runat="server" Text='<%# Eval("Value") %>'/> times.
|
</i> has been used <asp:Label runat="server" Text='<%# Eval("Value") %>'/> times.
|
||||||
</td>
|
</td>
|
||||||
@@ -106,6 +109,7 @@
|
|||||||
<i>entropy</i> command has been run <asp:Label id="lblEntropy" runat="server"/> times<br/>
|
<i>entropy</i> command has been run <asp:Label id="lblEntropy" runat="server"/> times<br/>
|
||||||
<i>extract-files</i> command has been run <asp:Label id="lblExtractFiles" runat="server"/> times<br/>
|
<i>extract-files</i> command has been run <asp:Label id="lblExtractFiles" runat="server"/> times<br/>
|
||||||
<i>formats</i> command has been run <asp:Label id="lblFormats" runat="server"/> times<br/>
|
<i>formats</i> command has been run <asp:Label id="lblFormats" runat="server"/> times<br/>
|
||||||
|
<i>image-info</i> command has been run <asp:Label id="lblImageInfo" runat="server"/> times<br/>
|
||||||
<i>list-devices</i> command has been run <asp:Label id="lblListDevices" runat="server"/> times<br/>
|
<i>list-devices</i> command has been run <asp:Label id="lblListDevices" runat="server"/> times<br/>
|
||||||
<i>list-encodings</i> command has been run <asp:Label id="lblListEncodings" runat="server"/> times<br/>
|
<i>list-encodings</i> command has been run <asp:Label id="lblListEncodings" runat="server"/> times<br/>
|
||||||
<i>ls</i> command has been run <asp:Label id="lblLs" runat="server"/> times<br/>
|
<i>ls</i> command has been run <asp:Label id="lblLs" runat="server"/> times<br/>
|
||||||
|
|||||||
@@ -137,6 +137,7 @@ namespace DiscImageChef.Server
|
|||||||
lblListDevices.Text = statistics.Commands.ListDevices.ToString();
|
lblListDevices.Text = statistics.Commands.ListDevices.ToString();
|
||||||
lblListEncodings.Text = statistics.Commands.ListEncodings.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;
|
else divCommands.Visible = false;
|
||||||
|
|
||||||
@@ -212,7 +213,8 @@ namespace DiscImageChef.Server
|
|||||||
string url;
|
string url;
|
||||||
string xmlFile;
|
string xmlFile;
|
||||||
if(!string.IsNullOrWhiteSpace(device.Manufacturer) &&
|
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";
|
xmlFile = device.Manufacturer + "_" + device.Model + "_" + device.Revision + ".xml";
|
||||||
url =
|
url =
|
||||||
|
|||||||
2
DiscImageChef.Server/Statistics.aspx.designer.cs
generated
2
DiscImageChef.Server/Statistics.aspx.designer.cs
generated
@@ -58,6 +58,8 @@ namespace DiscImageChef.Server {
|
|||||||
|
|
||||||
protected Label lblFormats;
|
protected Label lblFormats;
|
||||||
|
|
||||||
|
protected Label lblImageInfo;
|
||||||
|
|
||||||
protected Label lblListDevices;
|
protected Label lblListDevices;
|
||||||
|
|
||||||
protected Label lblListEncodings;
|
protected Label lblListEncodings;
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ namespace DiscImageChef.Commands
|
|||||||
DicConsole.DebugWriteLine("Analyze command", "--input={0}", options.InputFile);
|
DicConsole.DebugWriteLine("Analyze command", "--input={0}", options.InputFile);
|
||||||
DicConsole.DebugWriteLine("Analyze command", "--filesystems={0}", options.SearchForFilesystems);
|
DicConsole.DebugWriteLine("Analyze command", "--filesystems={0}", options.SearchForFilesystems);
|
||||||
DicConsole.DebugWriteLine("Analyze command", "--partitions={0}", options.SearchForPartitions);
|
DicConsole.DebugWriteLine("Analyze command", "--partitions={0}", options.SearchForPartitions);
|
||||||
|
DicConsole.DebugWriteLine("Analyze command", "--encoding={0}", options.EncodingName);
|
||||||
|
|
||||||
FiltersList filtersList = new FiltersList();
|
FiltersList filtersList = new FiltersList();
|
||||||
IFilter inputFilter = filtersList.GetFilter(options.InputFile);
|
IFilter inputFilter = filtersList.GetFilter(options.InputFile);
|
||||||
@@ -93,6 +94,7 @@ namespace DiscImageChef.Commands
|
|||||||
DicConsole.VerboseWriteLine("Image format identified by {0} ({1}).", imageFormat.Name,
|
DicConsole.VerboseWriteLine("Image format identified by {0} ({1}).", imageFormat.Name,
|
||||||
imageFormat.Id);
|
imageFormat.Id);
|
||||||
else DicConsole.WriteLine("Image format identified by {0}.", imageFormat.Name);
|
else DicConsole.WriteLine("Image format identified by {0}.", imageFormat.Name);
|
||||||
|
DicConsole.WriteLine();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -103,12 +105,11 @@ namespace DiscImageChef.Commands
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("Analyze command", "Correctly opened image file.");
|
if(options.Verbose)
|
||||||
DicConsole.DebugWriteLine("Analyze command", "Image without headers is {0} bytes.",
|
{
|
||||||
imageFormat.Info.ImageSize);
|
Core.ImageInfo.PrintImageInfo(imageFormat);
|
||||||
DicConsole.DebugWriteLine("Analyze command", "Image has {0} sectors.", imageFormat.Info.Sectors);
|
DicConsole.WriteLine();
|
||||||
DicConsole.DebugWriteLine("Analyze command", "Image identifies disk type as {0}.",
|
}
|
||||||
imageFormat.Info.MediaType);
|
|
||||||
|
|
||||||
Core.Statistics.AddMediaFormat(imageFormat.Format);
|
Core.Statistics.AddMediaFormat(imageFormat.Format);
|
||||||
Core.Statistics.AddMedia(imageFormat.Info.MediaType, false);
|
Core.Statistics.AddMedia(imageFormat.Info.MediaType, false);
|
||||||
|
|||||||
@@ -118,8 +118,8 @@ namespace DiscImageChef.Commands
|
|||||||
|
|
||||||
bool imagesDiffer = false;
|
bool imagesDiffer = false;
|
||||||
|
|
||||||
ImageInfo image1Info = new ImageInfo();
|
DiscImages.ImageInfo image1Info = new DiscImages.ImageInfo();
|
||||||
ImageInfo image2Info = new ImageInfo();
|
DiscImages.ImageInfo image2Info = new DiscImages.ImageInfo();
|
||||||
List<Session> image1Sessions = new List<Session>();
|
List<Session> image1Sessions = new List<Session>();
|
||||||
List<Session> image2Sessions = new List<Session>();
|
List<Session> image2Sessions = new List<Session>();
|
||||||
Dictionary<MediaTagType, byte[]> image1DiskTags = new Dictionary<MediaTagType, byte[]>();
|
Dictionary<MediaTagType, byte[]> image1DiskTags = new Dictionary<MediaTagType, byte[]>();
|
||||||
@@ -221,8 +221,8 @@ namespace DiscImageChef.Commands
|
|||||||
|
|
||||||
if(options.Verbose)
|
if(options.Verbose)
|
||||||
{
|
{
|
||||||
sb.AppendFormat("Has partitions?\t{0}\t{1}", image1Info.HasPartitions,
|
sb.AppendFormat("Has partitions?\t{0}\t{1}", image1Info.HasPartitions, image2Info.HasPartitions)
|
||||||
image2Info.HasPartitions).AppendLine();
|
.AppendLine();
|
||||||
sb.AppendFormat("Has sessions?\t{0}\t{1}", image1Info.HasSessions, image2Info.HasSessions)
|
sb.AppendFormat("Has sessions?\t{0}\t{1}", image1Info.HasSessions, image2Info.HasSessions)
|
||||||
.AppendLine();
|
.AppendLine();
|
||||||
sb.AppendFormat("Image size\t{0}\t{1}", image1Info.ImageSize, image2Info.ImageSize).AppendLine();
|
sb.AppendFormat("Image size\t{0}\t{1}", image1Info.ImageSize, image2Info.ImageSize).AppendLine();
|
||||||
@@ -232,18 +232,16 @@ namespace DiscImageChef.Commands
|
|||||||
.AppendLine();
|
.AppendLine();
|
||||||
sb.AppendFormat("Last modification time\t{0}\t{1}", image1Info.LastModificationTime,
|
sb.AppendFormat("Last modification time\t{0}\t{1}", image1Info.LastModificationTime,
|
||||||
image2Info.LastModificationTime).AppendLine();
|
image2Info.LastModificationTime).AppendLine();
|
||||||
sb.AppendFormat("Disk type\t{0}\t{1}", image1Info.MediaType, image2Info.MediaType).AppendLine();
|
sb.AppendFormat("Disk type\t{0}\t{1}", image1Info.MediaType, image2Info.MediaType)
|
||||||
sb.AppendFormat("Image version\t{0}\t{1}", image1Info.Version, image2Info.Version)
|
|
||||||
.AppendLine();
|
.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)
|
sb.AppendFormat("Image application\t{0}\t{1}", image1Info.Application, image2Info.Application)
|
||||||
.AppendLine();
|
.AppendLine();
|
||||||
sb.AppendFormat("Image application version\t{0}\t{1}", image1Info.ApplicationVersion,
|
sb.AppendFormat("Image application version\t{0}\t{1}", image1Info.ApplicationVersion,
|
||||||
image2Info.ApplicationVersion).AppendLine();
|
image2Info.ApplicationVersion).AppendLine();
|
||||||
sb.AppendFormat("Image creator\t{0}\t{1}", image1Info.Creator, image2Info.Creator)
|
sb.AppendFormat("Image creator\t{0}\t{1}", image1Info.Creator, image2Info.Creator).AppendLine();
|
||||||
.AppendLine();
|
|
||||||
sb.AppendFormat("Image name\t{0}\t{1}", image1Info.MediaTitle, image2Info.MediaTitle).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)
|
sb.AppendFormat("Image comments\t{0}\t{1}", image1Info.Comments, image2Info.Comments).AppendLine();
|
||||||
.AppendLine();
|
|
||||||
sb.AppendFormat("Disk manufacturer\t{0}\t{1}", image1Info.MediaManufacturer,
|
sb.AppendFormat("Disk manufacturer\t{0}\t{1}", image1Info.MediaManufacturer,
|
||||||
image2Info.MediaManufacturer).AppendLine();
|
image2Info.MediaManufacturer).AppendLine();
|
||||||
sb.AppendFormat("Disk model\t{0}\t{1}", image1Info.MediaModel, image2Info.MediaModel).AppendLine();
|
sb.AppendFormat("Disk model\t{0}\t{1}", image1Info.MediaModel, image2Info.MediaModel).AppendLine();
|
||||||
@@ -276,121 +274,145 @@ namespace DiscImageChef.Commands
|
|||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image partitioned status differ");
|
if(!options.Verbose) sb.AppendLine("Image partitioned status differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.HasSessions != image2Info.HasSessions)
|
if(image1Info.HasSessions != image2Info.HasSessions)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image session status differ");
|
if(!options.Verbose) sb.AppendLine("Image session status differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.ImageSize != image2Info.ImageSize)
|
if(image1Info.ImageSize != image2Info.ImageSize)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image size differ");
|
if(!options.Verbose) sb.AppendLine("Image size differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.Sectors != image2Info.Sectors)
|
if(image1Info.Sectors != image2Info.Sectors)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image sectors differ");
|
if(!options.Verbose) sb.AppendLine("Image sectors differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.SectorSize != image2Info.SectorSize)
|
if(image1Info.SectorSize != image2Info.SectorSize)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image sector size differ");
|
if(!options.Verbose) sb.AppendLine("Image sector size differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.CreationTime != image2Info.CreationTime)
|
if(image1Info.CreationTime != image2Info.CreationTime)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image creation time differ");
|
if(!options.Verbose) sb.AppendLine("Image creation time differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.LastModificationTime != image2Info.LastModificationTime)
|
if(image1Info.LastModificationTime != image2Info.LastModificationTime)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image last modification time differ");
|
if(!options.Verbose) sb.AppendLine("Image last modification time differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.MediaType != image2Info.MediaType)
|
if(image1Info.MediaType != image2Info.MediaType)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Disk type differ");
|
if(!options.Verbose) sb.AppendLine("Disk type differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.Version != image2Info.Version)
|
if(image1Info.Version != image2Info.Version)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image version differ");
|
if(!options.Verbose) sb.AppendLine("Image version differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.Application != image2Info.Application)
|
if(image1Info.Application != image2Info.Application)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image application differ");
|
if(!options.Verbose) sb.AppendLine("Image application differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.ApplicationVersion != image2Info.ApplicationVersion)
|
if(image1Info.ApplicationVersion != image2Info.ApplicationVersion)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image application version differ");
|
if(!options.Verbose) sb.AppendLine("Image application version differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.Creator != image2Info.Creator)
|
if(image1Info.Creator != image2Info.Creator)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image creator differ");
|
if(!options.Verbose) sb.AppendLine("Image creator differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.MediaTitle != image2Info.MediaTitle)
|
if(image1Info.MediaTitle != image2Info.MediaTitle)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image name differ");
|
if(!options.Verbose) sb.AppendLine("Image name differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.Comments != image2Info.Comments)
|
if(image1Info.Comments != image2Info.Comments)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Image comments differ");
|
if(!options.Verbose) sb.AppendLine("Image comments differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.MediaManufacturer != image2Info.MediaManufacturer)
|
if(image1Info.MediaManufacturer != image2Info.MediaManufacturer)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Disk manufacturer differ");
|
if(!options.Verbose) sb.AppendLine("Disk manufacturer differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.MediaModel != image2Info.MediaModel)
|
if(image1Info.MediaModel != image2Info.MediaModel)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Disk model differ");
|
if(!options.Verbose) sb.AppendLine("Disk model differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.MediaSerialNumber != image2Info.MediaSerialNumber)
|
if(image1Info.MediaSerialNumber != image2Info.MediaSerialNumber)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Disk serial number differ");
|
if(!options.Verbose) sb.AppendLine("Disk serial number differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.MediaBarcode != image2Info.MediaBarcode)
|
if(image1Info.MediaBarcode != image2Info.MediaBarcode)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Disk barcode differ");
|
if(!options.Verbose) sb.AppendLine("Disk barcode differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.MediaPartNumber != image2Info.MediaPartNumber)
|
if(image1Info.MediaPartNumber != image2Info.MediaPartNumber)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Disk part number differ");
|
if(!options.Verbose) sb.AppendLine("Disk part number differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.MediaSequence != image2Info.MediaSequence)
|
if(image1Info.MediaSequence != image2Info.MediaSequence)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Disk sequence differ");
|
if(!options.Verbose) sb.AppendLine("Disk sequence differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.LastMediaSequence != image2Info.LastMediaSequence)
|
if(image1Info.LastMediaSequence != image2Info.LastMediaSequence)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Last disk in sequence differ");
|
if(!options.Verbose) sb.AppendLine("Last disk in sequence differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.DriveManufacturer != image2Info.DriveManufacturer)
|
if(image1Info.DriveManufacturer != image2Info.DriveManufacturer)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Drive manufacturer differ");
|
if(!options.Verbose) sb.AppendLine("Drive manufacturer differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.DriveModel != image2Info.DriveModel)
|
if(image1Info.DriveModel != image2Info.DriveModel)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Drive model differ");
|
if(!options.Verbose) sb.AppendLine("Drive model differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.DriveSerialNumber != image2Info.DriveSerialNumber)
|
if(image1Info.DriveSerialNumber != image2Info.DriveSerialNumber)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
if(!options.Verbose) sb.AppendLine("Drive serial number differ");
|
if(!options.Verbose) sb.AppendLine("Drive serial number differ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(image1Info.DriveFirmwareRevision != image2Info.DriveFirmwareRevision)
|
if(image1Info.DriveFirmwareRevision != image2Info.DriveFirmwareRevision)
|
||||||
{
|
{
|
||||||
imagesDiffer = true;
|
imagesDiffer = true;
|
||||||
@@ -410,7 +432,8 @@ namespace DiscImageChef.Commands
|
|||||||
leastSectors = image2Info.Sectors;
|
leastSectors = image2Info.Sectors;
|
||||||
if(!options.Verbose) sb.AppendLine("Image 1 has more sectors");
|
if(!options.Verbose) sb.AppendLine("Image 1 has more sectors");
|
||||||
}
|
}
|
||||||
else leastSectors = image1Info.Sectors;
|
else
|
||||||
|
leastSectors = image1Info.Sectors;
|
||||||
|
|
||||||
DicConsole.WriteLine("Comparing sectors...");
|
DicConsole.WriteLine("Comparing sectors...");
|
||||||
|
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ namespace DiscImageChef.Commands
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageInfo metadata = new ImageInfo
|
DiscImages.ImageInfo metadata = new DiscImages.ImageInfo
|
||||||
{
|
{
|
||||||
Application = "DiscImageChef",
|
Application = "DiscImageChef",
|
||||||
ApplicationVersion = Version.GetVersion(),
|
ApplicationVersion = Version.GetVersion(),
|
||||||
|
|||||||
@@ -489,10 +489,11 @@ namespace DiscImageChef.Commands
|
|||||||
$"_scsi_evpd_{page:X2}h.bin", $"SCSI INQUIRY EVPD {page:X2}h",
|
$"_scsi_evpd_{page:X2}h.bin", $"SCSI INQUIRY EVPD {page:X2}h",
|
||||||
inqBuf);
|
inqBuf);
|
||||||
}
|
}
|
||||||
else if(
|
else if((page == 0xC2 || page == 0xC3 || page == 0xC4 || page == 0xC5 ||
|
||||||
(page == 0xC2 || page == 0xC3 || page == 0xC4 || page == 0xC5 || page == 0xC6) &&
|
page == 0xC6) &&
|
||||||
StringHandlers.CToString(inq.Value.VendorIdentification).ToLowerInvariant()
|
StringHandlers
|
||||||
.Trim() == "certance")
|
.CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
|
||||||
|
"certance")
|
||||||
{
|
{
|
||||||
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
|
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
|
||||||
if(sense) continue;
|
if(sense) continue;
|
||||||
@@ -505,8 +506,7 @@ namespace DiscImageChef.Commands
|
|||||||
else if((page == 0xC0 || page == 0xC1 || page == 0xC2 || page == 0xC3 || page == 0xC4 ||
|
else if((page == 0xC0 || page == 0xC1 || page == 0xC2 || page == 0xC3 || page == 0xC4 ||
|
||||||
page == 0xC5) &&
|
page == 0xC5) &&
|
||||||
StringHandlers
|
StringHandlers
|
||||||
.CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() ==
|
.CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() == "hp")
|
||||||
"hp")
|
|
||||||
{
|
{
|
||||||
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
|
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
|
||||||
if(sense) continue;
|
if(sense) continue;
|
||||||
@@ -572,300 +572,7 @@ namespace DiscImageChef.Commands
|
|||||||
"SCSI MODE SENSE", modeBuf);
|
"SCSI MODE SENSE", modeBuf);
|
||||||
|
|
||||||
if(decMode.HasValue)
|
if(decMode.HasValue)
|
||||||
{
|
PrintScsiModePages.Print(decMode.Value, devType, inq.Value.VendorIdentification);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(devType)
|
switch(devType)
|
||||||
{
|
{
|
||||||
@@ -1343,6 +1050,7 @@ namespace DiscImageChef.Commands
|
|||||||
if(krFeatures.HasFlag(KreonFeatures.ErrorSkipping))
|
if(krFeatures.HasFlag(KreonFeatures.ErrorSkipping))
|
||||||
DicConsole.WriteLine("\tCan skip read errors");
|
DicConsole.WriteLine("\tCan skip read errors");
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case PeripheralDeviceTypes.SequentialAccess:
|
case PeripheralDeviceTypes.SequentialAccess:
|
||||||
|
|
||||||
@@ -1388,8 +1096,10 @@ namespace DiscImageChef.Commands
|
|||||||
DicConsole.WriteLine("Medium types supported by device:");
|
DicConsole.WriteLine("Medium types supported by device:");
|
||||||
DicConsole.WriteLine(DensitySupport.PrettifyMediumType(meds));
|
DicConsole.WriteLine(DensitySupport.PrettifyMediumType(meds));
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine(DensitySupport.PrettifyMediumType(seqBuf));
|
DicConsole.WriteLine(DensitySupport.PrettifyMediumType(seqBuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1407,6 +1117,7 @@ namespace DiscImageChef.Commands
|
|||||||
mmcBuf);
|
mmcBuf);
|
||||||
DicConsole.WriteLine("{0}", Decoders.MMC.Decoders.PrettifyCID(mmcBuf));
|
DicConsole.WriteLine("{0}", Decoders.MMC.Decoders.PrettifyCID(mmcBuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
sense = dev.ReadCsd(out mmcBuf, out _, dev.Timeout, out _);
|
sense = dev.ReadCsd(out mmcBuf, out _, dev.Timeout, out _);
|
||||||
if(!sense)
|
if(!sense)
|
||||||
{
|
{
|
||||||
@@ -1415,6 +1126,7 @@ namespace DiscImageChef.Commands
|
|||||||
mmcBuf);
|
mmcBuf);
|
||||||
DicConsole.WriteLine("{0}", Decoders.MMC.Decoders.PrettifyCSD(mmcBuf));
|
DicConsole.WriteLine("{0}", Decoders.MMC.Decoders.PrettifyCSD(mmcBuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
sense = dev.ReadOcr(out mmcBuf, out _, dev.Timeout, out _);
|
sense = dev.ReadOcr(out mmcBuf, out _, dev.Timeout, out _);
|
||||||
if(!sense)
|
if(!sense)
|
||||||
{
|
{
|
||||||
@@ -1423,6 +1135,7 @@ namespace DiscImageChef.Commands
|
|||||||
mmcBuf);
|
mmcBuf);
|
||||||
DicConsole.WriteLine("{0}", Decoders.MMC.Decoders.PrettifyOCR(mmcBuf));
|
DicConsole.WriteLine("{0}", Decoders.MMC.Decoders.PrettifyOCR(mmcBuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
sense = dev.ReadExtendedCsd(out mmcBuf, out _, dev.Timeout, out _);
|
sense = dev.ReadExtendedCsd(out mmcBuf, out _, dev.Timeout, out _);
|
||||||
if(!sense)
|
if(!sense)
|
||||||
{
|
{
|
||||||
@@ -1447,6 +1160,7 @@ namespace DiscImageChef.Commands
|
|||||||
"SecureDigital CID", sdBuf);
|
"SecureDigital CID", sdBuf);
|
||||||
DicConsole.WriteLine("{0}", Decoders.SecureDigital.Decoders.PrettifyCID(sdBuf));
|
DicConsole.WriteLine("{0}", Decoders.SecureDigital.Decoders.PrettifyCID(sdBuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
sense = dev.ReadCsd(out sdBuf, out _, dev.Timeout, out _);
|
sense = dev.ReadCsd(out sdBuf, out _, dev.Timeout, out _);
|
||||||
if(!sense)
|
if(!sense)
|
||||||
{
|
{
|
||||||
@@ -1455,6 +1169,7 @@ namespace DiscImageChef.Commands
|
|||||||
"SecureDigital CSD", sdBuf);
|
"SecureDigital CSD", sdBuf);
|
||||||
DicConsole.WriteLine("{0}", Decoders.SecureDigital.Decoders.PrettifyCSD(sdBuf));
|
DicConsole.WriteLine("{0}", Decoders.SecureDigital.Decoders.PrettifyCSD(sdBuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
sense = dev.ReadSdocr(out sdBuf, out _, dev.Timeout, out _);
|
sense = dev.ReadSdocr(out sdBuf, out _, dev.Timeout, out _);
|
||||||
if(!sense)
|
if(!sense)
|
||||||
{
|
{
|
||||||
@@ -1463,6 +1178,7 @@ namespace DiscImageChef.Commands
|
|||||||
"SecureDigital OCR", sdBuf);
|
"SecureDigital OCR", sdBuf);
|
||||||
DicConsole.WriteLine("{0}", Decoders.SecureDigital.Decoders.PrettifyOCR(sdBuf));
|
DicConsole.WriteLine("{0}", Decoders.SecureDigital.Decoders.PrettifyOCR(sdBuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
sense = dev.ReadScr(out sdBuf, out _, dev.Timeout, out _);
|
sense = dev.ReadScr(out sdBuf, out _, dev.Timeout, out _);
|
||||||
if(!sense)
|
if(!sense)
|
||||||
{
|
{
|
||||||
|
|||||||
102
DiscImageChef/Commands/ImageInfo.cs
Normal file
102
DiscImageChef/Commands/ImageInfo.cs
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
// /***************************************************************************
|
||||||
|
// The Disc Image Chef
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Filename : ImageInfo.cs
|
||||||
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
||||||
|
//
|
||||||
|
// 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 <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// 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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -63,6 +63,9 @@ namespace DiscImageChef.Commands
|
|||||||
if(Core.Statistics.AllStats.Commands.Compare > 0)
|
if(Core.Statistics.AllStats.Commands.Compare > 0)
|
||||||
DicConsole.WriteLine("You have called the Compare command {0} times",
|
DicConsole.WriteLine("You have called the Compare command {0} times",
|
||||||
Core.Statistics.AllStats.Commands.Compare);
|
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)
|
if(Core.Statistics.AllStats.Commands.CreateSidecar > 0)
|
||||||
DicConsole.WriteLine("You have called the Create-Sidecar command {0} times",
|
DicConsole.WriteLine("You have called the Create-Sidecar command {0} times",
|
||||||
Core.Statistics.AllStats.Commands.CreateSidecar);
|
Core.Statistics.AllStats.Commands.CreateSidecar);
|
||||||
@@ -84,6 +87,9 @@ namespace DiscImageChef.Commands
|
|||||||
if(Core.Statistics.AllStats.Commands.Formats > 0)
|
if(Core.Statistics.AllStats.Commands.Formats > 0)
|
||||||
DicConsole.WriteLine("You have called the Formats command {0} times",
|
DicConsole.WriteLine("You have called the Formats command {0} times",
|
||||||
Core.Statistics.AllStats.Commands.Formats);
|
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)
|
if(Core.Statistics.AllStats.Commands.MediaInfo > 0)
|
||||||
DicConsole.WriteLine("You have called the Media-Info command {0} times",
|
DicConsole.WriteLine("You have called the Media-Info command {0} times",
|
||||||
Core.Statistics.AllStats.Commands.MediaInfo);
|
Core.Statistics.AllStats.Commands.MediaInfo);
|
||||||
|
|||||||
@@ -52,6 +52,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Commands\ConvertImage.cs" />
|
<Compile Include="Commands\ConvertImage.cs" />
|
||||||
|
<Compile Include="Commands\ImageInfo.cs" />
|
||||||
<Compile Include="Commands\ListOptions.cs" />
|
<Compile Include="Commands\ListOptions.cs" />
|
||||||
<Compile Include="Main.cs" />
|
<Compile Include="Main.cs" />
|
||||||
<Compile Include="AssemblyInfo.cs" />
|
<Compile Include="AssemblyInfo.cs" />
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ namespace DiscImageChef
|
|||||||
typeof(ConvertImageOptions), typeof(CreateSidecarOptions),
|
typeof(ConvertImageOptions), typeof(CreateSidecarOptions),
|
||||||
typeof(DecodeOptions), typeof(DeviceInfoOptions), typeof(DeviceReportOptions),
|
typeof(DecodeOptions), typeof(DeviceInfoOptions), typeof(DeviceReportOptions),
|
||||||
typeof(DumpMediaOptions), typeof(EntropyOptions), typeof(ExtractFilesOptions),
|
typeof(DumpMediaOptions), typeof(EntropyOptions), typeof(ExtractFilesOptions),
|
||||||
typeof(FormatsOptions), typeof(ListDevicesOptions),
|
typeof(FormatsOptions), typeof(ImageInfoOptions), typeof(ListDevicesOptions),
|
||||||
typeof(ListEncodingsOptions), typeof(ListOptionsOptions), typeof(LsOptions),
|
typeof(ListEncodingsOptions), typeof(ListOptionsOptions), typeof(LsOptions),
|
||||||
typeof(MediaInfoOptions), typeof(MediaScanOptions), typeof(PrintHexOptions),
|
typeof(MediaInfoOptions), typeof(MediaScanOptions), typeof(PrintHexOptions),
|
||||||
typeof(StatsOptions), typeof(VerifyOptions))
|
typeof(StatsOptions), typeof(VerifyOptions))
|
||||||
@@ -186,6 +186,12 @@ namespace DiscImageChef
|
|||||||
if(opts.Verbose) DicConsole.VerboseWriteLineEvent += System.Console.WriteLine;
|
if(opts.Verbose) DicConsole.VerboseWriteLineEvent += System.Console.WriteLine;
|
||||||
PrintCopyright();
|
PrintCopyright();
|
||||||
ConvertImage.DoConvert(opts);
|
ConvertImage.DoConvert(opts);
|
||||||
|
}).WithParsed<ImageInfoOptions>(opts =>
|
||||||
|
{
|
||||||
|
if(opts.Debug) DicConsole.DebugWriteLineEvent += System.Console.Error.WriteLine;
|
||||||
|
if(opts.Verbose) DicConsole.VerboseWriteLineEvent += System.Console.WriteLine;
|
||||||
|
PrintCopyright();
|
||||||
|
ImageInfo.GetImageInfo(opts);
|
||||||
}).WithParsed<ConfigureOptions>(opts =>
|
}).WithParsed<ConfigureOptions>(opts =>
|
||||||
{
|
{
|
||||||
PrintCopyright();
|
PrintCopyright();
|
||||||
|
|||||||
@@ -430,4 +430,12 @@ namespace DiscImageChef
|
|||||||
HelpText = "Comma separated name=value pairs of options to pass to output image plugin")]
|
HelpText = "Comma separated name=value pairs of options to pass to output image plugin")]
|
||||||
public string Options { get; set; }
|
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; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user