mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Add support for REV120.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user