Add support for REV120.

This commit is contained in:
2019-09-19 16:39:32 +01:00
parent 44a4fab381
commit 7f01bc5940
6 changed files with 1511 additions and 1343 deletions

View File

@@ -21,7 +21,7 @@ After adding enhanced support all drives will be given to the Canary Islands Com
- Iomega Bernoulli - Iomega Bernoulli
- Iomega Ditto drive and tapes - Iomega Ditto drive and tapes
- Iomega JAZ and JAZ 2 - Iomega JAZ and JAZ 2
- Iomega REV 70Gb and 120Gb - Iomega REV 70Gb
- Iomega ZIP750 drive - Iomega ZIP750 drive
- LD-ROM drive and media - LD-ROM drive and media
- LTO drive and tapes - LTO drive and tapes

View File

@@ -119,8 +119,10 @@ namespace DiscImageChef.CommonTypes
if (blocks == 1440) return MediaType.DOS_35_DS_DD_9; if (blocks == 1440) return MediaType.DOS_35_DS_DD_9;
} }
else if (blockSize == 1024) else if (blockSize == 1024)
{
if (blocks == 1232) if (blocks == 1232)
return MediaType.NEC_35_HD_8; return MediaType.NEC_35_HD_8;
}
return MediaType.Unknown; return MediaType.Unknown;
} }
@@ -402,7 +404,10 @@ namespace DiscImageChef.CommonTypes
case 0x41: case 0x41:
switch (blocks) switch (blocks)
{ {
case 58620544: return MediaType.REV120;
case 17090880: return MediaType.REV35; case 17090880: return MediaType.REV35;
// TODO: Unknown value
default: return MediaType.REV70;
} }
break; break;
@@ -668,7 +673,10 @@ namespace DiscImageChef.CommonTypes
break; break;
} }
case 0x40: { return MediaType.LTO; } case 0x40:
{
return MediaType.LTO;
}
} }
} }
@@ -1596,7 +1604,10 @@ namespace DiscImageChef.CommonTypes
break; break;
// Host managed zoned block device // Host managed zoned block device
case 0x14: { return MediaType.Zone_HDD; } case 0x14:
{
return MediaType.Zone_HDD;
}
} }
return MediaType.Unknown; return MediaType.Unknown;

View File

@@ -58,15 +58,15 @@ namespace DiscImageChef.Core.Devices.Dumping
{ {
bool sense; bool sense;
byte[] tmpBuf; byte[] tmpBuf;
bool compactDisc = true; var compactDisc = true;
bool isXbox = false; var isXbox = false;
// TODO: Log not only what is it reading, but if it was read correctly or not. // TODO: Log not only what is it reading, but if it was read correctly or not.
sense = dev.GetConfiguration(out byte[] cmdBuf, out _, 0, MmcGetConfigurationRt.Current, dev.Timeout, sense = dev.GetConfiguration(out var cmdBuf, out _, 0, MmcGetConfigurationRt.Current, dev.Timeout,
out _); out _);
if (!sense) if (!sense)
{ {
Features.SeparatedFeatures ftr = Features.Separate(cmdBuf); var ftr = Features.Separate(cmdBuf);
dumpLog.WriteLine("Device reports current profile is 0x{0:X4}", ftr.CurrentProfile); dumpLog.WriteLine("Device reports current profile is 0x{0:X4}", ftr.CurrentProfile);
switch (ftr.CurrentProfile) switch (ftr.CurrentProfile)
@@ -173,10 +173,10 @@ namespace DiscImageChef.Core.Devices.Dumping
return; return;
} }
Reader scsiReader = new Reader(dev, dev.Timeout, null, dumpRaw); var scsiReader = new Reader(dev, dev.Timeout, null, dumpRaw);
ulong blocks = scsiReader.GetDeviceBlocks(); var blocks = scsiReader.GetDeviceBlocks();
dumpLog.WriteLine("Device reports disc has {0} blocks", blocks); dumpLog.WriteLine("Device reports disc has {0} blocks", blocks);
Dictionary<MediaTagType, byte[]> mediaTags = new Dictionary<MediaTagType, byte[]>(); var mediaTags = new Dictionary<MediaTagType, byte[]>();
if (dskType == MediaType.PD650) if (dskType == MediaType.PD650)
switch (blocks + 1) switch (blocks + 1)
@@ -184,12 +184,20 @@ namespace DiscImageChef.Core.Devices.Dumping
case 1281856: case 1281856:
dskType = MediaType.PD650_WORM; dskType = MediaType.PD650_WORM;
break; break;
case 58620544:
dskType = MediaType.REV120;
break;
case 17090880: case 17090880:
dskType = MediaType.REV35; dskType = MediaType.REV35;
break; break;
// TODO: Unknown value
default:
dskType = MediaType.REV70;
break;
} }
#region Nintendo #region Nintendo
switch (dskType) switch (dskType)
{ {
case MediaType.Unknown when blocks > 0: case MediaType.Unknown when blocks > 0:
@@ -198,7 +206,7 @@ namespace DiscImageChef.Core.Devices.Dumping
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _); MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _);
if (!sense) if (!sense)
{ {
PFI.PhysicalFormatInformation? nintendoPfi = PFI.Decode(cmdBuf); var nintendoPfi = PFI.Decode(cmdBuf);
if (nintendoPfi != null) if (nintendoPfi != null)
if (nintendoPfi.Value.DiskCategory == DiskCategory.Nintendo && if (nintendoPfi.Value.DiskCategory == DiskCategory.Nintendo &&
nintendoPfi.Value.PartVersion == 15) nintendoPfi.Value.PartVersion == 15)
@@ -238,7 +246,7 @@ namespace DiscImageChef.Core.Devices.Dumping
Array.Copy(cmdBuf, 4, tmpBuf, 0, cmdBuf.Length - 4); Array.Copy(cmdBuf, 4, tmpBuf, 0, cmdBuf.Length - 4);
mediaTags.Add(MediaTagType.DVD_PFI, tmpBuf); mediaTags.Add(MediaTagType.DVD_PFI, tmpBuf);
PFI.PhysicalFormatInformation decPfi = PFI.Decode(cmdBuf).Value; var decPfi = PFI.Decode(cmdBuf).Value;
UpdateStatus?.Invoke($"PFI:\n{PFI.Prettify(decPfi)}"); UpdateStatus?.Invoke($"PFI:\n{PFI.Prettify(decPfi)}");
// False book types // False book types
@@ -298,7 +306,10 @@ namespace DiscImageChef.Core.Devices.Dumping
{ {
if (DMI.IsXbox(cmdBuf) || DMI.IsXbox360(cmdBuf)) if (DMI.IsXbox(cmdBuf) || DMI.IsXbox360(cmdBuf))
{ {
if(DMI.IsXbox(cmdBuf)) dskType = MediaType.XGD; if (DMI.IsXbox(cmdBuf))
{
dskType = MediaType.XGD;
}
else if (DMI.IsXbox360(cmdBuf)) else if (DMI.IsXbox360(cmdBuf))
{ {
dskType = MediaType.XGD2; dskType = MediaType.XGD2;
@@ -310,7 +321,7 @@ namespace DiscImageChef.Core.Devices.Dumping
dskType = MediaType.XGD3; dskType = MediaType.XGD3;
} }
sense = dev.ScsiInquiry(out byte[] inqBuf, out _); sense = dev.ScsiInquiry(out var inqBuf, out _);
if (sense || !Inquiry.Decode(inqBuf).HasValue || Inquiry.Decode(inqBuf).HasValue && if (sense || !Inquiry.Decode(inqBuf).HasValue || Inquiry.Decode(inqBuf).HasValue &&
!Inquiry.Decode(inqBuf).Value.KreonPresent) !Inquiry.Decode(inqBuf).Value.KreonPresent)
@@ -324,7 +335,8 @@ namespace DiscImageChef.Core.Devices.Dumping
if (dumpRaw && !force) if (dumpRaw && !force)
{ {
StoppingErrorMessage StoppingErrorMessage
?.Invoke("Not continuing. If you want to continue reading cooked data when raw is not available use the force option."); ?.Invoke(
"Not continuing. If you want to continue reading cooked data when raw is not available use the force option.");
// TODO: Exit more gracefully // TODO: Exit more gracefully
return; return;
} }
@@ -342,12 +354,15 @@ namespace DiscImageChef.Core.Devices.Dumping
break; break;
} }
#endregion Nintendo #endregion Nintendo
#region All DVD and HD DVD types #region All DVD and HD DVD types
#endregion All DVD and HD DVD types #endregion All DVD and HD DVD types
#region DVD-ROM #region DVD-ROM
if (dskType == MediaType.DVDDownload || dskType == MediaType.DVDROM) if (dskType == MediaType.DVDDownload || dskType == MediaType.DVDROM)
{ {
dumpLog.WriteLine("Reading Lead-in Copyright Information."); dumpLog.WriteLine("Reading Lead-in Copyright Information.");
@@ -361,11 +376,13 @@ namespace DiscImageChef.Core.Devices.Dumping
mediaTags.Add(MediaTagType.DVD_CMI, tmpBuf); mediaTags.Add(MediaTagType.DVD_CMI, tmpBuf);
} }
} }
#endregion DVD-ROM #endregion DVD-ROM
switch (dskType) switch (dskType)
{ {
#region DVD-ROM and HD DVD-ROM #region DVD-ROM and HD DVD-ROM
case MediaType.DVDDownload: case MediaType.DVDDownload:
case MediaType.DVDROM: case MediaType.DVDROM:
case MediaType.HDDVDROM: case MediaType.HDDVDROM:
@@ -380,9 +397,11 @@ namespace DiscImageChef.Core.Devices.Dumping
} }
break; break;
#endregion DVD-ROM and HD DVD-ROM #endregion DVD-ROM and HD DVD-ROM
#region DVD-RAM and HD DVD-RAM #region DVD-RAM and HD DVD-RAM
case MediaType.DVDRAM: case MediaType.DVDRAM:
case MediaType.HDDVDRAM: case MediaType.HDDVDRAM:
dumpLog.WriteLine("Reading Disc Description Structure."); dumpLog.WriteLine("Reading Disc Description Structure.");
@@ -409,9 +428,11 @@ namespace DiscImageChef.Core.Devices.Dumping
} }
break; break;
#endregion DVD-RAM and HD DVD-RAM #endregion DVD-RAM and HD DVD-RAM
#region DVD-R and DVD-RW #region DVD-R and DVD-RW
case MediaType.DVDR: case MediaType.DVDR:
case MediaType.DVDRW: case MediaType.DVDRW:
dumpLog.WriteLine("Reading Pre-Recorded Information."); dumpLog.WriteLine("Reading Pre-Recorded Information.");
@@ -425,12 +446,14 @@ namespace DiscImageChef.Core.Devices.Dumping
} }
break; break;
#endregion DVD-R and DVD-RW #endregion DVD-R and DVD-RW
} }
switch (dskType) switch (dskType)
{ {
#region DVD-R, DVD-RW and HD DVD-R #region DVD-R, DVD-RW and HD DVD-R
case MediaType.DVDR: case MediaType.DVDR:
case MediaType.DVDRW: case MediaType.DVDRW:
case MediaType.HDDVDR: case MediaType.HDDVDR:
@@ -456,9 +479,11 @@ namespace DiscImageChef.Core.Devices.Dumping
} }
break; break;
#endregion DVD-R, DVD-RW and HD DVD-R #endregion DVD-R, DVD-RW and HD DVD-R
#region All DVD+ #region All DVD+
case MediaType.DVDPR: case MediaType.DVDPR:
case MediaType.DVDPRDL: case MediaType.DVDPRDL:
case MediaType.DVDPRW: case MediaType.DVDPRW:
@@ -484,9 +509,11 @@ namespace DiscImageChef.Core.Devices.Dumping
} }
break; break;
#endregion All DVD+ #endregion All DVD+
#region HD DVD-ROM #region HD DVD-ROM
case MediaType.HDDVDROM: case MediaType.HDDVDROM:
dumpLog.WriteLine("Reading Lead-in Copyright Information."); dumpLog.WriteLine("Reading Lead-in Copyright Information.");
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -500,9 +527,11 @@ namespace DiscImageChef.Core.Devices.Dumping
} }
break; break;
#endregion HD DVD-ROM #endregion HD DVD-ROM
#region All Blu-ray #region All Blu-ray
case MediaType.BDR: case MediaType.BDR:
case MediaType.BDRE: case MediaType.BDRE:
case MediaType.BDROM: case MediaType.BDROM:
@@ -531,12 +560,14 @@ namespace DiscImageChef.Core.Devices.Dumping
mediaTags.Add(MediaTagType.PAC, tmpBuf); mediaTags.Add(MediaTagType.PAC, tmpBuf);
}*/ }*/
break; break;
#endregion All Blu-ray #endregion All Blu-ray
} }
switch (dskType) switch (dskType)
{ {
#region BD-ROM only #region BD-ROM only
case MediaType.BDROM: case MediaType.BDROM:
dumpLog.WriteLine("Reading Burst Cutting Area."); dumpLog.WriteLine("Reading Burst Cutting Area.");
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0,
@@ -549,9 +580,11 @@ namespace DiscImageChef.Core.Devices.Dumping
} }
break; break;
#endregion BD-ROM only #endregion BD-ROM only
#region Writable Blu-ray only #region Writable Blu-ray only
case MediaType.BDR: case MediaType.BDR:
case MediaType.BDRE: case MediaType.BDRE:
case MediaType.BDRXL: case MediaType.BDRXL:
@@ -577,6 +610,7 @@ namespace DiscImageChef.Core.Devices.Dumping
} }
break; break;
#endregion Writable Blu-ray only #endregion Writable Blu-ray only
} }
@@ -620,12 +654,12 @@ namespace DiscImageChef.Core.Devices.Dumping
Checksums = Checksum.GetChecksums(tag.Value).ToArray() Checksums = Checksum.GetChecksums(tag.Value).ToArray()
}; };
byte[] tmp = new byte[tag.Value.Length + 4]; var tmp = new byte[tag.Value.Length + 4];
Array.Copy(tag.Value, 0, tmp, 4, tag.Value.Length); Array.Copy(tag.Value, 0, tmp, 4, tag.Value.Length);
tmp[0] = (byte) ((tag.Value.Length & 0xFF00) >> 8); tmp[0] = (byte) ((tag.Value.Length & 0xFF00) >> 8);
tmp[1] = (byte) (tag.Value.Length & 0xFF); tmp[1] = (byte) (tag.Value.Length & 0xFF);
CSS_CPRM.LeadInCopyright? cpy = CSS_CPRM.DecodeLeadInCopyright(tmp); var cpy = CSS_CPRM.DecodeLeadInCopyright(tmp);
if (cpy.HasValue && cpy.Value.CopyrightType != CopyrightType.NoProtection) if (cpy.HasValue && cpy.Value.CopyrightType != CopyrightType.NoProtection)
sidecar.OpticalDisc[0].CopyProtection = cpy.Value.CopyrightType.ToString(); sidecar.OpticalDisc[0].CopyProtection = cpy.Value.CopyrightType.ToString();

View File

@@ -56,37 +56,47 @@ namespace DiscImageChef.Core.Media.Info
public class ScsiInfo public class ScsiInfo
{ {
/// <summary>SHA256 of PlayStation 2 boot sectors, seen in PAL discs</summary> /// <summary>SHA256 of PlayStation 2 boot sectors, seen in PAL discs</summary>
const string PS2_PAL_HASH = "5d04ff236613e1d8adcf9c201874acd6f6deed1e04306558b86f91cfb626f39d"; private const string PS2_PAL_HASH = "5d04ff236613e1d8adcf9c201874acd6f6deed1e04306558b86f91cfb626f39d";
/// <summary>SHA256 of PlayStation 2 boot sectors, seen in Japanese, American, Malaysian and Korean discs</summary> /// <summary>SHA256 of PlayStation 2 boot sectors, seen in Japanese, American, Malaysian and Korean discs</summary>
const string PS2_NTSC_HASH = "0bada1426e2c0351b872ef2a9ad2e5a0ac3918f4c53aa53329cb2911a8e16c23"; private const string PS2_NTSC_HASH = "0bada1426e2c0351b872ef2a9ad2e5a0ac3918f4c53aa53329cb2911a8e16c23";
/// <summary>SHA256 of PlayStation 2 boot sectors, seen in Japanese discs</summary> /// <summary>SHA256 of PlayStation 2 boot sectors, seen in Japanese discs</summary>
const string PS2_JAPANESE_HASH = "b82bffb809070d61fe050b7e1545df53d8f3cc648257cdff7502bc0ba6b38870"; private const string PS2_JAPANESE_HASH = "b82bffb809070d61fe050b7e1545df53d8f3cc648257cdff7502bc0ba6b38870";
static readonly byte[] Ps3Id =
private static readonly byte[] Ps3Id =
{ {
0x50, 0x6C, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x33, 0x00, 0x00, 0x00, 0x00 0x50, 0x6C, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x33, 0x00, 0x00, 0x00, 0x00
}; };
static readonly byte[] Ps4Id =
private static readonly byte[] Ps4Id =
{ {
0x50, 0x6C, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x34, 0x00, 0x00, 0x00, 0x00 0x50, 0x6C, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x34, 0x00, 0x00, 0x00, 0x00
}; };
static readonly byte[] OperaId = {0x01, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x01};
private static readonly byte[] OperaId = {0x01, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x01};
// Only present on bootable CDs, but those make more than 99% of all available // Only present on bootable CDs, but those make more than 99% of all available
static readonly byte[] FmTownsBootId = {0x49, 0x50, 0x4C, 0x34, 0xEB, 0x55, 0x06}; private static readonly byte[] FmTownsBootId = {0x49, 0x50, 0x4C, 0x34, 0xEB, 0x55, 0x06};
/// <summary>Present on first two seconds of second track, says "COPYRIGHT BANDAI"</summary> /// <summary>Present on first two seconds of second track, says "COPYRIGHT BANDAI"</summary>
static readonly byte[] PlaydiaCopyright = private static readonly byte[] PlaydiaCopyright =
{ {
0x43, 0x4F, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x20, 0x42, 0x41, 0x4E, 0x44, 0x41, 0x49 0x43, 0x4F, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x20, 0x42, 0x41, 0x4E, 0x44, 0x41, 0x49
}; };
static readonly byte[] PcEngineSignature =
private static readonly byte[] PcEngineSignature =
{ {
0x50, 0x43, 0x20, 0x45, 0x6E, 0x67, 0x69, 0x6E, 0x65, 0x20, 0x43, 0x44, 0x2D, 0x52, 0x4F, 0x4D, 0x20, 0x50, 0x43, 0x20, 0x45, 0x6E, 0x67, 0x69, 0x6E, 0x65, 0x20, 0x43, 0x44, 0x2D, 0x52, 0x4F, 0x4D, 0x20,
0x53, 0x59, 0x53, 0x54, 0x45, 0x4D 0x53, 0x59, 0x53, 0x54, 0x45, 0x4D
}; };
static readonly byte[] PcFxSignature =
private static readonly byte[] PcFxSignature =
{ {
0x50, 0x43, 0x2D, 0x46, 0x58, 0x3A, 0x48, 0x75, 0x5F, 0x43, 0x44, 0x2D, 0x52, 0x4F, 0x4D 0x50, 0x43, 0x2D, 0x46, 0x58, 0x3A, 0x48, 0x75, 0x5F, 0x43, 0x44, 0x2D, 0x52, 0x4F, 0x4D
}; };
static readonly byte[] AtariSignature =
private static readonly byte[] AtariSignature =
{ {
0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54,
0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41, 0x49, 0x52, 0x54, 0x41,
@@ -102,8 +112,8 @@ namespace DiscImageChef.Core.Media.Info
MediaType = MediaType.Unknown; MediaType = MediaType.Unknown;
MediaInserted = false; MediaInserted = false;
int resets = 0; var resets = 0;
uint startOfFirstDataTrack = uint.MaxValue; var startOfFirstDataTrack = uint.MaxValue;
bool sense; bool sense;
byte[] cmdBuf; byte[] cmdBuf;
byte[] senseBuf; byte[] senseBuf;
@@ -116,7 +126,7 @@ namespace DiscImageChef.Core.Media.Info
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _); sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
if (sense) if (sense)
{ {
FixedSense? decSense = Sense.DecodeFixed(senseBuf); var decSense = Sense.DecodeFixed(senseBuf);
if (decSense.HasValue) if (decSense.HasValue)
{ {
// Just retry, for 5 times // Just retry, for 5 times
@@ -128,7 +138,7 @@ namespace DiscImageChef.Core.Media.Info
if (decSense.Value.ASC == 0x3A) if (decSense.Value.ASC == 0x3A)
{ {
int leftRetries = 5; var leftRetries = 5;
while (leftRetries > 0) while (leftRetries > 0)
{ {
//DicConsole.WriteLine("\rWaiting for drive to become ready"); //DicConsole.WriteLine("\rWaiting for drive to become ready");
@@ -147,7 +157,7 @@ namespace DiscImageChef.Core.Media.Info
} }
else if (decSense.Value.ASC == 0x04 && decSense.Value.ASCQ == 0x01) else if (decSense.Value.ASC == 0x04 && decSense.Value.ASCQ == 0x01)
{ {
int leftRetries = 10; var leftRetries = 10;
while (leftRetries > 0) while (leftRetries > 0)
{ {
//DicConsole.WriteLine("\rWaiting for drive to become ready"); //DicConsole.WriteLine("\rWaiting for drive to become ready");
@@ -235,7 +245,7 @@ namespace DiscImageChef.Core.Media.Info
if (ReadCapacity16 != null) if (ReadCapacity16 != null)
{ {
byte[] temp = new byte[8]; var temp = new byte[8];
Array.Copy(cmdBuf, 0, temp, 0, 8); Array.Copy(cmdBuf, 0, temp, 0, 8);
Array.Reverse(temp); Array.Reverse(temp);
@@ -250,7 +260,7 @@ namespace DiscImageChef.Core.Media.Info
case PeripheralDeviceTypes.SequentialAccess: case PeripheralDeviceTypes.SequentialAccess:
byte[] medBuf; byte[] medBuf;
sense = dev.ReportDensitySupport(out byte[] seqBuf, out senseBuf, false, dev.Timeout, out _); sense = dev.ReportDensitySupport(out var seqBuf, out senseBuf, false, dev.Timeout, out _);
if (!sense) if (!sense)
{ {
sense = dev.ReportDensitySupport(out medBuf, out senseBuf, true, dev.Timeout, out _); sense = dev.ReportDensitySupport(out medBuf, out senseBuf, true, dev.Timeout, out _);
@@ -292,12 +302,14 @@ namespace DiscImageChef.Core.Media.Info
sense = dev.GetConfiguration(out cmdBuf, out senseBuf, 0, MmcGetConfigurationRt.Current, dev.Timeout, sense = dev.GetConfiguration(out cmdBuf, out senseBuf, 0, MmcGetConfigurationRt.Current, dev.Timeout,
out _); out _);
if (sense) if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ GET CONFIGURATION:\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ GET CONFIGURATION:\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
MmcConfiguration = cmdBuf; MmcConfiguration = cmdBuf;
Features.SeparatedFeatures ftr = Features.Separate(cmdBuf); var ftr = Features.Separate(cmdBuf);
DicConsole.DebugWriteLine("Media-Info command", "GET CONFIGURATION current profile is {0:X4}h", DicConsole.DebugWriteLine("Media-Info command", "GET CONFIGURATION current profile is {0:X4}h",
ftr.CurrentProfile); ftr.CurrentProfile);
@@ -314,7 +326,20 @@ namespace DiscImageChef.Core.Media.Info
MediaType = MediaType.PD650; MediaType = MediaType.PD650;
break; break;
case 0x41: case 0x41:
switch (Blocks)
{
case 58620544:
MediaType = MediaType.REV120;
break;
case 17090880:
MediaType = MediaType.REV35; MediaType = MediaType.REV35;
break;
default:
// TODO: Unknown value
MediaType = MediaType.REV70;
break;
}
break; break;
default: default:
MediaType = MediaType.Unknown; MediaType = MediaType.Unknown;
@@ -436,6 +461,7 @@ namespace DiscImageChef.Core.Media.Info
*/ */
#region All DVD and HD DVD types #region All DVD and HD DVD types
if (MediaType == MediaType.DVDDownload || MediaType == MediaType.DVDPR || if (MediaType == MediaType.DVDDownload || MediaType == MediaType.DVDPR ||
MediaType == MediaType.DVDPRDL || MediaType == MediaType.DVDPRW || MediaType == MediaType.DVDPRDL || MediaType == MediaType.DVDPRW ||
MediaType == MediaType.DVDPRWDL || MediaType == MediaType.DVDPRWDL ||
@@ -450,8 +476,10 @@ namespace DiscImageChef.Core.Media.Info
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _); MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _);
if (sense) if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: PFI\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: PFI\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
DvdPfi = cmdBuf; DvdPfi = cmdBuf;
@@ -515,12 +543,17 @@ namespace DiscImageChef.Core.Media.Info
MmcDiscStructureFormat.DiscManufacturingInformation, 0, dev.Timeout, MmcDiscStructureFormat.DiscManufacturingInformation, 0, dev.Timeout,
out _); out _);
if (sense) if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DMI\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DMI\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
DvdDmi = cmdBuf; DvdDmi = cmdBuf;
if(DMI.IsXbox(cmdBuf)) MediaType = MediaType.XGD; if (DMI.IsXbox(cmdBuf))
{
MediaType = MediaType.XGD;
}
else if (DMI.IsXbox360(cmdBuf)) else if (DMI.IsXbox360(cmdBuf))
{ {
MediaType = MediaType.XGD2; MediaType = MediaType.XGD2;
@@ -533,9 +566,11 @@ namespace DiscImageChef.Core.Media.Info
} }
} }
} }
#endregion All DVD and HD DVD types #endregion All DVD and HD DVD types
#region DVD-ROM #region DVD-ROM
if (MediaType == MediaType.DVDDownload || MediaType == MediaType.DVDROM) if (MediaType == MediaType.DVDDownload || MediaType == MediaType.DVDROM)
{ {
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -545,11 +580,13 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else DvdCmi = cmdBuf; else DvdCmi = cmdBuf;
} }
#endregion DVD-ROM #endregion DVD-ROM
switch (MediaType) switch (MediaType)
{ {
#region DVD-ROM and HD DVD-ROM #region DVD-ROM and HD DVD-ROM
case MediaType.DVDDownload: case MediaType.DVDDownload:
case MediaType.DVDROM: case MediaType.DVDROM:
case MediaType.HDDVDROM: case MediaType.HDDVDROM:
@@ -567,9 +604,11 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else DvdAacs = cmdBuf; else DvdAacs = cmdBuf;
break; break;
#endregion DVD-ROM and HD DVD-ROM #endregion DVD-ROM and HD DVD-ROM
#region DVD-RAM and HD DVD-RAM #region DVD-RAM and HD DVD-RAM
case MediaType.DVDRAM: case MediaType.DVDRAM:
case MediaType.HDDVDRAM: case MediaType.HDDVDRAM:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -595,9 +634,11 @@ namespace DiscImageChef.Core.Media.Info
else DvdRamSpareArea = cmdBuf; else DvdRamSpareArea = cmdBuf;
break; break;
#endregion DVD-RAM and HD DVD-RAM #endregion DVD-RAM and HD DVD-RAM
#region DVD-R and HD DVD-R #region DVD-R and HD DVD-R
case MediaType.DVDR: case MediaType.DVDR:
case MediaType.HDDVDR: case MediaType.HDDVDR:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -608,10 +649,12 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else LastBorderOutRmd = cmdBuf; else LastBorderOutRmd = cmdBuf;
break; break;
#endregion DVD-R and HD DVD-R #endregion DVD-R and HD DVD-R
} }
#region Require drive authentication, won't work #region Require drive authentication, won't work
/* /*
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.DiscKey, 0, dev.Timeout, out _); sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.DiscKey, 0, dev.Timeout, out _);
if(sense) if(sense)
@@ -669,9 +712,11 @@ namespace DiscImageChef.Core.Media.Info
else else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_aacsdatakeys.bin", "SCSI READ DISC STRUCTURE", cmdBuf); DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_aacsdatakeys.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
*/ */
#endregion Require drive authentication, won't work #endregion Require drive authentication, won't work
#region DVD-R and DVD-RW #region DVD-R and DVD-RW
if (MediaType == MediaType.DVDR || MediaType == MediaType.DVDRW) if (MediaType == MediaType.DVDR || MediaType == MediaType.DVDRW)
{ {
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -681,11 +726,13 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else DvdPreRecordedInfo = cmdBuf; else DvdPreRecordedInfo = cmdBuf;
} }
#endregion DVD-R and DVD-RW #endregion DVD-R and DVD-RW
switch (MediaType) switch (MediaType)
{ {
#region DVD-R, DVD-RW and HD DVD-R #region DVD-R, DVD-RW and HD DVD-R
case MediaType.DVDR: case MediaType.DVDR:
case MediaType.DVDRW: case MediaType.DVDRW:
case MediaType.HDDVDR: case MediaType.HDDVDR:
@@ -706,9 +753,11 @@ namespace DiscImageChef.Core.Media.Info
else DvdrPhysicalInformation = cmdBuf; else DvdrPhysicalInformation = cmdBuf;
break; break;
#endregion DVD-R, DVD-RW and HD DVD-R #endregion DVD-R, DVD-RW and HD DVD-R
#region All DVD+ #region All DVD+
case MediaType.DVDPR: case MediaType.DVDPR:
case MediaType.DVDPRDL: case MediaType.DVDPRDL:
case MediaType.DVDPRW: case MediaType.DVDPRW:
@@ -727,9 +776,11 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else DvdPlusDcb = cmdBuf; else DvdPlusDcb = cmdBuf;
break; break;
#endregion All DVD+ #endregion All DVD+
#region HD DVD-ROM #region HD DVD-ROM
case MediaType.HDDVDROM: case MediaType.HDDVDROM:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.HddvdCopyrightInformation, 0, dev.Timeout, MmcDiscStructureFormat.HddvdCopyrightInformation, 0, dev.Timeout,
@@ -739,10 +790,12 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else HddvdCopyrightInformation = cmdBuf; else HddvdCopyrightInformation = cmdBuf;
break; break;
#endregion HD DVD-ROM #endregion HD DVD-ROM
} }
#region HD DVD-R #region HD DVD-R
if (MediaType == MediaType.HDDVDR) if (MediaType == MediaType.HDDVDR)
{ {
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -759,9 +812,11 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else HddvdrLastRmd = cmdBuf; else HddvdrLastRmd = cmdBuf;
} }
#endregion HD DVD-R #endregion HD DVD-R
#region DVD-R DL, DVD-RW DL, DVD+R DL, DVD+RW DL #region DVD-R DL, DVD-RW DL, DVD+R DL, DVD+RW DL
if (MediaType == MediaType.DVDPRDL || MediaType == MediaType.DVDRDL || MediaType == MediaType.DVDRWDL || if (MediaType == MediaType.DVDPRDL || MediaType == MediaType.DVDRDL || MediaType == MediaType.DVDRWDL ||
MediaType == MediaType.DVDPRWDL) MediaType == MediaType.DVDPRWDL)
{ {
@@ -772,11 +827,13 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else DvdrLayerCapacity = cmdBuf; else DvdrLayerCapacity = cmdBuf;
} }
#endregion DVD-R DL, DVD-RW DL, DVD+R DL, DVD+RW DL #endregion DVD-R DL, DVD-RW DL, DVD+R DL, DVD+RW DL
switch (MediaType) switch (MediaType)
{ {
#region DVD-R DL #region DVD-R DL
case MediaType.DVDRDL: case MediaType.DVDRDL:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.MiddleZoneStart, 0, dev.Timeout, out _); MmcDiscStructureFormat.MiddleZoneStart, 0, dev.Timeout, out _);
@@ -808,9 +865,11 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else DvdrDlRemapAnchorPoint = cmdBuf; else DvdrDlRemapAnchorPoint = cmdBuf;
break; break;
#endregion DVD-R DL #endregion DVD-R DL
#region All Blu-ray #region All Blu-ray
case MediaType.BDR: case MediaType.BDR:
case MediaType.BDRE: case MediaType.BDRE:
case MediaType.BDROM: case MediaType.BDROM:
@@ -830,12 +889,14 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else BlurayPac = cmdBuf; else BlurayPac = cmdBuf;
break; break;
#endregion All Blu-ray #endregion All Blu-ray
} }
switch (MediaType) switch (MediaType)
{ {
#region BD-ROM only #region BD-ROM only
case MediaType.BDROM: case MediaType.BDROM:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdBurstCuttingArea, 0, dev.Timeout, out _); MmcDiscStructureFormat.BdBurstCuttingArea, 0, dev.Timeout, out _);
@@ -845,9 +906,11 @@ namespace DiscImageChef.Core.Media.Info
else BlurayBurstCuttingArea = cmdBuf; else BlurayBurstCuttingArea = cmdBuf;
break; break;
#endregion BD-ROM only #endregion BD-ROM only
#region Writable Blu-ray only #region Writable Blu-ray only
case MediaType.BDR: case MediaType.BDR:
case MediaType.BDRE: case MediaType.BDRE:
case MediaType.BDRXL: case MediaType.BDRXL:
@@ -897,9 +960,11 @@ namespace DiscImageChef.Core.Media.Info
else BlurayPowResources = cmdBuf; else BlurayPowResources = cmdBuf;
break; break;
#endregion Writable Blu-ray only #endregion Writable Blu-ray only
#region CDs #region CDs
case MediaType.CD: case MediaType.CD:
case MediaType.CDR: case MediaType.CDR:
case MediaType.CDROM: case MediaType.CDROM:
@@ -907,10 +972,12 @@ namespace DiscImageChef.Core.Media.Info
case MediaType.Unknown: case MediaType.Unknown:
// We discarded all discs that falsify a TOC before requesting a real TOC // We discarded all discs that falsify a TOC before requesting a real TOC
// No TOC, no CD (or an empty one) // No TOC, no CD (or an empty one)
bool tocSense = dev.ReadTocPmaAtip(out cmdBuf, out senseBuf, false, 0, 0, dev.Timeout, out _); var tocSense = dev.ReadTocPmaAtip(out cmdBuf, out senseBuf, false, 0, 0, dev.Timeout, out _);
if (tocSense) if (tocSense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: TOC\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: TOC\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
Toc = cmdBuf; Toc = cmdBuf;
@@ -923,8 +990,10 @@ namespace DiscImageChef.Core.Media.Info
// ATIP exists on blank CDs // ATIP exists on blank CDs
sense = dev.ReadAtip(out cmdBuf, out senseBuf, dev.Timeout, out _); sense = dev.ReadAtip(out cmdBuf, out senseBuf, dev.Timeout, out _);
if (sense) if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: ATIP\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: ATIP\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
Atip = cmdBuf; Atip = cmdBuf;
@@ -941,8 +1010,10 @@ namespace DiscImageChef.Core.Media.Info
MmcDiscInformationDataTypes.DiscInformation, dev.Timeout, MmcDiscInformationDataTypes.DiscInformation, dev.Timeout,
out _); out _);
if (sense) if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ DISC INFORMATION 000b\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ DISC INFORMATION 000b\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
CompactDiscInformation = cmdBuf; CompactDiscInformation = cmdBuf;
@@ -960,13 +1031,15 @@ namespace DiscImageChef.Core.Media.Info
} }
} }
int sessions = 1; var sessions = 1;
int firstTrackLastSession = 0; var firstTrackLastSession = 0;
sense = dev.ReadSessionInfo(out cmdBuf, out senseBuf, dev.Timeout, out _); sense = dev.ReadSessionInfo(out cmdBuf, out senseBuf, dev.Timeout, out _);
if (sense) if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: Session info\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: Session info\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
Session = cmdBuf; Session = cmdBuf;
@@ -980,13 +1053,13 @@ namespace DiscImageChef.Core.Media.Info
if (MediaType == MediaType.CD) if (MediaType == MediaType.CD)
{ {
bool hasDataTrack = false; var hasDataTrack = false;
bool hasAudioTrack = false; var hasAudioTrack = false;
bool allFirstSessionTracksAreAudio = true; var allFirstSessionTracksAreAudio = true;
bool hasVideoTrack = false; var hasVideoTrack = false;
if (DecodedToc.HasValue) if (DecodedToc.HasValue)
foreach(TOC.CDTOCTrackDataDescriptor track in DecodedToc.Value.TrackDescriptors) foreach (var track in DecodedToc.Value.TrackDescriptors)
{ {
if (track.TrackNumber == 1 && if (track.TrackNumber == 1 &&
((TocControl) (track.CONTROL & 0x0D) == TocControl.DataTrack || ((TocControl) (track.CONTROL & 0x0D) == TocControl.DataTrack ||
@@ -1001,7 +1074,10 @@ namespace DiscImageChef.Core.Media.Info
hasDataTrack = true; hasDataTrack = true;
allFirstSessionTracksAreAudio &= track.TrackNumber >= firstTrackLastSession; allFirstSessionTracksAreAudio &= track.TrackNumber >= firstTrackLastSession;
} }
else hasAudioTrack = true; else
{
hasAudioTrack = true;
}
hasVideoTrack |= track.ADR == 4; hasVideoTrack |= track.ADR == 4;
} }
@@ -1015,8 +1091,10 @@ namespace DiscImageChef.Core.Media.Info
sense = dev.ReadRawToc(out cmdBuf, out senseBuf, 1, dev.Timeout, out _); sense = dev.ReadRawToc(out cmdBuf, out senseBuf, 1, dev.Timeout, out _);
if (sense) if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: Raw TOC\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: Raw TOC\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
RawToc = cmdBuf; RawToc = cmdBuf;
@@ -1024,7 +1102,7 @@ namespace DiscImageChef.Core.Media.Info
FullToc = FullTOC.Decode(cmdBuf); FullToc = FullTOC.Decode(cmdBuf);
if (FullToc.HasValue) if (FullToc.HasValue)
{ {
FullTOC.TrackDataDescriptor a0Track = var a0Track =
FullToc.Value.TrackDescriptors FullToc.Value.TrackDescriptors
.FirstOrDefault(t => t.POINT == 0xA0 && t.ADR == 1); .FirstOrDefault(t => t.POINT == 0xA0 && t.ADR == 1);
if (a0Track.POINT == 0xA0) if (a0Track.POINT == 0xA0)
@@ -1053,21 +1131,23 @@ namespace DiscImageChef.Core.Media.Info
sense = dev.ReadCdText(out cmdBuf, out senseBuf, dev.Timeout, out _); sense = dev.ReadCdText(out cmdBuf, out senseBuf, dev.Timeout, out _);
if (sense) if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: CD-TEXT\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: CD-TEXT\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
CdTextLeadIn = cmdBuf; CdTextLeadIn = cmdBuf;
DecodedCdTextLeadIn = CDTextOnLeadIn.Decode(cmdBuf); DecodedCdTextLeadIn = CDTextOnLeadIn.Decode(cmdBuf);
} }
sense = dev.ReadMcn(out string mcn, out _, out _, dev.Timeout, out _); sense = dev.ReadMcn(out var mcn, out _, out _, dev.Timeout, out _);
if (!sense && mcn != null && mcn != "0000000000000") Mcn = mcn; if (!sense && mcn != null && mcn != "0000000000000") Mcn = mcn;
Isrcs = new Dictionary<byte, string>(); Isrcs = new Dictionary<byte, string>();
for(byte i = DecodedToc.Value.FirstTrack; i <= DecodedToc.Value.LastTrack; i++) for (var i = DecodedToc.Value.FirstTrack; i <= DecodedToc.Value.LastTrack; i++)
{ {
sense = dev.ReadIsrc(i, out string isrc, out _, out _, dev.Timeout, out _); sense = dev.ReadIsrc(i, out var isrc, out _, out _, dev.Timeout, out _);
if (!sense && isrc != null && isrc != "000000000000") Isrcs.Add(i, isrc); if (!sense && isrc != null && isrc != "000000000000") Isrcs.Add(i, isrc);
} }
@@ -1075,21 +1155,25 @@ namespace DiscImageChef.Core.Media.Info
} }
break; break;
#endregion CDs #endregion CDs
} }
#region Nintendo #region Nintendo
if (MediaType == MediaType.Unknown && Blocks > 0) if (MediaType == MediaType.Unknown && Blocks > 0)
{ {
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _); MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _);
if (sense) if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: PFI\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: PFI\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
DvdPfi = cmdBuf; DvdPfi = cmdBuf;
PFI.PhysicalFormatInformation? nintendoPfi = PFI.Decode(cmdBuf); var nintendoPfi = PFI.Decode(cmdBuf);
if (nintendoPfi != null) if (nintendoPfi != null)
{ {
DicConsole.WriteLine("PFI:\n{0}", PFI.Prettify(cmdBuf)); DicConsole.WriteLine("PFI:\n{0}", PFI.Prettify(cmdBuf));
@@ -1115,13 +1199,16 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
else DvdDmi = cmdBuf; else DvdDmi = cmdBuf;
} }
#endregion Nintendo #endregion Nintendo
} }
sense = dev.ReadMediaSerialNumber(out cmdBuf, out senseBuf, dev.Timeout, out _); sense = dev.ReadMediaSerialNumber(out cmdBuf, out senseBuf, dev.Timeout, out _);
if (sense) if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ MEDIA SERIAL NUMBER\n{0}", DicConsole.DebugWriteLine("Media-Info command", "READ MEDIA SERIAL NUMBER\n{0}",
Sense.PrettifySense(senseBuf)); Sense.PrettifySense(senseBuf));
}
else else
{ {
if (cmdBuf.Length >= 4) MediaSerialNumber = cmdBuf; if (cmdBuf.Length >= 4) MediaSerialNumber = cmdBuf;
@@ -1130,14 +1217,15 @@ namespace DiscImageChef.Core.Media.Info
switch (MediaType) switch (MediaType)
{ {
#region Xbox #region Xbox
case MediaType.XGD: case MediaType.XGD:
case MediaType.XGD2: case MediaType.XGD2:
case MediaType.XGD3: case MediaType.XGD3:
// We need to get INQUIRY to know if it is a Kreon drive // We need to get INQUIRY to know if it is a Kreon drive
sense = dev.ScsiInquiry(out byte[] inqBuffer, out senseBuf); sense = dev.ScsiInquiry(out var inqBuffer, out senseBuf);
if (!sense) if (!sense)
{ {
Inquiry.SCSIInquiry? inq = Inquiry.Decode(inqBuffer); var inq = Inquiry.Decode(inqBuffer);
if (inq.HasValue && inq.Value.KreonPresent) if (inq.HasValue && inq.Value.KreonPresent)
{ {
sense = dev.KreonExtractSs(out cmdBuf, out senseBuf, dev.Timeout, out _); sense = dev.KreonExtractSs(out cmdBuf, out senseBuf, dev.Timeout, out _);
@@ -1164,7 +1252,7 @@ namespace DiscImageChef.Core.Media.Info
return; return;
} }
ulong totalSize = var totalSize =
(ulong) ((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]); (ulong) ((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]);
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _); MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _);
@@ -1178,7 +1266,7 @@ namespace DiscImageChef.Core.Media.Info
totalSize); totalSize);
ulong l0Video = PFI.Decode(cmdBuf).Value.Layer0EndPSN - ulong l0Video = PFI.Decode(cmdBuf).Value.Layer0EndPSN -
PFI.Decode(cmdBuf).Value.DataAreaStartPSN + 1; PFI.Decode(cmdBuf).Value.DataAreaStartPSN + 1;
ulong l1Video = totalSize - l0Video + 1; var l1Video = totalSize - l0Video + 1;
// Get game partition size // Get game partition size
DicConsole.DebugWriteLine("Dump-media command", "Getting game partition size"); DicConsole.DebugWriteLine("Dump-media command", "Getting game partition size");
@@ -1196,7 +1284,7 @@ namespace DiscImageChef.Core.Media.Info
return; return;
} }
ulong gameSize = var gameSize =
(ulong) ((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]) + 1; (ulong) ((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]) + 1;
DicConsole.DebugWriteLine("Dump-media command", "Game partition total size: {0} sectors", DicConsole.DebugWriteLine("Dump-media command", "Game partition total size: {0} sectors",
gameSize); gameSize);
@@ -1228,13 +1316,13 @@ namespace DiscImageChef.Core.Media.Info
DicConsole.DebugWriteLine("Dump-media command", "Unlocked total size: {0} sectors", DicConsole.DebugWriteLine("Dump-media command", "Unlocked total size: {0} sectors",
totalSize); totalSize);
ulong middleZone = var middleZone =
totalSize - totalSize -
(PFI.Decode(cmdBuf).Value.Layer0EndPSN - (PFI.Decode(cmdBuf).Value.Layer0EndPSN -
PFI.Decode(cmdBuf).Value.DataAreaStartPSN + 1) - gameSize + 1; PFI.Decode(cmdBuf).Value.DataAreaStartPSN + 1) - gameSize + 1;
totalSize = l0Video + l1Video + middleZone * 2 + gameSize; totalSize = l0Video + l1Video + middleZone * 2 + gameSize;
ulong layerBreak = l0Video + middleZone + gameSize / 2; var layerBreak = l0Video + middleZone + gameSize / 2;
XgdInfo = new XgdInfo XgdInfo = new XgdInfo
{ {
@@ -1249,6 +1337,7 @@ namespace DiscImageChef.Core.Media.Info
} }
break; break;
#endregion Xbox #endregion Xbox
case MediaType.Unknown: case MediaType.Unknown:
@@ -1275,7 +1364,7 @@ namespace DiscImageChef.Core.Media.Info
if (secondSessionFirstTrack != 0 && DecodedToc.HasValue && if (secondSessionFirstTrack != 0 && DecodedToc.HasValue &&
DecodedToc.Value.TrackDescriptors.Any(t => t.TrackNumber == secondSessionFirstTrack)) DecodedToc.Value.TrackDescriptors.Any(t => t.TrackNumber == secondSessionFirstTrack))
{ {
uint firstSectorSecondSessionFirstTrack = DecodedToc var firstSectorSecondSessionFirstTrack = DecodedToc
.Value.TrackDescriptors .Value.TrackDescriptors
.First(t => t.TrackNumber == secondSessionFirstTrack) .First(t => t.TrackNumber == secondSessionFirstTrack)
.TrackStartAddress; .TrackStartAddress;
@@ -1284,7 +1373,10 @@ namespace DiscImageChef.Core.Media.Info
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out _); MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out _);
if(!sense && !dev.Error) firstTrackSecondSession = cmdBuf; if (!sense && !dev.Error)
{
firstTrackSecondSession = cmdBuf;
}
else else
{ {
sense = dev.ReadCd(out cmdBuf, out senseBuf, firstSectorSecondSessionFirstTrack, 2352, 1, sense = dev.ReadCd(out cmdBuf, out senseBuf, firstSectorSecondSessionFirstTrack, 2352, 1,
@@ -1298,7 +1390,10 @@ namespace DiscImageChef.Core.Media.Info
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out _); MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out _);
if(!sense && !dev.Error) firstTrackSecondSessionAudio = cmdBuf; if (!sense && !dev.Error)
{
firstTrackSecondSessionAudio = cmdBuf;
}
else else
{ {
sense = dev.ReadCd(out cmdBuf, out senseBuf, firstSectorSecondSessionFirstTrack - 1, 2352, 3, sense = dev.ReadCd(out cmdBuf, out senseBuf, firstSectorSecondSessionFirstTrack - 1, 2352, 3,
@@ -1310,7 +1405,7 @@ namespace DiscImageChef.Core.Media.Info
} }
videoNowColorFrame = new byte[9 * 2352]; videoNowColorFrame = new byte[9 * 2352];
for(int i = 0; i < 9; i++) for (var i = 0; i < 9; i++)
{ {
sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint) i, 2352, 1, MmcSectorTypes.AllTypes, false, false, sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint) i, 2352, 1, MmcSectorTypes.AllTypes, false, false,
true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, MmcSubchannel.None, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, MmcSubchannel.None,
@@ -1426,7 +1521,7 @@ namespace DiscImageChef.Core.Media.Info
} }
} }
MemoryStream ps2Ms = new MemoryStream(); var ps2Ms = new MemoryStream();
for (uint p = 0; p < 12; p++) for (uint p = 0; p < 12; p++)
{ {
sense = dev.ReadCd(out cmdBuf, out senseBuf, p, 2352, 1, MmcSectorTypes.AllTypes, false, sense = dev.ReadCd(out cmdBuf, out senseBuf, p, 2352, 1, MmcSectorTypes.AllTypes, false,
@@ -1504,7 +1599,7 @@ namespace DiscImageChef.Core.Media.Info
} }
} }
MemoryStream ps2Ms = new MemoryStream(); var ps2Ms = new MemoryStream();
for (uint p = 0; p < 12; p++) for (uint p = 0; p < 12; p++)
{ {
sense = dev.ReadCd(out cmdBuf, out senseBuf, p, 2324, 1, MmcSectorTypes.Mode2, false, sense = dev.ReadCd(out cmdBuf, out senseBuf, p, 2324, 1, MmcSectorTypes.Mode2, false,
@@ -1557,7 +1652,10 @@ namespace DiscImageChef.Core.Media.Info
if (!sense && !dev.Error) secondDataSectorNotZero = cmdBuf; if (!sense && !dev.Error) secondDataSectorNotZero = cmdBuf;
} }
} }
else goto case MediaType.DVDROM; else
{
goto case MediaType.DVDROM;
}
} }
} }
@@ -1701,10 +1799,10 @@ namespace DiscImageChef.Core.Media.Info
if (ps2BootSectors != null && ps2BootSectors.Length == 0x6000) if (ps2BootSectors != null && ps2BootSectors.Length == 0x6000)
{ {
// The decryption key is applied as XOR. As first byte is originally always NULL, it gives us the key :) // The decryption key is applied as XOR. As first byte is originally always NULL, it gives us the key :)
byte decryptByte = ps2BootSectors[0]; var decryptByte = ps2BootSectors[0];
for(int i = 0; i < 0x6000; i++) ps2BootSectors[i] ^= decryptByte; for (var i = 0; i < 0x6000; i++) ps2BootSectors[i] ^= decryptByte;
string ps2BootSectorsHash = Sha256Context.Data(ps2BootSectors, out _); var ps2BootSectorsHash = Sha256Context.Data(ps2BootSectors, out _);
DicConsole.DebugWriteLine("Media-info Command", "PlayStation 2 boot sectors SHA256: {0}", DicConsole.DebugWriteLine("Media-info Command", "PlayStation 2 boot sectors SHA256: {0}",
ps2BootSectorsHash); ps2BootSectorsHash);
if (ps2BootSectorsHash == PS2_PAL_HASH || ps2BootSectorsHash == PS2_NTSC_HASH || if (ps2BootSectorsHash == PS2_PAL_HASH || ps2BootSectorsHash == PS2_NTSC_HASH ||
@@ -1713,7 +1811,7 @@ namespace DiscImageChef.Core.Media.Info
if (sector0 != null) if (sector0 != null)
{ {
byte[] syncBytes = new byte[7]; var syncBytes = new byte[7];
Array.Copy(sector0, 0, syncBytes, 0, 7); Array.Copy(sector0, 0, syncBytes, 0, 7);
if (OperaId.SequenceEqual(syncBytes)) MediaType = MediaType.ThreeDO; if (OperaId.SequenceEqual(syncBytes)) MediaType = MediaType.ThreeDO;
@@ -1722,8 +1820,8 @@ namespace DiscImageChef.Core.Media.Info
if (playdia1 != null && playdia2 != null) if (playdia1 != null && playdia2 != null)
{ {
byte[] pd1 = new byte[PlaydiaCopyright.Length]; var pd1 = new byte[PlaydiaCopyright.Length];
byte[] pd2 = new byte[PlaydiaCopyright.Length]; var pd2 = new byte[PlaydiaCopyright.Length];
Array.Copy(playdia1, 38, pd1, 0, pd1.Length); Array.Copy(playdia1, 38, pd1, 0, pd1.Length);
Array.Copy(playdia2, 0, pd2, 0, pd1.Length); Array.Copy(playdia2, 0, pd2, 0, pd1.Length);
@@ -1734,7 +1832,7 @@ namespace DiscImageChef.Core.Media.Info
if (secondDataSectorNotZero != null) if (secondDataSectorNotZero != null)
{ {
byte[] pce = new byte[PcEngineSignature.Length]; var pce = new byte[PcEngineSignature.Length];
Array.Copy(secondDataSectorNotZero, 32, pce, 0, pce.Length); Array.Copy(secondDataSectorNotZero, 32, pce, 0, pce.Length);
if (PcEngineSignature.SequenceEqual(pce)) MediaType = MediaType.SuperCDROM2; if (PcEngineSignature.SequenceEqual(pce)) MediaType = MediaType.SuperCDROM2;
@@ -1742,7 +1840,7 @@ namespace DiscImageChef.Core.Media.Info
if (firstDataSectorNotZero != null) if (firstDataSectorNotZero != null)
{ {
byte[] pcfx = new byte[PcFxSignature.Length]; var pcfx = new byte[PcFxSignature.Length];
Array.Copy(firstDataSectorNotZero, 0, pcfx, 0, pcfx.Length); Array.Copy(firstDataSectorNotZero, 0, pcfx, 0, pcfx.Length);
if (PcFxSignature.SequenceEqual(pcfx)) MediaType = MediaType.PCFX; if (PcFxSignature.SequenceEqual(pcfx)) MediaType = MediaType.PCFX;
@@ -1750,8 +1848,8 @@ namespace DiscImageChef.Core.Media.Info
if (firstTrackSecondSessionAudio != null) if (firstTrackSecondSessionAudio != null)
{ {
byte[] jaguar = new byte[AtariSignature.Length]; var jaguar = new byte[AtariSignature.Length];
for(int i = 0; i + jaguar.Length <= firstTrackSecondSessionAudio.Length; i += 2) for (var i = 0; i + jaguar.Length <= firstTrackSecondSessionAudio.Length; i += 2)
{ {
Array.Copy(firstTrackSecondSessionAudio, i, jaguar, 0, jaguar.Length); Array.Copy(firstTrackSecondSessionAudio, i, jaguar, 0, jaguar.Length);
@@ -1765,7 +1863,7 @@ namespace DiscImageChef.Core.Media.Info
if (firstTrackSecondSession != null) if (firstTrackSecondSession != null)
if (firstTrackSecondSession.Length >= 2336) if (firstTrackSecondSession.Length >= 2336)
{ {
byte[] milcd = new byte[2048]; var milcd = new byte[2048];
Array.Copy(firstTrackSecondSession, 24, milcd, 0, 2048); Array.Copy(firstTrackSecondSession, 24, milcd, 0, 2048);
if (Dreamcast.DecodeIPBin(milcd).HasValue) MediaType = MediaType.MilCD; if (Dreamcast.DecodeIPBin(milcd).HasValue) MediaType = MediaType.MilCD;
} }
@@ -1787,10 +1885,10 @@ namespace DiscImageChef.Core.Media.Info
if (ps2BootSectors != null && ps2BootSectors.Length == 0x6000) if (ps2BootSectors != null && ps2BootSectors.Length == 0x6000)
{ {
// The decryption key is applied as XOR. As first byte is originally always NULL, it gives us the key :) // The decryption key is applied as XOR. As first byte is originally always NULL, it gives us the key :)
byte decryptByte = ps2BootSectors[0]; var decryptByte = ps2BootSectors[0];
for(int i = 0; i < 0x6000; i++) ps2BootSectors[i] ^= decryptByte; for (var i = 0; i < 0x6000; i++) ps2BootSectors[i] ^= decryptByte;
string ps2BootSectorsHash = Sha256Context.Data(ps2BootSectors, out _); var ps2BootSectorsHash = Sha256Context.Data(ps2BootSectors, out _);
DicConsole.DebugWriteLine("Media-info Command", "PlayStation 2 boot sectors SHA256: {0}", DicConsole.DebugWriteLine("Media-info Command", "PlayStation 2 boot sectors SHA256: {0}",
ps2BootSectorsHash); ps2BootSectorsHash);
if (ps2BootSectorsHash == PS2_PAL_HASH || ps2BootSectorsHash == PS2_NTSC_HASH || if (ps2BootSectorsHash == PS2_PAL_HASH || ps2BootSectorsHash == PS2_NTSC_HASH ||
@@ -1799,7 +1897,7 @@ namespace DiscImageChef.Core.Media.Info
if (sector1 != null) if (sector1 != null)
{ {
byte[] tmp = new byte[Ps3Id.Length]; var tmp = new byte[Ps3Id.Length];
Array.Copy(sector1, 0, tmp, 0, tmp.Length); Array.Copy(sector1, 0, tmp, 0, tmp.Length);
if (tmp.SequenceEqual(Ps3Id)) if (tmp.SequenceEqual(Ps3Id))
switch (MediaType) switch (MediaType)

View File

@@ -36,10 +36,11 @@ namespace DiscImageChef.DiscImages
{ {
public partial class ZZZRawImage public partial class ZZZRawImage
{ {
MediaType CalculateDiskType() private MediaType CalculateDiskType()
{ {
if (imageInfo.SectorSize == 2048) if (imageInfo.SectorSize == 2048)
{ {
if (imageInfo.Sectors == 58620544) return MediaType.REV120;
if (imageInfo.Sectors == 17090880) return MediaType.REV35; if (imageInfo.Sectors == 17090880) return MediaType.REV35;
if (imageInfo.Sectors <= 360000) return MediaType.CD; if (imageInfo.Sectors <= 360000) return MediaType.CD;
if (imageInfo.Sectors <= 2295104) return MediaType.DVDPR; if (imageInfo.Sectors <= 2295104) return MediaType.DVDPR;
@@ -143,12 +144,14 @@ namespace DiscImageChef.DiscImages
case 1070617600: return MediaType.Jaz; case 1070617600: return MediaType.Jaz;
#region Commodore #region Commodore
case 174848: case 174848:
case 175531: return MediaType.CBM_1540; case 175531: return MediaType.CBM_1540;
case 196608: case 196608:
case 197376: return MediaType.CBM_1540_Ext; case 197376: return MediaType.CBM_1540_Ext;
case 349696: case 349696:
case 351062: return MediaType.CBM_1571; case 351062: return MediaType.CBM_1571;
#endregion Commodore #endregion Commodore
default: return MediaType.GENERIC_HDD; default: return MediaType.GENERIC_HDD;

View File

@@ -51,11 +51,11 @@ using DeviceReport = DiscImageChef.Core.Devices.Report.DeviceReport;
namespace DiscImageChef.Commands namespace DiscImageChef.Commands
{ {
class DeviceReportCommand : Command internal class DeviceReportCommand : Command
{ {
string devicePath; private string devicePath;
bool showHelp; private bool showHelp;
public DeviceReportCommand() : base("device-report", public DeviceReportCommand() : base("device-report",
"Tests the device capabilities and creates an JSON report of them.") "Tests the device capabilities and creates an JSON report of them.")
@@ -108,7 +108,8 @@ namespace DiscImageChef.Commands
if (!DetectOS.IsAdmin) if (!DetectOS.IsAdmin)
{ {
DicConsole DicConsole
.ErrorWriteLine("Because of the commands sent to a device, device report must be run with administrative privileges."); .ErrorWriteLine(
"Because of the commands sent to a device, device report must be run with administrative privileges.");
DicConsole.ErrorWriteLine("Not continuing."); DicConsole.ErrorWriteLine("Not continuing.");
return (int) ErrorNumber.NotEnoughPermissions; return (int) ErrorNumber.NotEnoughPermissions;
} }
@@ -116,7 +117,7 @@ namespace DiscImageChef.Commands
if (devicePath.Length == 2 && devicePath[1] == ':' && devicePath[0] != '/' && char.IsLetter(devicePath[0])) if (devicePath.Length == 2 && devicePath[1] == ':' && devicePath[0] != '/' && char.IsLetter(devicePath[0]))
devicePath = "\\\\.\\" + char.ToUpper(devicePath[0]) + ':'; devicePath = "\\\\.\\" + char.ToUpper(devicePath[0]) + ':';
Device dev = new Device(devicePath); var dev = new Device(devicePath);
if (dev.Error) if (dev.Error)
{ {
@@ -126,7 +127,7 @@ namespace DiscImageChef.Commands
Statistics.AddDevice(dev); Statistics.AddDevice(dev);
DeviceReportV2 report = new DeviceReportV2 var report = new DeviceReportV2
{ {
Manufacturer = dev.Manufacturer, Model = dev.Model, Revision = dev.Revision, Type = dev.Type Manufacturer = dev.Manufacturer, Model = dev.Model, Revision = dev.Revision, Type = dev.Type
}; };
@@ -142,7 +143,7 @@ namespace DiscImageChef.Commands
jsonFile = jsonFile.Replace('\\', '_').Replace('/', '_').Replace('?', '_'); jsonFile = jsonFile.Replace('\\', '_').Replace('/', '_').Replace('?', '_');
DeviceReport reporter = new DeviceReport(dev, MainClass.Debug); var reporter = new DeviceReport(dev, MainClass.Debug);
ConsoleKeyInfo pressedKey; ConsoleKeyInfo pressedKey;
@@ -271,7 +272,7 @@ namespace DiscImageChef.Commands
DicConsole.Write("Please write the media model and press enter: "); DicConsole.Write("Please write the media model and press enter: ");
mediumModel = System.Console.ReadLine(); mediumModel = System.Console.ReadLine();
TestedMedia mediaTest = reporter.ReportAtaMedia(); var mediaTest = reporter.ReportAtaMedia();
mediaTest.MediumTypeName = mediumTypeName; mediaTest.MediumTypeName = mediumTypeName;
mediaTest.Model = mediumModel; mediaTest.Model = mediumModel;
@@ -280,7 +281,10 @@ namespace DiscImageChef.Commands
report.ATA.RemovableMedias = mediaTests; report.ATA.RemovableMedias = mediaTests;
} }
else report.ATA.ReadCapabilities = reporter.ReportAta(report.ATA.IdentifyDevice.Value); else
{
report.ATA.ReadCapabilities = reporter.ReportAta(report.ATA.IdentifyDevice.Value);
}
break; break;
} }
@@ -308,7 +312,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N) while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{ {
DicConsole DicConsole
.Write("Is the media removable from the reading/writing elements (flash memories ARE NOT removable)? (Y/N): "); .Write(
"Is the media removable from the reading/writing elements (flash memories ARE NOT removable)? (Y/N): ");
pressedKey = System.Console.ReadKey(); pressedKey = System.Console.ReadKey();
DicConsole.WriteLine(); DicConsole.WriteLine();
} }
@@ -355,7 +360,7 @@ namespace DiscImageChef.Commands
case PeripheralDeviceTypes.MultiMediaDevice: case PeripheralDeviceTypes.MultiMediaDevice:
{ {
bool iomegaRev = dev.Manufacturer.ToLowerInvariant() == "iomega" && bool iomegaRev = dev.Manufacturer.ToLowerInvariant() == "iomega" &&
dev.Model.ToLowerInvariant() == "rrd"; dev.Model.ToLowerInvariant().StartsWith("rrd");
List<string> mediaTypes = new List<string>(); List<string> mediaTypes = new List<string>();
@@ -399,7 +404,8 @@ namespace DiscImageChef.Commands
report.SCSI.MultiMediaDevice.Features.CanReadOldBDROM) report.SCSI.MultiMediaDevice.Features.CanReadOldBDROM)
{ {
if (!mediaTypes.Contains("BD-ROM")) mediaTypes.Add("BD-ROM"); if (!mediaTypes.Contains("BD-ROM")) mediaTypes.Add("BD-ROM");
if(!mediaTypes.Contains("BD-R HTL (not LTH)")) mediaTypes.Add("BD-R HTL (not LTH)"); if (!mediaTypes.Contains("BD-R HTL (not LTH)"))
mediaTypes.Add("BD-R HTL (not LTH)");
if (!mediaTypes.Contains("BD-RE")) mediaTypes.Add("BD-RE"); if (!mediaTypes.Contains("BD-RE")) mediaTypes.Add("BD-RE");
if (!mediaTypes.Contains("BD-R LTH")) mediaTypes.Add("BD-R LTH"); if (!mediaTypes.Contains("BD-R LTH")) mediaTypes.Add("BD-R LTH");
if (!mediaTypes.Contains("BD-R Triple Layer (100Gb)")) if (!mediaTypes.Contains("BD-R Triple Layer (100Gb)"))
@@ -408,8 +414,10 @@ namespace DiscImageChef.Commands
mediaTypes.Add("BD-R Quad Layer (128Gb)"); mediaTypes.Add("BD-R Quad Layer (128Gb)");
if (!mediaTypes.Contains("Ultra HD Blu-ray movie")) if (!mediaTypes.Contains("Ultra HD Blu-ray movie"))
mediaTypes.Add("Ultra HD Blu-ray movie"); mediaTypes.Add("Ultra HD Blu-ray movie");
if(!mediaTypes.Contains("PlayStation 3 game")) mediaTypes.Add("PlayStation 3 game"); if (!mediaTypes.Contains("PlayStation 3 game"))
if(!mediaTypes.Contains("PlayStation 4 game")) mediaTypes.Add("PlayStation 4 game"); mediaTypes.Add("PlayStation 3 game");
if (!mediaTypes.Contains("PlayStation 4 game"))
mediaTypes.Add("PlayStation 4 game");
if (!mediaTypes.Contains("Xbox One game")) mediaTypes.Add("Xbox One game"); if (!mediaTypes.Contains("Xbox One game")) mediaTypes.Add("Xbox One game");
if (!mediaTypes.Contains("Nintendo Wii U game")) if (!mediaTypes.Contains("Nintendo Wii U game"))
mediaTypes.Add("Nintendo Wii U game"); mediaTypes.Add("Nintendo Wii U game");
@@ -519,7 +527,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N) while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{ {
DicConsole DicConsole
.Write("Do you have want to try Plextor vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): "); .Write(
"Do you have want to try Plextor vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): ");
pressedKey = System.Console.ReadKey(); pressedKey = System.Console.ReadKey();
DicConsole.WriteLine(); DicConsole.WriteLine();
} }
@@ -533,7 +542,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N) while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{ {
DicConsole DicConsole
.Write("Do you have want to try NEC vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): "); .Write(
"Do you have want to try NEC vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): ");
pressedKey = System.Console.ReadKey(); pressedKey = System.Console.ReadKey();
DicConsole.WriteLine(); DicConsole.WriteLine();
} }
@@ -547,7 +557,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N) while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{ {
DicConsole DicConsole
.Write("Do you have want to try Pioneer vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): "); .Write(
"Do you have want to try Pioneer vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): ");
pressedKey = System.Console.ReadKey(); pressedKey = System.Console.ReadKey();
DicConsole.WriteLine(); DicConsole.WriteLine();
} }
@@ -561,7 +572,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N) while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{ {
DicConsole DicConsole
.Write("Do you have want to try HL-DT-ST (aka LG) vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): "); .Write(
"Do you have want to try HL-DT-ST (aka LG) vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): ");
pressedKey = System.Console.ReadKey(); pressedKey = System.Console.ReadKey();
DicConsole.WriteLine(); DicConsole.WriteLine();
} }
@@ -599,6 +611,7 @@ namespace DiscImageChef.Commands
{ {
FixedSense? decSense = Sense.DecodeFixed(senseBuffer); FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
if (decSense.HasValue) if (decSense.HasValue)
{
if (decSense.Value.ASC == 0x3A) if (decSense.Value.ASC == 0x3A)
{ {
int leftRetries = 50; int leftRetries = 50;
@@ -653,6 +666,7 @@ namespace DiscImageChef.Commands
decSense.Value.ASCQ); decSense.Value.ASCQ);
mediaIsRecognized = false; mediaIsRecognized = false;
} }
}
else else
{ {
DicConsole.DebugWriteLine("Device-Report command", DicConsole.DebugWriteLine("Device-Report command",
@@ -661,7 +675,7 @@ namespace DiscImageChef.Commands
} }
} }
TestedMedia mediaTest = new TestedMedia(); var mediaTest = new TestedMedia();
if (mediaIsRecognized) if (mediaIsRecognized)
{ {
mediaTest = reporter.ReportMmcMedia(mediaType, tryPlextor, tryPioneer, tryNec, mediaTest = reporter.ReportMmcMedia(mediaType, tryPlextor, tryPioneer, tryNec,
@@ -676,7 +690,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N) while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{ {
DicConsole DicConsole
.Write("Drive supports SCSI READ LONG but I cannot find the correct size. Do you want me to try? (This can take hours) (Y/N): "); .Write(
"Drive supports SCSI READ LONG but I cannot find the correct size. Do you want me to try? (This can take hours) (Y/N): ");
pressedKey = System.Console.ReadKey(); pressedKey = System.Console.ReadKey();
DicConsole.WriteLine(); DicConsole.WriteLine();
} }
@@ -764,6 +779,7 @@ namespace DiscImageChef.Commands
{ {
FixedSense? decSense = Sense.DecodeFixed(senseBuffer); FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
if (decSense.HasValue) if (decSense.HasValue)
{
if (decSense.Value.ASC == 0x3A) if (decSense.Value.ASC == 0x3A)
{ {
int leftRetries = 50; int leftRetries = 50;
@@ -818,6 +834,7 @@ namespace DiscImageChef.Commands
decSense.Value.ASCQ); decSense.Value.ASCQ);
mediaIsRecognized = false; mediaIsRecognized = false;
} }
}
else else
{ {
DicConsole.DebugWriteLine("Device-Report command", DicConsole.DebugWriteLine("Device-Report command",
@@ -826,7 +843,7 @@ namespace DiscImageChef.Commands
} }
} }
TestedSequentialMedia seqTest = new TestedSequentialMedia(); var seqTest = new TestedSequentialMedia();
if (mediaIsRecognized) seqTest = reporter.ReportSscMedia(); if (mediaIsRecognized) seqTest = reporter.ReportSscMedia();
@@ -913,11 +930,14 @@ namespace DiscImageChef.Commands
mediaIsRecognized &= !sense; mediaIsRecognized &= !sense;
} }
else mediaIsRecognized = false; else
{
mediaIsRecognized = false;
}
else mediaIsRecognized = false; else mediaIsRecognized = false;
} }
TestedMedia mediaTest = new TestedMedia(); var mediaTest = new TestedMedia();
if (mediaIsRecognized) if (mediaIsRecognized)
{ {
@@ -930,7 +950,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N) while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{ {
DicConsole DicConsole
.Write("Drive supports SCSI READ LONG but I cannot find the correct size. Do you want me to try? (This can take hours) (Y/N): "); .Write(
"Drive supports SCSI READ LONG but I cannot find the correct size. Do you want me to try? (This can take hours) (Y/N): ");
pressedKey = System.Console.ReadKey(); pressedKey = System.Console.ReadKey();
DicConsole.WriteLine(); DicConsole.WriteLine();
} }
@@ -987,7 +1008,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N) while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{ {
DicConsole DicConsole
.Write("Drive supports SCSI READ LONG but I cannot find the correct size. Do you want me to try? (This can take hours) (Y/N): "); .Write(
"Drive supports SCSI READ LONG but I cannot find the correct size. Do you want me to try? (This can take hours) (Y/N): ");
pressedKey = System.Console.ReadKey(); pressedKey = System.Console.ReadKey();
DicConsole.WriteLine(); DicConsole.WriteLine();
} }
@@ -1044,7 +1066,7 @@ namespace DiscImageChef.Commands
jsonSw.Close(); jsonSw.Close();
jsonFs.Close(); jsonFs.Close();
using(DicContext ctx = DicContext.Create(Settings.Settings.LocalDbPath)) using (var ctx = DicContext.Create(Settings.Settings.LocalDbPath))
{ {
ctx.Reports.Add(new Report(report)); ctx.Reports.Add(new Report(report));
ctx.SaveChanges(); ctx.SaveChanges();