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 Ditto drive and tapes
- Iomega JAZ and JAZ 2
- Iomega REV 70Gb and 120Gb
- Iomega REV 70Gb
- Iomega ZIP750 drive
- LD-ROM drive and media
- LTO drive and tapes

View File

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

View File

@@ -58,15 +58,15 @@ namespace DiscImageChef.Core.Devices.Dumping
{
bool sense;
byte[] tmpBuf;
bool compactDisc = true;
bool isXbox = false;
var compactDisc = true;
var isXbox = false;
// 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 _);
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);
switch (ftr.CurrentProfile)
@@ -173,10 +173,10 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
Reader scsiReader = new Reader(dev, dev.Timeout, null, dumpRaw);
ulong blocks = scsiReader.GetDeviceBlocks();
var scsiReader = new Reader(dev, dev.Timeout, null, dumpRaw);
var blocks = scsiReader.GetDeviceBlocks();
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)
switch (blocks + 1)
@@ -184,12 +184,20 @@ namespace DiscImageChef.Core.Devices.Dumping
case 1281856:
dskType = MediaType.PD650_WORM;
break;
case 58620544:
dskType = MediaType.REV120;
break;
case 17090880:
dskType = MediaType.REV35;
break;
// TODO: Unknown value
default:
dskType = MediaType.REV70;
break;
}
#region Nintendo
switch (dskType)
{
case MediaType.Unknown when blocks > 0:
@@ -198,7 +206,7 @@ namespace DiscImageChef.Core.Devices.Dumping
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _);
if (!sense)
{
PFI.PhysicalFormatInformation? nintendoPfi = PFI.Decode(cmdBuf);
var nintendoPfi = PFI.Decode(cmdBuf);
if (nintendoPfi != null)
if (nintendoPfi.Value.DiskCategory == DiskCategory.Nintendo &&
nintendoPfi.Value.PartVersion == 15)
@@ -238,7 +246,7 @@ namespace DiscImageChef.Core.Devices.Dumping
Array.Copy(cmdBuf, 4, tmpBuf, 0, cmdBuf.Length - 4);
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)}");
// False book types
@@ -298,7 +306,10 @@ namespace DiscImageChef.Core.Devices.Dumping
{
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))
{
dskType = MediaType.XGD2;
@@ -310,7 +321,7 @@ namespace DiscImageChef.Core.Devices.Dumping
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 &&
!Inquiry.Decode(inqBuf).Value.KreonPresent)
@@ -324,7 +335,8 @@ namespace DiscImageChef.Core.Devices.Dumping
if (dumpRaw && !force)
{
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
return;
}
@@ -342,12 +354,15 @@ namespace DiscImageChef.Core.Devices.Dumping
break;
}
#endregion Nintendo
#region All DVD and HD DVD types
#endregion All DVD and HD DVD types
#region DVD-ROM
if (dskType == MediaType.DVDDownload || dskType == MediaType.DVDROM)
{
dumpLog.WriteLine("Reading Lead-in Copyright Information.");
@@ -361,11 +376,13 @@ namespace DiscImageChef.Core.Devices.Dumping
mediaTags.Add(MediaTagType.DVD_CMI, tmpBuf);
}
}
#endregion DVD-ROM
switch (dskType)
{
#region DVD-ROM and HD DVD-ROM
case MediaType.DVDDownload:
case MediaType.DVDROM:
case MediaType.HDDVDROM:
@@ -380,9 +397,11 @@ namespace DiscImageChef.Core.Devices.Dumping
}
break;
#endregion DVD-ROM and HD DVD-ROM
#region DVD-RAM and HD DVD-RAM
case MediaType.DVDRAM:
case MediaType.HDDVDRAM:
dumpLog.WriteLine("Reading Disc Description Structure.");
@@ -409,9 +428,11 @@ namespace DiscImageChef.Core.Devices.Dumping
}
break;
#endregion DVD-RAM and HD DVD-RAM
#region DVD-R and DVD-RW
case MediaType.DVDR:
case MediaType.DVDRW:
dumpLog.WriteLine("Reading Pre-Recorded Information.");
@@ -425,12 +446,14 @@ namespace DiscImageChef.Core.Devices.Dumping
}
break;
#endregion DVD-R and DVD-RW
}
switch (dskType)
{
#region DVD-R, DVD-RW and HD DVD-R
case MediaType.DVDR:
case MediaType.DVDRW:
case MediaType.HDDVDR:
@@ -456,9 +479,11 @@ namespace DiscImageChef.Core.Devices.Dumping
}
break;
#endregion DVD-R, DVD-RW and HD DVD-R
#region All DVD+
case MediaType.DVDPR:
case MediaType.DVDPRDL:
case MediaType.DVDPRW:
@@ -484,9 +509,11 @@ namespace DiscImageChef.Core.Devices.Dumping
}
break;
#endregion All DVD+
#region HD DVD-ROM
case MediaType.HDDVDROM:
dumpLog.WriteLine("Reading Lead-in Copyright Information.");
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -500,9 +527,11 @@ namespace DiscImageChef.Core.Devices.Dumping
}
break;
#endregion HD DVD-ROM
#region All Blu-ray
case MediaType.BDR:
case MediaType.BDRE:
case MediaType.BDROM:
@@ -531,12 +560,14 @@ namespace DiscImageChef.Core.Devices.Dumping
mediaTags.Add(MediaTagType.PAC, tmpBuf);
}*/
break;
#endregion All Blu-ray
}
switch (dskType)
{
#region BD-ROM only
case MediaType.BDROM:
dumpLog.WriteLine("Reading Burst Cutting Area.");
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0,
@@ -549,9 +580,11 @@ namespace DiscImageChef.Core.Devices.Dumping
}
break;
#endregion BD-ROM only
#region Writable Blu-ray only
case MediaType.BDR:
case MediaType.BDRE:
case MediaType.BDRXL:
@@ -577,6 +610,7 @@ namespace DiscImageChef.Core.Devices.Dumping
}
break;
#endregion Writable Blu-ray only
}
@@ -620,12 +654,12 @@ namespace DiscImageChef.Core.Devices.Dumping
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);
tmp[0] = (byte) ((tag.Value.Length & 0xFF00) >> 8);
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)
sidecar.OpticalDisc[0].CopyProtection = cpy.Value.CopyrightType.ToString();

View File

@@ -56,37 +56,47 @@ namespace DiscImageChef.Core.Media.Info
public class ScsiInfo
{
/// <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>
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>
const string PS2_JAPANESE_HASH = "b82bffb809070d61fe050b7e1545df53d8f3cc648257cdff7502bc0ba6b38870";
static readonly byte[] Ps3Id =
private const string PS2_JAPANESE_HASH = "b82bffb809070d61fe050b7e1545df53d8f3cc648257cdff7502bc0ba6b38870";
private static readonly byte[] Ps3Id =
{
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
};
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
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>
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
};
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,
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
};
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,
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;
MediaInserted = false;
int resets = 0;
uint startOfFirstDataTrack = uint.MaxValue;
var resets = 0;
var startOfFirstDataTrack = uint.MaxValue;
bool sense;
byte[] cmdBuf;
byte[] senseBuf;
@@ -116,7 +126,7 @@ namespace DiscImageChef.Core.Media.Info
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
if (sense)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuf);
var decSense = Sense.DecodeFixed(senseBuf);
if (decSense.HasValue)
{
// Just retry, for 5 times
@@ -128,7 +138,7 @@ namespace DiscImageChef.Core.Media.Info
if (decSense.Value.ASC == 0x3A)
{
int leftRetries = 5;
var leftRetries = 5;
while (leftRetries > 0)
{
//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)
{
int leftRetries = 10;
var leftRetries = 10;
while (leftRetries > 0)
{
//DicConsole.WriteLine("\rWaiting for drive to become ready");
@@ -235,7 +245,7 @@ namespace DiscImageChef.Core.Media.Info
if (ReadCapacity16 != null)
{
byte[] temp = new byte[8];
var temp = new byte[8];
Array.Copy(cmdBuf, 0, temp, 0, 8);
Array.Reverse(temp);
@@ -250,7 +260,7 @@ namespace DiscImageChef.Core.Media.Info
case PeripheralDeviceTypes.SequentialAccess:
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)
{
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,
out _);
if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ GET CONFIGURATION:\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
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",
ftr.CurrentProfile);
@@ -314,7 +326,20 @@ namespace DiscImageChef.Core.Media.Info
MediaType = MediaType.PD650;
break;
case 0x41:
switch (Blocks)
{
case 58620544:
MediaType = MediaType.REV120;
break;
case 17090880:
MediaType = MediaType.REV35;
break;
default:
// TODO: Unknown value
MediaType = MediaType.REV70;
break;
}
break;
default:
MediaType = MediaType.Unknown;
@@ -436,6 +461,7 @@ namespace DiscImageChef.Core.Media.Info
*/
#region All DVD and HD DVD types
if (MediaType == MediaType.DVDDownload || MediaType == MediaType.DVDPR ||
MediaType == MediaType.DVDPRDL || MediaType == MediaType.DVDPRW ||
MediaType == MediaType.DVDPRWDL ||
@@ -450,8 +476,10 @@ namespace DiscImageChef.Core.Media.Info
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _);
if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: PFI\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
DvdPfi = cmdBuf;
@@ -515,12 +543,17 @@ namespace DiscImageChef.Core.Media.Info
MmcDiscStructureFormat.DiscManufacturingInformation, 0, dev.Timeout,
out _);
if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: DMI\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
DvdDmi = cmdBuf;
if(DMI.IsXbox(cmdBuf)) MediaType = MediaType.XGD;
if (DMI.IsXbox(cmdBuf))
{
MediaType = MediaType.XGD;
}
else if (DMI.IsXbox360(cmdBuf))
{
MediaType = MediaType.XGD2;
@@ -533,9 +566,11 @@ namespace DiscImageChef.Core.Media.Info
}
}
}
#endregion All DVD and HD DVD types
#region DVD-ROM
if (MediaType == MediaType.DVDDownload || MediaType == MediaType.DVDROM)
{
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -545,11 +580,13 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else DvdCmi = cmdBuf;
}
#endregion DVD-ROM
switch (MediaType)
{
#region DVD-ROM and HD DVD-ROM
case MediaType.DVDDownload:
case MediaType.DVDROM:
case MediaType.HDDVDROM:
@@ -567,9 +604,11 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else DvdAacs = cmdBuf;
break;
#endregion DVD-ROM and HD DVD-ROM
#region DVD-RAM and HD DVD-RAM
case MediaType.DVDRAM:
case MediaType.HDDVDRAM:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -595,9 +634,11 @@ namespace DiscImageChef.Core.Media.Info
else DvdRamSpareArea = cmdBuf;
break;
#endregion DVD-RAM and HD DVD-RAM
#region DVD-R and HD DVD-R
case MediaType.DVDR:
case MediaType.HDDVDR:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -608,10 +649,12 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else LastBorderOutRmd = cmdBuf;
break;
#endregion DVD-R and HD DVD-R
}
#region Require drive authentication, won't work
/*
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.DiscKey, 0, dev.Timeout, out _);
if(sense)
@@ -669,9 +712,11 @@ namespace DiscImageChef.Core.Media.Info
else
DataFile.WriteTo("Media-Info command", outputPrefix, "_readdiscstructure_aacsdatakeys.bin", "SCSI READ DISC STRUCTURE", cmdBuf);
*/
#endregion Require drive authentication, won't work
#region DVD-R and DVD-RW
if (MediaType == MediaType.DVDR || MediaType == MediaType.DVDRW)
{
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -681,11 +726,13 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else DvdPreRecordedInfo = cmdBuf;
}
#endregion DVD-R and DVD-RW
switch (MediaType)
{
#region DVD-R, DVD-RW and HD DVD-R
case MediaType.DVDR:
case MediaType.DVDRW:
case MediaType.HDDVDR:
@@ -706,9 +753,11 @@ namespace DiscImageChef.Core.Media.Info
else DvdrPhysicalInformation = cmdBuf;
break;
#endregion DVD-R, DVD-RW and HD DVD-R
#region All DVD+
case MediaType.DVDPR:
case MediaType.DVDPRDL:
case MediaType.DVDPRW:
@@ -727,9 +776,11 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else DvdPlusDcb = cmdBuf;
break;
#endregion All DVD+
#region HD DVD-ROM
case MediaType.HDDVDROM:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.HddvdCopyrightInformation, 0, dev.Timeout,
@@ -739,10 +790,12 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else HddvdCopyrightInformation = cmdBuf;
break;
#endregion HD DVD-ROM
}
#region HD DVD-R
if (MediaType == MediaType.HDDVDR)
{
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
@@ -759,9 +812,11 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else HddvdrLastRmd = cmdBuf;
}
#endregion HD DVD-R
#region DVD-R DL, DVD-RW DL, DVD+R DL, DVD+RW DL
if (MediaType == MediaType.DVDPRDL || MediaType == MediaType.DVDRDL || MediaType == MediaType.DVDRWDL ||
MediaType == MediaType.DVDPRWDL)
{
@@ -772,11 +827,13 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else DvdrLayerCapacity = cmdBuf;
}
#endregion DVD-R DL, DVD-RW DL, DVD+R DL, DVD+RW DL
switch (MediaType)
{
#region DVD-R DL
case MediaType.DVDRDL:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.MiddleZoneStart, 0, dev.Timeout, out _);
@@ -808,9 +865,11 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else DvdrDlRemapAnchorPoint = cmdBuf;
break;
#endregion DVD-R DL
#region All Blu-ray
case MediaType.BDR:
case MediaType.BDRE:
case MediaType.BDROM:
@@ -830,12 +889,14 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else BlurayPac = cmdBuf;
break;
#endregion All Blu-ray
}
switch (MediaType)
{
#region BD-ROM only
case MediaType.BDROM:
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdBurstCuttingArea, 0, dev.Timeout, out _);
@@ -845,9 +906,11 @@ namespace DiscImageChef.Core.Media.Info
else BlurayBurstCuttingArea = cmdBuf;
break;
#endregion BD-ROM only
#region Writable Blu-ray only
case MediaType.BDR:
case MediaType.BDRE:
case MediaType.BDRXL:
@@ -897,9 +960,11 @@ namespace DiscImageChef.Core.Media.Info
else BlurayPowResources = cmdBuf;
break;
#endregion Writable Blu-ray only
#region CDs
case MediaType.CD:
case MediaType.CDR:
case MediaType.CDROM:
@@ -907,10 +972,12 @@ namespace DiscImageChef.Core.Media.Info
case MediaType.Unknown:
// We discarded all discs that falsify a TOC before requesting a real TOC
// 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)
{
DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: TOC\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
Toc = cmdBuf;
@@ -923,8 +990,10 @@ namespace DiscImageChef.Core.Media.Info
// ATIP exists on blank CDs
sense = dev.ReadAtip(out cmdBuf, out senseBuf, dev.Timeout, out _);
if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: ATIP\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
Atip = cmdBuf;
@@ -941,8 +1010,10 @@ namespace DiscImageChef.Core.Media.Info
MmcDiscInformationDataTypes.DiscInformation, dev.Timeout,
out _);
if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ DISC INFORMATION 000b\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
CompactDiscInformation = cmdBuf;
@@ -960,13 +1031,15 @@ namespace DiscImageChef.Core.Media.Info
}
}
int sessions = 1;
int firstTrackLastSession = 0;
var sessions = 1;
var firstTrackLastSession = 0;
sense = dev.ReadSessionInfo(out cmdBuf, out senseBuf, dev.Timeout, out _);
if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: Session info\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
Session = cmdBuf;
@@ -980,13 +1053,13 @@ namespace DiscImageChef.Core.Media.Info
if (MediaType == MediaType.CD)
{
bool hasDataTrack = false;
bool hasAudioTrack = false;
bool allFirstSessionTracksAreAudio = true;
bool hasVideoTrack = false;
var hasDataTrack = false;
var hasAudioTrack = false;
var allFirstSessionTracksAreAudio = true;
var hasVideoTrack = false;
if (DecodedToc.HasValue)
foreach(TOC.CDTOCTrackDataDescriptor track in DecodedToc.Value.TrackDescriptors)
foreach (var track in DecodedToc.Value.TrackDescriptors)
{
if (track.TrackNumber == 1 &&
((TocControl) (track.CONTROL & 0x0D) == TocControl.DataTrack ||
@@ -1001,7 +1074,10 @@ namespace DiscImageChef.Core.Media.Info
hasDataTrack = true;
allFirstSessionTracksAreAudio &= track.TrackNumber >= firstTrackLastSession;
}
else hasAudioTrack = true;
else
{
hasAudioTrack = true;
}
hasVideoTrack |= track.ADR == 4;
}
@@ -1015,8 +1091,10 @@ namespace DiscImageChef.Core.Media.Info
sense = dev.ReadRawToc(out cmdBuf, out senseBuf, 1, dev.Timeout, out _);
if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: Raw TOC\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
RawToc = cmdBuf;
@@ -1024,7 +1102,7 @@ namespace DiscImageChef.Core.Media.Info
FullToc = FullTOC.Decode(cmdBuf);
if (FullToc.HasValue)
{
FullTOC.TrackDataDescriptor a0Track =
var a0Track =
FullToc.Value.TrackDescriptors
.FirstOrDefault(t => t.POINT == 0xA0 && t.ADR == 1);
if (a0Track.POINT == 0xA0)
@@ -1053,21 +1131,23 @@ namespace DiscImageChef.Core.Media.Info
sense = dev.ReadCdText(out cmdBuf, out senseBuf, dev.Timeout, out _);
if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ TOC/PMA/ATIP: CD-TEXT\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
CdTextLeadIn = 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;
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);
}
@@ -1075,21 +1155,25 @@ namespace DiscImageChef.Core.Media.Info
}
break;
#endregion CDs
}
#region Nintendo
if (MediaType == MediaType.Unknown && Blocks > 0)
{
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _);
if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ DISC STRUCTURE: PFI\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
DvdPfi = cmdBuf;
PFI.PhysicalFormatInformation? nintendoPfi = PFI.Decode(cmdBuf);
var nintendoPfi = PFI.Decode(cmdBuf);
if (nintendoPfi != null)
{
DicConsole.WriteLine("PFI:\n{0}", PFI.Prettify(cmdBuf));
@@ -1115,13 +1199,16 @@ namespace DiscImageChef.Core.Media.Info
Sense.PrettifySense(senseBuf));
else DvdDmi = cmdBuf;
}
#endregion Nintendo
}
sense = dev.ReadMediaSerialNumber(out cmdBuf, out senseBuf, dev.Timeout, out _);
if (sense)
{
DicConsole.DebugWriteLine("Media-Info command", "READ MEDIA SERIAL NUMBER\n{0}",
Sense.PrettifySense(senseBuf));
}
else
{
if (cmdBuf.Length >= 4) MediaSerialNumber = cmdBuf;
@@ -1130,14 +1217,15 @@ namespace DiscImageChef.Core.Media.Info
switch (MediaType)
{
#region Xbox
case MediaType.XGD:
case MediaType.XGD2:
case MediaType.XGD3:
// 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)
{
Inquiry.SCSIInquiry? inq = Inquiry.Decode(inqBuffer);
var inq = Inquiry.Decode(inqBuffer);
if (inq.HasValue && inq.Value.KreonPresent)
{
sense = dev.KreonExtractSs(out cmdBuf, out senseBuf, dev.Timeout, out _);
@@ -1164,7 +1252,7 @@ namespace DiscImageChef.Core.Media.Info
return;
}
ulong totalSize =
var totalSize =
(ulong) ((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]);
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _);
@@ -1178,7 +1266,7 @@ namespace DiscImageChef.Core.Media.Info
totalSize);
ulong l0Video = PFI.Decode(cmdBuf).Value.Layer0EndPSN -
PFI.Decode(cmdBuf).Value.DataAreaStartPSN + 1;
ulong l1Video = totalSize - l0Video + 1;
var l1Video = totalSize - l0Video + 1;
// Get game partition size
DicConsole.DebugWriteLine("Dump-media command", "Getting game partition size");
@@ -1196,7 +1284,7 @@ namespace DiscImageChef.Core.Media.Info
return;
}
ulong gameSize =
var gameSize =
(ulong) ((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]) + 1;
DicConsole.DebugWriteLine("Dump-media command", "Game partition total size: {0} sectors",
gameSize);
@@ -1228,13 +1316,13 @@ namespace DiscImageChef.Core.Media.Info
DicConsole.DebugWriteLine("Dump-media command", "Unlocked total size: {0} sectors",
totalSize);
ulong middleZone =
var middleZone =
totalSize -
(PFI.Decode(cmdBuf).Value.Layer0EndPSN -
PFI.Decode(cmdBuf).Value.DataAreaStartPSN + 1) - gameSize + 1;
totalSize = l0Video + l1Video + middleZone * 2 + gameSize;
ulong layerBreak = l0Video + middleZone + gameSize / 2;
var layerBreak = l0Video + middleZone + gameSize / 2;
XgdInfo = new XgdInfo
{
@@ -1249,6 +1337,7 @@ namespace DiscImageChef.Core.Media.Info
}
break;
#endregion Xbox
case MediaType.Unknown:
@@ -1275,7 +1364,7 @@ namespace DiscImageChef.Core.Media.Info
if (secondSessionFirstTrack != 0 && DecodedToc.HasValue &&
DecodedToc.Value.TrackDescriptors.Any(t => t.TrackNumber == secondSessionFirstTrack))
{
uint firstSectorSecondSessionFirstTrack = DecodedToc
var firstSectorSecondSessionFirstTrack = DecodedToc
.Value.TrackDescriptors
.First(t => t.TrackNumber == secondSessionFirstTrack)
.TrackStartAddress;
@@ -1284,7 +1373,10 @@ namespace DiscImageChef.Core.Media.Info
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out _);
if(!sense && !dev.Error) firstTrackSecondSession = cmdBuf;
if (!sense && !dev.Error)
{
firstTrackSecondSession = cmdBuf;
}
else
{
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,
MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out _);
if(!sense && !dev.Error) firstTrackSecondSessionAudio = cmdBuf;
if (!sense && !dev.Error)
{
firstTrackSecondSessionAudio = cmdBuf;
}
else
{
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];
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,
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++)
{
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++)
{
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;
}
}
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)
{
// The decryption key is applied as XOR. As first byte is originally always NULL, it gives us the key :)
byte decryptByte = ps2BootSectors[0];
for(int i = 0; i < 0x6000; i++) ps2BootSectors[i] ^= decryptByte;
var decryptByte = ps2BootSectors[0];
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}",
ps2BootSectorsHash);
if (ps2BootSectorsHash == PS2_PAL_HASH || ps2BootSectorsHash == PS2_NTSC_HASH ||
@@ -1713,7 +1811,7 @@ namespace DiscImageChef.Core.Media.Info
if (sector0 != null)
{
byte[] syncBytes = new byte[7];
var syncBytes = new byte[7];
Array.Copy(sector0, 0, syncBytes, 0, 7);
if (OperaId.SequenceEqual(syncBytes)) MediaType = MediaType.ThreeDO;
@@ -1722,8 +1820,8 @@ namespace DiscImageChef.Core.Media.Info
if (playdia1 != null && playdia2 != null)
{
byte[] pd1 = new byte[PlaydiaCopyright.Length];
byte[] pd2 = new byte[PlaydiaCopyright.Length];
var pd1 = new byte[PlaydiaCopyright.Length];
var pd2 = new byte[PlaydiaCopyright.Length];
Array.Copy(playdia1, 38, pd1, 0, pd1.Length);
Array.Copy(playdia2, 0, pd2, 0, pd1.Length);
@@ -1734,7 +1832,7 @@ namespace DiscImageChef.Core.Media.Info
if (secondDataSectorNotZero != null)
{
byte[] pce = new byte[PcEngineSignature.Length];
var pce = new byte[PcEngineSignature.Length];
Array.Copy(secondDataSectorNotZero, 32, pce, 0, pce.Length);
if (PcEngineSignature.SequenceEqual(pce)) MediaType = MediaType.SuperCDROM2;
@@ -1742,7 +1840,7 @@ namespace DiscImageChef.Core.Media.Info
if (firstDataSectorNotZero != null)
{
byte[] pcfx = new byte[PcFxSignature.Length];
var pcfx = new byte[PcFxSignature.Length];
Array.Copy(firstDataSectorNotZero, 0, pcfx, 0, pcfx.Length);
if (PcFxSignature.SequenceEqual(pcfx)) MediaType = MediaType.PCFX;
@@ -1750,8 +1848,8 @@ namespace DiscImageChef.Core.Media.Info
if (firstTrackSecondSessionAudio != null)
{
byte[] jaguar = new byte[AtariSignature.Length];
for(int i = 0; i + jaguar.Length <= firstTrackSecondSessionAudio.Length; i += 2)
var jaguar = new byte[AtariSignature.Length];
for (var i = 0; i + jaguar.Length <= firstTrackSecondSessionAudio.Length; i += 2)
{
Array.Copy(firstTrackSecondSessionAudio, i, jaguar, 0, jaguar.Length);
@@ -1765,7 +1863,7 @@ namespace DiscImageChef.Core.Media.Info
if (firstTrackSecondSession != null)
if (firstTrackSecondSession.Length >= 2336)
{
byte[] milcd = new byte[2048];
var milcd = new byte[2048];
Array.Copy(firstTrackSecondSession, 24, milcd, 0, 2048);
if (Dreamcast.DecodeIPBin(milcd).HasValue) MediaType = MediaType.MilCD;
}
@@ -1787,10 +1885,10 @@ namespace DiscImageChef.Core.Media.Info
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 :)
byte decryptByte = ps2BootSectors[0];
for(int i = 0; i < 0x6000; i++) ps2BootSectors[i] ^= decryptByte;
var decryptByte = ps2BootSectors[0];
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}",
ps2BootSectorsHash);
if (ps2BootSectorsHash == PS2_PAL_HASH || ps2BootSectorsHash == PS2_NTSC_HASH ||
@@ -1799,7 +1897,7 @@ namespace DiscImageChef.Core.Media.Info
if (sector1 != null)
{
byte[] tmp = new byte[Ps3Id.Length];
var tmp = new byte[Ps3Id.Length];
Array.Copy(sector1, 0, tmp, 0, tmp.Length);
if (tmp.SequenceEqual(Ps3Id))
switch (MediaType)

View File

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

View File

@@ -51,11 +51,11 @@ using DeviceReport = DiscImageChef.Core.Devices.Report.DeviceReport;
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",
"Tests the device capabilities and creates an JSON report of them.")
@@ -108,7 +108,8 @@ namespace DiscImageChef.Commands
if (!DetectOS.IsAdmin)
{
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.");
return (int) ErrorNumber.NotEnoughPermissions;
}
@@ -116,7 +117,7 @@ namespace DiscImageChef.Commands
if (devicePath.Length == 2 && devicePath[1] == ':' && devicePath[0] != '/' && char.IsLetter(devicePath[0]))
devicePath = "\\\\.\\" + char.ToUpper(devicePath[0]) + ':';
Device dev = new Device(devicePath);
var dev = new Device(devicePath);
if (dev.Error)
{
@@ -126,7 +127,7 @@ namespace DiscImageChef.Commands
Statistics.AddDevice(dev);
DeviceReportV2 report = new DeviceReportV2
var report = new DeviceReportV2
{
Manufacturer = dev.Manufacturer, Model = dev.Model, Revision = dev.Revision, Type = dev.Type
};
@@ -142,7 +143,7 @@ namespace DiscImageChef.Commands
jsonFile = jsonFile.Replace('\\', '_').Replace('/', '_').Replace('?', '_');
DeviceReport reporter = new DeviceReport(dev, MainClass.Debug);
var reporter = new DeviceReport(dev, MainClass.Debug);
ConsoleKeyInfo pressedKey;
@@ -271,7 +272,7 @@ namespace DiscImageChef.Commands
DicConsole.Write("Please write the media model and press enter: ");
mediumModel = System.Console.ReadLine();
TestedMedia mediaTest = reporter.ReportAtaMedia();
var mediaTest = reporter.ReportAtaMedia();
mediaTest.MediumTypeName = mediumTypeName;
mediaTest.Model = mediumModel;
@@ -280,7 +281,10 @@ namespace DiscImageChef.Commands
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;
}
@@ -308,7 +312,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{
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();
DicConsole.WriteLine();
}
@@ -355,7 +360,7 @@ namespace DiscImageChef.Commands
case PeripheralDeviceTypes.MultiMediaDevice:
{
bool iomegaRev = dev.Manufacturer.ToLowerInvariant() == "iomega" &&
dev.Model.ToLowerInvariant() == "rrd";
dev.Model.ToLowerInvariant().StartsWith("rrd");
List<string> mediaTypes = new List<string>();
@@ -399,7 +404,8 @@ namespace DiscImageChef.Commands
report.SCSI.MultiMediaDevice.Features.CanReadOldBDROM)
{
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-R LTH")) mediaTypes.Add("BD-R LTH");
if (!mediaTypes.Contains("BD-R Triple Layer (100Gb)"))
@@ -408,8 +414,10 @@ namespace DiscImageChef.Commands
mediaTypes.Add("BD-R Quad Layer (128Gb)");
if (!mediaTypes.Contains("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 4 game")) mediaTypes.Add("PlayStation 4 game");
if (!mediaTypes.Contains("PlayStation 3 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("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)
{
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();
DicConsole.WriteLine();
}
@@ -533,7 +542,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{
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();
DicConsole.WriteLine();
}
@@ -547,7 +557,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{
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();
DicConsole.WriteLine();
}
@@ -561,7 +572,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{
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();
DicConsole.WriteLine();
}
@@ -599,6 +611,7 @@ namespace DiscImageChef.Commands
{
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
if (decSense.HasValue)
{
if (decSense.Value.ASC == 0x3A)
{
int leftRetries = 50;
@@ -653,6 +666,7 @@ namespace DiscImageChef.Commands
decSense.Value.ASCQ);
mediaIsRecognized = false;
}
}
else
{
DicConsole.DebugWriteLine("Device-Report command",
@@ -661,7 +675,7 @@ namespace DiscImageChef.Commands
}
}
TestedMedia mediaTest = new TestedMedia();
var mediaTest = new TestedMedia();
if (mediaIsRecognized)
{
mediaTest = reporter.ReportMmcMedia(mediaType, tryPlextor, tryPioneer, tryNec,
@@ -676,7 +690,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{
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();
DicConsole.WriteLine();
}
@@ -764,6 +779,7 @@ namespace DiscImageChef.Commands
{
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
if (decSense.HasValue)
{
if (decSense.Value.ASC == 0x3A)
{
int leftRetries = 50;
@@ -818,6 +834,7 @@ namespace DiscImageChef.Commands
decSense.Value.ASCQ);
mediaIsRecognized = false;
}
}
else
{
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();
@@ -913,11 +930,14 @@ namespace DiscImageChef.Commands
mediaIsRecognized &= !sense;
}
else mediaIsRecognized = false;
else
{
mediaIsRecognized = false;
}
else mediaIsRecognized = false;
}
TestedMedia mediaTest = new TestedMedia();
var mediaTest = new TestedMedia();
if (mediaIsRecognized)
{
@@ -930,7 +950,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{
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();
DicConsole.WriteLine();
}
@@ -987,7 +1008,8 @@ namespace DiscImageChef.Commands
while (pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{
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();
DicConsole.WriteLine();
}
@@ -1044,7 +1066,7 @@ namespace DiscImageChef.Commands
jsonSw.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.SaveChanges();