REFACTOR: All refactor in DiscImageChef.Core.

This commit is contained in:
2017-12-21 23:00:30 +00:00
parent effdcb4e0e
commit 7f829422a8
37 changed files with 892 additions and 1143 deletions

View File

@@ -67,35 +67,35 @@ namespace DiscImageChef.Core
public static event UpdateProgressHandler UpdateProgressEvent;
public static event EndProgressHandler EndProgressEvent;
public static void InitProgress()
static void InitProgress()
{
if(InitProgressEvent != null) InitProgressEvent();
InitProgressEvent?.Invoke();
}
public static void UpdateProgress(string text, int current, int maximum)
static void UpdateProgress(string text, int current, int maximum)
{
if(UpdateProgressEvent != null)
UpdateProgressEvent(string.Format(text, current, maximum), current, maximum);
UpdateProgressEvent?.Invoke(string.Format(text, current, maximum), current, maximum);
}
public static void EndProgress()
static void EndProgress()
{
if(EndProgressEvent != null) EndProgressEvent();
EndProgressEvent?.Invoke();
}
public static BenchmarkResults Do(int bufferSize, int blockSize)
{
BenchmarkResults results = new BenchmarkResults();
results.Entries = new Dictionary<string, BenchmarkEntry>();
results.MinMemory = long.MaxValue;
results.MaxMemory = 0;
results.SeparateTime = 0;
BenchmarkResults results = new BenchmarkResults
{
Entries = new Dictionary<string, BenchmarkEntry>(),
MinMemory = long.MaxValue,
MaxMemory = 0,
SeparateTime = 0
};
MemoryStream ms = new MemoryStream(bufferSize);
Random rnd = new Random();
DateTime start;
DateTime end;
long mem;
object ctx;
start = DateTime.Now;
InitProgress();
@@ -136,7 +136,7 @@ namespace DiscImageChef.Core
results.ReadSpeed = bufferSize / 1048576.0 / (end - start).TotalSeconds;
#region Adler32
ctx = new Adler32Context();
object ctx = new Adler32Context();
((Adler32Context)ctx).Init();
ms.Seek(0, SeekOrigin.Begin);
mem = GC.GetTotalMemory(false);

View File

@@ -292,89 +292,67 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.All))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.adler32;
chk.Value = adler32Ctx.End();
chk = new ChecksumType {type = ChecksumTypeType.adler32, Value = adler32Ctx.End()};
chks.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Crc16))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.crc16;
chk.Value = crc16Ctx.End();
chk = new ChecksumType {type = ChecksumTypeType.crc16, Value = crc16Ctx.End()};
chks.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Crc32))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.crc32;
chk.Value = crc32Ctx.End();
chk = new ChecksumType {type = ChecksumTypeType.crc32, Value = crc32Ctx.End()};
chks.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Crc64))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.crc64;
chk.Value = crc64Ctx.End();
chk = new ChecksumType {type = ChecksumTypeType.crc64, Value = crc64Ctx.End()};
chks.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Md5))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.md5;
chk.Value = md5Ctx.End();
chk = new ChecksumType {type = ChecksumTypeType.md5, Value = md5Ctx.End()};
chks.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Ripemd160))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.ripemd160;
chk.Value = ripemd160Ctx.End();
chk = new ChecksumType {type = ChecksumTypeType.ripemd160, Value = ripemd160Ctx.End()};
chks.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Sha1))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.sha1;
chk.Value = sha1Ctx.End();
chk = new ChecksumType {type = ChecksumTypeType.sha1, Value = sha1Ctx.End()};
chks.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Sha256))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.sha256;
chk.Value = sha256Ctx.End();
chk = new ChecksumType {type = ChecksumTypeType.sha256, Value = sha256Ctx.End()};
chks.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Sha384))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.sha384;
chk.Value = sha384Ctx.End();
chk = new ChecksumType {type = ChecksumTypeType.sha384, Value = sha384Ctx.End()};
chks.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Sha512))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.sha512;
chk.Value = sha512Ctx.End();
chk = new ChecksumType {type = ChecksumTypeType.sha512, Value = sha512Ctx.End()};
chks.Add(chk);
}
if(!enabled.HasFlag(EnableChecksum.SpamSum)) return chks;
chk = new ChecksumType();
chk.type = ChecksumTypeType.spamsum;
chk.Value = ssctx.End();
chk = new ChecksumType {type = ChecksumTypeType.spamsum, Value = ssctx.End()};
chks.Add(chk);
return chks;
@@ -394,18 +372,6 @@ namespace DiscImageChef.Core
Sha512Context sha512CtxData = null;
SpamSumContext ssctxData = null;
AdlerPacket adlerPktData;
Crc16Packet crc16PktData;
Crc32Packet crc32PktData;
Crc64Packet crc64PktData;
Md5Packet md5PktData;
Ripemd160Packet ripemd160PktData;
Sha1Packet sha1PktData;
Sha256Packet sha256PktData;
Sha384Packet sha384PktData;
Sha512Packet sha512PktData;
SpamsumPacket spamsumPktData;
Thread adlerThreadData = new Thread(UpdateAdler);
Thread crc16ThreadData = new Thread(UpdateCrc16);
Thread crc32ThreadData = new Thread(UpdateCrc32);
@@ -421,7 +387,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
adler32CtxData = new Adler32Context();
adlerPktData = new AdlerPacket();
AdlerPacket adlerPktData = new AdlerPacket();
adler32CtxData.Init();
adlerPktData.Context = adler32CtxData;
adlerPktData.Data = data;
@@ -430,7 +396,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
crc16PktData = new Crc16Packet();
Crc16Packet crc16PktData = new Crc16Packet();
crc16CtxData = new Crc16Context();
crc16CtxData.Init();
crc16PktData.Context = crc16CtxData;
@@ -440,7 +406,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
crc32PktData = new Crc32Packet();
Crc32Packet crc32PktData = new Crc32Packet();
crc32CtxData = new Crc32Context();
crc32CtxData.Init();
crc32PktData.Context = crc32CtxData;
@@ -450,7 +416,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
crc64PktData = new Crc64Packet();
Crc64Packet crc64PktData = new Crc64Packet();
crc64CtxData = new Crc64Context();
crc64CtxData.Init();
crc64PktData.Context = crc64CtxData;
@@ -460,7 +426,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
md5PktData = new Md5Packet();
Md5Packet md5PktData = new Md5Packet();
md5CtxData = new Md5Context();
md5CtxData.Init();
md5PktData.Context = md5CtxData;
@@ -470,7 +436,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
ripemd160PktData = new Ripemd160Packet();
Ripemd160Packet ripemd160PktData = new Ripemd160Packet();
ripemd160CtxData = new Ripemd160Context();
ripemd160CtxData.Init();
ripemd160PktData.Context = ripemd160CtxData;
@@ -480,7 +446,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
sha1PktData = new Sha1Packet();
Sha1Packet sha1PktData = new Sha1Packet();
sha1CtxData = new Sha1Context();
sha1CtxData.Init();
sha1PktData.Context = sha1CtxData;
@@ -490,7 +456,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
sha256PktData = new Sha256Packet();
Sha256Packet sha256PktData = new Sha256Packet();
sha256CtxData = new Sha256Context();
sha256CtxData.Init();
sha256PktData.Context = sha256CtxData;
@@ -500,7 +466,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
sha384PktData = new Sha384Packet();
Sha384Packet sha384PktData = new Sha384Packet();
sha384CtxData = new Sha384Context();
sha384CtxData.Init();
sha384PktData.Context = sha384CtxData;
@@ -510,7 +476,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
sha512PktData = new Sha512Packet();
Sha512Packet sha512PktData = new Sha512Packet();
sha512CtxData = new Sha512Context();
sha512CtxData.Init();
sha512PktData.Context = sha512CtxData;
@@ -520,7 +486,7 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.SpamSum))
{
spamsumPktData = new SpamsumPacket();
SpamsumPacket spamsumPktData = new SpamsumPacket();
ssctxData = new SpamSumContext();
ssctxData.Init();
spamsumPktData.Context = ssctxData;
@@ -538,89 +504,67 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.Adler32))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.adler32;
chk.Value = adler32CtxData.End();
chk = new ChecksumType {type = ChecksumTypeType.adler32, Value = adler32CtxData.End()};
dataChecksums.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Crc16))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.crc16;
chk.Value = crc16CtxData.End();
chk = new ChecksumType {type = ChecksumTypeType.crc16, Value = crc16CtxData.End()};
dataChecksums.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Crc32))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.crc32;
chk.Value = crc32CtxData.End();
chk = new ChecksumType {type = ChecksumTypeType.crc32, Value = crc32CtxData.End()};
dataChecksums.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Crc64))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.crc64;
chk.Value = crc64CtxData.End();
chk = new ChecksumType {type = ChecksumTypeType.crc64, Value = crc64CtxData.End()};
dataChecksums.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Md5))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.md5;
chk.Value = md5CtxData.End();
chk = new ChecksumType {type = ChecksumTypeType.md5, Value = md5CtxData.End()};
dataChecksums.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Ripemd160))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.ripemd160;
chk.Value = ripemd160CtxData.End();
chk = new ChecksumType {type = ChecksumTypeType.ripemd160, Value = ripemd160CtxData.End()};
dataChecksums.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Sha1))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.sha1;
chk.Value = sha1CtxData.End();
chk = new ChecksumType {type = ChecksumTypeType.sha1, Value = sha1CtxData.End()};
dataChecksums.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Sha256))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.sha256;
chk.Value = sha256CtxData.End();
chk = new ChecksumType {type = ChecksumTypeType.sha256, Value = sha256CtxData.End()};
dataChecksums.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Sha384))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.sha384;
chk.Value = sha384CtxData.End();
chk = new ChecksumType {type = ChecksumTypeType.sha384, Value = sha384CtxData.End()};
dataChecksums.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Sha512))
{
chk = new ChecksumType();
chk.type = ChecksumTypeType.sha512;
chk.Value = sha512CtxData.End();
chk = new ChecksumType {type = ChecksumTypeType.sha512, Value = sha512CtxData.End()};
dataChecksums.Add(chk);
}
if(!enabled.HasFlag(EnableChecksum.SpamSum)) return dataChecksums;
chk = new ChecksumType();
chk.type = ChecksumTypeType.spamsum;
chk.Value = ssctxData.End();
chk = new ChecksumType {type = ChecksumTypeType.spamsum, Value = ssctxData.End()};
dataChecksums.Add(chk);
return dataChecksums;

View File

@@ -46,7 +46,7 @@ namespace DiscImageChef.Core
public void Close()
{
if(dataFs != null) dataFs.Close();
dataFs?.Close();
}
public int Read(byte[] array, int offset, int count)
@@ -92,7 +92,7 @@ namespace DiscImageChef.Core
public long Position
{
get { return dataFs.Position; }
get => dataFs.Position;
}
public static void WriteTo(string who, string outputPrefix, string outputSuffix, string what, byte[] data)

View File

@@ -59,8 +59,6 @@ namespace DiscImageChef.Core.Devices.Dumping
ref DumpLog dumpLog, Encoding encoding)
{
bool aborted;
MhddLog mhddLog;
IbgLog ibgLog;
if(dumpRaw)
{
@@ -75,12 +73,11 @@ namespace DiscImageChef.Core.Devices.Dumping
}
bool sense;
ushort currentProfile = 0x0001;
uint timeout = 5;
double duration;
const ushort ATA_PROFILE = 0x0001;
const uint TIMEOUT = 5;
dumpLog.WriteLine("Requesting ATA IDENTIFY DEVICE.");
sense = dev.AtaIdentify(out byte[] cmdBuf, out AtaErrorRegistersCHS errorChs);
sense = dev.AtaIdentify(out byte[] cmdBuf, out _);
if(!sense && Identify.Decode(cmdBuf).HasValue)
{
Identify.IdentifyDevice? ataIdNullable = Identify.Decode(cmdBuf);
@@ -170,7 +167,6 @@ namespace DiscImageChef.Core.Devices.Dumping
double currentSpeed = 0;
double maxSpeed = double.MinValue;
double minSpeed = double.MaxValue;
Checksum dataChk;
aborted = false;
System.Console.CancelKeyPress += (sender, e) => e.Cancel = aborted = true;
@@ -179,7 +175,7 @@ namespace DiscImageChef.Core.Devices.Dumping
// Initializate reader
dumpLog.WriteLine("Initializing reader.");
Reader ataReader = new Reader(dev, timeout, cmdBuf);
Reader ataReader = new Reader(dev, TIMEOUT, cmdBuf);
// Fill reader blocks
ulong blocks = ataReader.GetDeviceBlocks();
// Check block sizes
@@ -218,7 +214,7 @@ namespace DiscImageChef.Core.Devices.Dumping
dumpLog.WriteLine("Device reports {0} bytes per logical block.", blockSize);
dumpLog.WriteLine("Device reports {0} bytes per physical block.", physicalsectorsize);
bool removable = false || !dev.IsCompactFlash &&
bool removable = !dev.IsCompactFlash &&
ataId.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit
.Removable);
DumpHardwareType currentTry = null;
@@ -228,12 +224,15 @@ namespace DiscImageChef.Core.Devices.Dumping
if(currentTry == null || extents == null)
throw new Exception("Could not process resume file, not continuing...");
MhddLog mhddLog;
IbgLog ibgLog;
double duration;
if(ataReader.IsLba)
{
DicConsole.WriteLine("Reading {0} sectors at a time.", blocksToRead);
mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead);
ibgLog = new IbgLog(outputPrefix + ".ibg", currentProfile);
ibgLog = new IbgLog(outputPrefix + ".ibg", ATA_PROFILE);
dumpFile = new DataFile(outputPrefix + ".bin");
if(resume.NextBlock > 0) dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock);
@@ -271,8 +270,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
for(ulong b = i; b < i + blocksToRead; b++) resume.BadBlocks.Add(b);
if(duration < 500) mhddLog.Write(i, 65535);
else mhddLog.Write(i, duration);
mhddLog.Write(i, duration < 500 ? 65535 : duration);
ibgLog.Write(i, 0);
dumpFile.Write(new byte[blockSize * blocksToRead]);
@@ -348,7 +346,7 @@ namespace DiscImageChef.Core.Devices.Dumping
else
{
mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead);
ibgLog = new IbgLog(outputPrefix + ".ibg", currentProfile);
ibgLog = new IbgLog(outputPrefix + ".ibg", ATA_PROFILE);
dumpFile = new DataFile(outputPrefix + ".bin");
ulong currentBlock = 0;
@@ -390,8 +388,7 @@ namespace DiscImageChef.Core.Devices.Dumping
else
{
resume.BadBlocks.Add(currentBlock);
if(duration < 500) mhddLog.Write(currentBlock, 65535);
else mhddLog.Write(currentBlock, duration);
mhddLog.Write(currentBlock, duration < 500 ? 65535 : duration);
ibgLog.Write(currentBlock, 0);
dumpFile.Write(new byte[blockSize]);
@@ -416,7 +413,7 @@ namespace DiscImageChef.Core.Devices.Dumping
(double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000));
}
dataChk = new Checksum();
Checksum dataChk = new Checksum();
dumpFile.Seek(0, SeekOrigin.Begin);
blocksToRead = 500;
@@ -454,7 +451,6 @@ namespace DiscImageChef.Core.Devices.Dumping
PluginBase plugins = new PluginBase();
plugins.RegisterAllPlugins(encoding);
ImagePlugin imageFormat;
FiltersList filtersList = new FiltersList();
Filter inputFilter = filtersList.GetFilter(outputPrefix + ".bin");
@@ -465,7 +461,7 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
imageFormat = ImageFormat.Detect(inputFilter);
ImagePlugin imageFormat = ImageFormat.Detect(inputFilter);
PartitionType[] xmlFileSysInfo = null;
try { if(!imageFormat.OpenImage(inputFilter)) imageFormat = null; }
@@ -503,7 +499,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
if(!plugin.Identify(imageFormat, partitions[i])) continue;
plugin.GetInformation(imageFormat, partitions[i], out string foo);
plugin.GetInformation(imageFormat, partitions[i], out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
dumpLog.WriteLine("Filesystem {0} found.", plugin.XmlFSType.Type);
@@ -538,7 +534,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
if(!plugin.Identify(imageFormat, wholePart)) continue;
plugin.GetInformation(imageFormat, wholePart, out string foo);
plugin.GetInformation(imageFormat, wholePart, out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
dumpLog.WriteLine("Filesystem {0} found.", plugin.XmlFSType.Type);

View File

@@ -59,14 +59,11 @@ namespace DiscImageChef.Core.Devices.Dumping
ref MediaType dskType, bool separateSubchannel, ref Resume resume,
ref DumpLog dumpLog, Alcohol120 alcohol, bool dumpLeadIn)
{
MhddLog mhddLog;
IbgLog ibgLog;
bool sense = false;
ulong blocks;
// TODO: Check subchannel support
uint blockSize;
uint subSize;
byte[] tmpBuf;
FullTOC.CDFullTOC? toc = null;
DateTime start;
DateTime end;
@@ -77,9 +74,7 @@ namespace DiscImageChef.Core.Devices.Dumping
double minSpeed = double.MaxValue;
Checksum dataChk;
bool readcd;
byte[] readBuffer;
uint blocksToRead = 64;
ulong errored = 0;
DataFile dumpFile;
bool aborted = false;
System.Console.CancelKeyPress += (sender, e) => e.Cancel = aborted = true;
@@ -87,13 +82,13 @@ namespace DiscImageChef.Core.Devices.Dumping
// We discarded all discs that falsify a TOC before requesting a real TOC
// No TOC, no CD (or an empty one)
dumpLog.WriteLine("Reading full TOC");
bool tocSense = dev.ReadRawToc(out byte[] cmdBuf, out byte[] senseBuf, 1, dev.Timeout, out double duration);
bool tocSense = dev.ReadRawToc(out byte[] cmdBuf, out byte[] senseBuf, 1, dev.Timeout, out _);
if(!tocSense)
{
toc = FullTOC.Decode(cmdBuf);
if(toc.HasValue)
{
tmpBuf = new byte[cmdBuf.Length - 2];
byte[] tmpBuf = new byte[cmdBuf.Length - 2];
Array.Copy(cmdBuf, 2, tmpBuf, 0, cmdBuf.Length - 2);
sidecar.OpticalDisc[0].TOC = new DumpType
{
@@ -105,7 +100,7 @@ namespace DiscImageChef.Core.Devices.Dumping
// ATIP exists on blank CDs
dumpLog.WriteLine("Reading ATIP");
sense = dev.ReadAtip(out cmdBuf, out senseBuf, dev.Timeout, out duration);
sense = dev.ReadAtip(out cmdBuf, out senseBuf, dev.Timeout, out _);
if(!sense)
{
ATIP.CDATIP? atip = ATIP.Decode(cmdBuf);
@@ -129,7 +124,7 @@ namespace DiscImageChef.Core.Devices.Dumping
dumpLog.WriteLine("Reading Disc Information");
sense = dev.ReadDiscInformation(out cmdBuf, out senseBuf,
MmcDiscInformationDataTypes.DiscInformation, dev.Timeout,
out duration);
out _);
if(!sense)
{
DiscInformation.StandardDiscInformation? discInfo =
@@ -151,7 +146,7 @@ namespace DiscImageChef.Core.Devices.Dumping
int firstTrackLastSession = 0;
dumpLog.WriteLine("Reading Session Information");
sense = dev.ReadSessionInfo(out cmdBuf, out senseBuf, dev.Timeout, out duration);
sense = dev.ReadSessionInfo(out cmdBuf, out senseBuf, dev.Timeout, out _);
if(!sense)
{
Session.CDSessionInfo? session = Session.Decode(cmdBuf);
@@ -194,7 +189,7 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Reading PMA");
sense = dev.ReadPma(out cmdBuf, out senseBuf, dev.Timeout, out duration);
sense = dev.ReadPma(out cmdBuf, out senseBuf, dev.Timeout, out _);
if(!sense)
if(PMA.Decode(cmdBuf).HasValue)
{
@@ -210,7 +205,7 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Reading CD-Text from Lead-In");
sense = dev.ReadCdText(out cmdBuf, out senseBuf, dev.Timeout, out duration);
sense = dev.ReadCdText(out cmdBuf, out senseBuf, dev.Timeout, out _);
if(!sense)
if(CDTextOnLeadIn.Decode(cmdBuf).HasValue)
{
@@ -319,8 +314,7 @@ namespace DiscImageChef.Core.Devices.Dumping
phour = trk.PHOUR;
}
if(phour > 0) lastMsf = string.Format("{3:D2}:{0:D2}:{1:D2}:{2:D2}", pmin, psec, pframe, phour);
else lastMsf = $"{pmin:D2}:{psec:D2}:{pframe:D2}";
lastMsf = phour > 0 ? $"{phour:D2}:{pmin:D2}:{psec:D2}:{pframe:D2}" : $"{pmin:D2}:{psec:D2}:{pframe:D2}";
lastSector = phour * 3600 * 75 + pmin * 60 * 75 + psec * 75 + pframe - 150;
}
@@ -347,9 +341,7 @@ namespace DiscImageChef.Core.Devices.Dumping
pframe -= psec * 75;
}
if(phour > 0)
tracks[t - 1].EndMSF = string.Format("{3:D2}:{0:D2}:{1:D2}:{2:D2}", pmin, psec, pframe, phour);
else tracks[t - 1].EndMSF = $"{pmin:D2}:{psec:D2}:{pframe:D2}";
tracks[t - 1].EndMSF = phour > 0 ? $"{phour:D2}:{pmin:D2}:{psec:D2}:{pframe:D2}" : $"{pmin:D2}:{psec:D2}:{pframe:D2}";
}
tracks[tracks.Length - 1].EndMSF = lastMsf;
@@ -364,9 +356,9 @@ namespace DiscImageChef.Core.Devices.Dumping
if(dumpRaw) throw new NotImplementedException("Raw CD dumping not yet implemented");
// TODO: Check subchannel capabilities
readcd = !dev.ReadCd(out readBuffer, out senseBuf, 0, blockSize, 1, MmcSectorTypes.AllTypes, false,
readcd = !dev.ReadCd(out byte[] readBuffer, out senseBuf, 0, blockSize, 1, MmcSectorTypes.AllTypes, false,
false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
MmcSubchannel.Raw, dev.Timeout, out duration);
MmcSubchannel.Raw, dev.Timeout, out _);
if(readcd) DicConsole.WriteLine("Using MMC READ CD command.");
@@ -463,7 +455,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
sense = dev.ReadCd(out readBuffer, out senseBuf, 0, blockSize, blocksToRead,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true,
true, MmcErrorField.None, MmcSubchannel.Raw, dev.Timeout, out duration);
true, MmcErrorField.None, MmcSubchannel.Raw, dev.Timeout, out _);
if(dev.Error || sense) blocksToRead /= 2;
}
@@ -490,8 +482,8 @@ namespace DiscImageChef.Core.Devices.Dumping
alcohol.SetExtension(".bin");
DataFile subFile = null;
if(separateSubchannel) subFile = new DataFile(outputPrefix + ".sub");
mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead);
ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0008);
MhddLog mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead);
IbgLog ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0008);
dumpFile.Seek(resume.NextBlock, (ulong)sectorSize);
if(separateSubchannel) subFile.Seek(resume.NextBlock, subSize);
@@ -499,7 +491,7 @@ namespace DiscImageChef.Core.Devices.Dumping
if(resume.NextBlock > 0) dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock);
start = DateTime.UtcNow;
for(int t = 0; t < tracks.Count(); t++)
for(int t = 0; t < tracks.Length; t++)
{
dumpLog.WriteLine("Reading track {0}", t);
@@ -589,13 +581,11 @@ namespace DiscImageChef.Core.Devices.Dumping
}
else dumpFile.Write(new byte[blockSize * blocksToRead]);
errored += blocksToRead;
for(ulong b = i; b < i + blocksToRead; b++) resume.BadBlocks.Add(b);
DicConsole.DebugWriteLine("Dump-Media", "READ error:\n{0}",
Sense.PrettifySense(senseBuf));
if(cmdDuration < 500) mhddLog.Write(i, 65535);
else mhddLog.Write(i, cmdDuration);
mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration);
ibgLog.Write(i, 0);
dumpLog.WriteLine("Error reading {0} sectors from sector {1}.", blocksToRead, i);
@@ -691,8 +681,6 @@ namespace DiscImageChef.Core.Devices.Dumping
break;
}
double cmdDuration;
DicConsole.Write("\rRetrying sector {0}, pass {1}, {3}{2}", badSector, pass + 1,
forward ? "forward" : "reverse",
runningPersistent ? "recovering partial data, " : "");
@@ -701,7 +689,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
sense = dev.ReadCd(out readBuffer, out senseBuf, (uint)badSector, blockSize, blocksToRead,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true,
true, MmcErrorField.None, MmcSubchannel.Raw, dev.Timeout, out cmdDuration);
true, MmcErrorField.None, MmcSubchannel.Raw, dev.Timeout, out double cmdDuration);
totalDuration += cmdDuration;
}
@@ -731,25 +719,12 @@ namespace DiscImageChef.Core.Devices.Dumping
goto cdRepeatRetry;
}
Modes.DecodedMode? currentMode = null;
Modes.ModePage? currentModePage = null;
byte[] md6;
byte[] md10;
if(!runningPersistent && persistent)
{
sense = dev.ModeSense6(out readBuffer, out senseBuf, false, ScsiModeSensePageControl.Current, 0x01,
dev.Timeout, out duration);
if(sense)
{
sense = dev.ModeSense10(out readBuffer, out senseBuf, false, ScsiModeSensePageControl.Current,
0x01, dev.Timeout, out duration);
if(!sense) currentMode = Modes.DecodeMode10(readBuffer, dev.ScsiType);
}
else currentMode = Modes.DecodeMode6(readBuffer, dev.ScsiType);
if(currentMode.HasValue) currentModePage = currentMode.Value.Pages[0];
Modes.ModePage_01_MMC pgMmc =
new Modes.ModePage_01_MMC {PS = false, ReadRetryCount = 255, Parameter = 0x20};
Modes.DecodedMode md = new Modes.DecodedMode
@@ -769,8 +744,8 @@ namespace DiscImageChef.Core.Devices.Dumping
md10 = Modes.EncodeMode10(md, dev.ScsiType);
dumpLog.WriteLine("Sending MODE SELECT to drive.");
sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out duration);
if(sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out duration);
sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _);
if(sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _);
runningPersistent = true;
if(!sense && !dev.Error)
@@ -790,8 +765,8 @@ namespace DiscImageChef.Core.Devices.Dumping
md10 = Modes.EncodeMode10(md, dev.ScsiType);
dumpLog.WriteLine("Sending MODE SELECT to drive.");
sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out duration);
if(sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out duration);
sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _);
if(sense) dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _);
}
DicConsole.WriteLine();
@@ -807,7 +782,7 @@ namespace DiscImageChef.Core.Devices.Dumping
blocksToRead = 500;
dumpLog.WriteLine("Checksum starts.");
for(int t = 0; t < tracks.Count(); t++)
for(int t = 0; t < tracks.Length; t++)
{
Checksum trkChk = new Checksum();
Checksum subChk = new Checksum();
@@ -857,8 +832,7 @@ namespace DiscImageChef.Core.Devices.Dumping
}
tracks[t].Checksums = trkChk.End().ToArray();
if(separateSubchannel) tracks[t].SubChannel.Checksums = subChk.End().ToArray();
else tracks[t].SubChannel.Checksums = tracks[t].Checksums;
tracks[t].SubChannel.Checksums = separateSubchannel ? subChk.End().ToArray() : tracks[t].Checksums;
}
DicConsole.WriteLine();
@@ -877,7 +851,7 @@ namespace DiscImageChef.Core.Devices.Dumping
Value = outputPrefix + ".bin"
};
sidecar.OpticalDisc[0].Sessions = toc.Value.LastCompleteSession;
sidecar.OpticalDisc[0].Tracks = new[] {tracks.Count()};
sidecar.OpticalDisc[0].Tracks = new[] {tracks.Length};
sidecar.OpticalDisc[0].Track = tracks;
sidecar.OpticalDisc[0].Dimensions = Dimensions.DimensionsFromMediaType(dskType);
Metadata.MediaType.MediaTypeToString(dskType, out string xmlDskTyp, out string xmlDskSubTyp);

View File

@@ -55,11 +55,8 @@ namespace DiscImageChef.Core.Devices.Dumping
ref MediaType dskType, bool separateSubchannel, ref Resume resume,
ref DumpLog dumpLog, bool dumpLeadIn, Encoding encoding)
{
byte[] cmdBuf;
byte[] senseBuf;
bool sense;
double duration;
ulong blocks = 0;
ulong blocks;
byte[] tmpBuf;
bool compactDisc = true;
bool isXbox = false;
@@ -70,8 +67,8 @@ namespace DiscImageChef.Core.Devices.Dumping
// TODO: Log not only what is it reading, but if it was read correctly or not.
sense = dev.GetConfiguration(out cmdBuf, out senseBuf, 0, MmcGetConfigurationRt.Current, dev.Timeout,
out duration);
sense = dev.GetConfiguration(out byte[] cmdBuf, out _, 0, MmcGetConfigurationRt.Current, dev.Timeout,
out _);
if(!sense)
{
Features.SeparatedFeatures ftr = Features.Separate(cmdBuf);
@@ -188,8 +185,8 @@ namespace DiscImageChef.Core.Devices.Dumping
switch(dskType) {
case MediaType.Unknown when blocks > 0:
dumpLog.WriteLine("Reading Physical Format Information");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _);
if(!sense)
{
PFI.PhysicalFormatInformation? nintendoPfi = PFI.Decode(cmdBuf);
@@ -222,8 +219,8 @@ namespace DiscImageChef.Core.Devices.Dumping
case MediaType.HDDVDRW:
case MediaType.HDDVDRWDL:
dumpLog.WriteLine("Reading Physical Format Information");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _);
if(!sense)
{
alcohol.AddPfi(cmdBuf);
@@ -259,8 +256,7 @@ namespace DiscImageChef.Core.Devices.Dumping
dskType = MediaType.DVDPRWDL;
break;
case DiskCategory.DVDR:
if(decPfi.PartVersion == 6) dskType = MediaType.DVDRDL;
else dskType = MediaType.DVDR;
dskType = decPfi.PartVersion == 6 ? MediaType.DVDRDL : MediaType.DVDR;
break;
case DiskCategory.DVDRAM:
dskType = MediaType.DVDRAM;
@@ -269,8 +265,7 @@ namespace DiscImageChef.Core.Devices.Dumping
dskType = MediaType.DVDROM;
break;
case DiskCategory.DVDRW:
if(decPfi.PartVersion == 3) dskType = MediaType.DVDRWDL;
else dskType = MediaType.DVDRW;
dskType = decPfi.PartVersion == 3 ? MediaType.DVDRWDL : MediaType.DVDRW;
break;
case DiskCategory.HDDVDR:
dskType = MediaType.HDDVDR;
@@ -285,8 +280,7 @@ namespace DiscImageChef.Core.Devices.Dumping
dskType = MediaType.HDDVDRW;
break;
case DiskCategory.Nintendo:
if(decPfi.DiscSize == DVDSize.Eighty) dskType = MediaType.GOD;
else dskType = MediaType.WOD;
dskType = decPfi.DiscSize == DVDSize.Eighty ? MediaType.GOD : MediaType.WOD;
break;
case DiskCategory.UMD:
dskType = MediaType.UMD;
@@ -296,9 +290,9 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Reading Disc Manufacturing Information");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DiscManufacturingInformation, 0, dev.Timeout,
out duration);
out _);
if(!sense)
{
if(DMI.IsXbox(cmdBuf) || DMI.IsXbox360(cmdBuf))
@@ -315,7 +309,7 @@ namespace DiscImageChef.Core.Devices.Dumping
dskType = MediaType.XGD3;
}
sense = dev.ScsiInquiry(out byte[] inqBuf, out senseBuf);
sense = dev.ScsiInquiry(out byte[] inqBuf, out _);
if(sense || !Inquiry.Decode(inqBuf).HasValue ||
Inquiry.Decode(inqBuf).HasValue &&
@@ -364,9 +358,9 @@ namespace DiscImageChef.Core.Devices.Dumping
if(dskType == MediaType.DVDDownload || dskType == MediaType.DVDROM)
{
dumpLog.WriteLine("Reading Lead-in Copyright Information.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.CopyrightInformation, 0, dev.Timeout,
out duration);
out _);
if(!sense)
if(CSS_CPRM.DecodeLeadInCopyright(cmdBuf).HasValue)
{
@@ -394,8 +388,8 @@ namespace DiscImageChef.Core.Devices.Dumping
case MediaType.DVDROM:
case MediaType.HDDVDROM:
dumpLog.WriteLine("Reading Burst Cutting Area.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.BurstCuttingArea, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.BurstCuttingArea, 0, dev.Timeout, out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];
@@ -415,8 +409,8 @@ namespace DiscImageChef.Core.Devices.Dumping
case MediaType.DVDRAM:
case MediaType.HDDVDRAM:
dumpLog.WriteLine("Reading Disc Description Structure.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdramDds, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdramDds, 0, dev.Timeout, out _);
if(!sense)
if(DDS.Decode(cmdBuf).HasValue)
{
@@ -432,9 +426,9 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Reading Spare Area Information.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdramSpareAreaInformation, 0, dev.Timeout,
out duration);
out _);
if(!sense)
if(Spare.Decode(cmdBuf).HasValue)
{
@@ -454,8 +448,8 @@ namespace DiscImageChef.Core.Devices.Dumping
case MediaType.DVDR:
case MediaType.DVDRW:
dumpLog.WriteLine("Reading Pre-Recorded Information.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PreRecordedInfo, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PreRecordedInfo, 0, dev.Timeout, out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];
@@ -478,9 +472,9 @@ namespace DiscImageChef.Core.Devices.Dumping
case MediaType.DVDRW:
case MediaType.HDDVDR:
dumpLog.WriteLine("Reading Media Identifier.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdrMediaIdentifier, 0, dev.Timeout,
out duration);
out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];
@@ -495,9 +489,9 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Reading Recordable Physical Information.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdrPhysicalInformation, 0, dev.Timeout,
out duration);
out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];
@@ -518,8 +512,8 @@ namespace DiscImageChef.Core.Devices.Dumping
case MediaType.DVDPRW:
case MediaType.DVDPRWDL:
dumpLog.WriteLine("Reading ADdress In Pregroove.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.Adip, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.Adip, 0, dev.Timeout, out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];
@@ -534,8 +528,8 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Reading Disc Control Blocks.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.Dcb, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.Dcb, 0, dev.Timeout, out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];
@@ -553,9 +547,9 @@ namespace DiscImageChef.Core.Devices.Dumping
#region HD DVD-ROM
case MediaType.HDDVDROM:
dumpLog.WriteLine("Reading Lead-in Copyright Information.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.HddvdCopyrightInformation, 0, dev.Timeout,
out duration);
out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];
@@ -577,8 +571,8 @@ namespace DiscImageChef.Core.Devices.Dumping
case MediaType.BDRXL:
case MediaType.BDREXL:
dumpLog.WriteLine("Reading Disc Information.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.DiscInformation, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.DiscInformation, 0, dev.Timeout, out _);
if(!sense)
if(DI.Decode(cmdBuf).HasValue)
{
@@ -594,8 +588,8 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Reading PAC.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.Pac, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.Pac, 0, dev.Timeout, out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];
@@ -616,8 +610,8 @@ namespace DiscImageChef.Core.Devices.Dumping
#region BD-ROM only
case MediaType.BDROM:
dumpLog.WriteLine("Reading Burst Cutting Area.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdBurstCuttingArea, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdBurstCuttingArea, 0, dev.Timeout, out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];
@@ -639,8 +633,8 @@ namespace DiscImageChef.Core.Devices.Dumping
case MediaType.BDRXL:
case MediaType.BDREXL:
dumpLog.WriteLine("Reading Disc Definition Structure.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdDds, 0, dev.Timeout, out duration);
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdDds, 0, dev.Timeout, out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];
@@ -655,9 +649,9 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Reading Spare Area Information.");
sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.Bd, 0, 0,
sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdSpareAreaInformation, 0, dev.Timeout,
out duration);
out _);
if(!sense)
{
tmpBuf = new byte[cmdBuf.Length - 4];

View File

@@ -60,12 +60,7 @@ namespace DiscImageChef.Core.Devices.Dumping
ref MediaType dskType, bool opticalDisc, ref Resume resume,
ref DumpLog dumpLog, Encoding encoding, Alcohol120 alcohol = null)
{
MhddLog mhddLog;
IbgLog ibgLog;
byte[] cmdBuf;
byte[] senseBuf;
bool sense;
double duration;
ulong blocks;
uint blockSize;
uint logicalBlockSize;
@@ -73,7 +68,7 @@ namespace DiscImageChef.Core.Devices.Dumping
byte scsiMediumType = 0;
byte scsiDensityCode = 0;
bool containsFloppyPage = false;
ushort currentProfile = 0x0001;
const ushort SBC_PROFILE = 0x0001;
DateTime start;
DateTime end;
double totalDuration = 0;
@@ -81,11 +76,8 @@ namespace DiscImageChef.Core.Devices.Dumping
double currentSpeed = 0;
double maxSpeed = double.MinValue;
double minSpeed = double.MaxValue;
Checksum dataChk;
byte[] readBuffer;
uint blocksToRead = 64;
ulong errored = 0;
DataFile dumpFile;
uint blocksToRead;
bool aborted = false;
System.Console.CancelKeyPress += (sender, e) => e.Cancel = aborted = true;
@@ -125,25 +117,6 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
if(dskType == MediaType.Unknown)
dskType = MediaTypeFromScsi.Get((byte)dev.ScsiType, dev.Manufacturer, dev.Model, scsiMediumType,
scsiDensityCode, blocks, blockSize);
// TODO: Solve floppy page resolve
if(dskType == MediaType.Unknown && dev.IsUsb && containsFloppyPage) dskType = MediaType.FlashDrive;
DicConsole.WriteLine("Media identified as {0}", dskType);
dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * blockSize);
dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead);
dumpLog.WriteLine("Device reports {0} bytes per logical block.", blockSize);
dumpLog.WriteLine("Device reports {0} bytes per physical block.", scsiReader.LongBlockSize);
dumpLog.WriteLine("SCSI device type: {0}.", dev.ScsiType);
dumpLog.WriteLine("SCSI medium type: {0}.", scsiMediumType);
dumpLog.WriteLine("SCSI density type: {0}.", scsiDensityCode);
dumpLog.WriteLine("SCSI floppy mode page present: {0}.", containsFloppyPage);
dumpLog.WriteLine("Media identified as {0}.", dskType);
if(!opticalDisc)
{
sidecar.BlockMedia = new BlockMediaType[1];
@@ -169,10 +142,11 @@ namespace DiscImageChef.Core.Devices.Dumping
DataFile.WriteTo("SCSI Dump", sidecar.BlockMedia[0].USB.Descriptors.Image, dev.UsbDescriptors);
}
byte[] cmdBuf;
if(dev.Type == DeviceType.ATAPI)
{
dumpLog.WriteLine("Requesting ATAPI IDENTIFY PACKET DEVICE.");
sense = dev.AtapiIdentify(out cmdBuf, out AtaErrorRegistersCHS errorRegs);
sense = dev.AtapiIdentify(out cmdBuf, out _);
if(!sense)
{
sidecar.BlockMedia[0].ATA = new ATAType
@@ -188,7 +162,7 @@ namespace DiscImageChef.Core.Devices.Dumping
}
}
sense = dev.ScsiInquiry(out cmdBuf, out senseBuf);
sense = dev.ScsiInquiry(out cmdBuf, out _);
if(!sense)
{
dumpLog.WriteLine("Requesting SCSI INQUIRY.");
@@ -204,7 +178,7 @@ namespace DiscImageChef.Core.Devices.Dumping
DataFile.WriteTo("SCSI Dump", sidecar.BlockMedia[0].SCSI.Inquiry.Image, cmdBuf);
dumpLog.WriteLine("Reading SCSI Extended Vendor Page Descriptors.");
sense = dev.ScsiInquiry(out cmdBuf, out senseBuf, 0x00);
sense = dev.ScsiInquiry(out cmdBuf, out _, 0x00);
if(!sense)
{
byte[] pages = EVPD.DecodePage00(cmdBuf);
@@ -215,7 +189,7 @@ namespace DiscImageChef.Core.Devices.Dumping
foreach(byte page in pages)
{
dumpLog.WriteLine("Requesting page {0:X2}h.", page);
sense = dev.ScsiInquiry(out cmdBuf, out senseBuf, page);
sense = dev.ScsiInquiry(out cmdBuf, out _, page);
if(sense) continue;
EVPDType evpd = new EVPDType
@@ -234,11 +208,11 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Requesting MODE SENSE (10).");
sense = dev.ModeSense10(out cmdBuf, out senseBuf, false, true, ScsiModeSensePageControl.Current,
0x3F, 0xFF, 5, out duration);
sense = dev.ModeSense10(out cmdBuf, out _, false, true, ScsiModeSensePageControl.Current,
0x3F, 0xFF, 5, out _);
if(!sense || dev.Error)
sense = dev.ModeSense10(out cmdBuf, out senseBuf, false, true,
ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, out duration);
sense = dev.ModeSense10(out cmdBuf, out _, false, true,
ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, out _);
Modes.DecodedMode? decMode = null;
@@ -256,12 +230,12 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Requesting MODE SENSE (6).");
sense = dev.ModeSense6(out cmdBuf, out senseBuf, false, ScsiModeSensePageControl.Current, 0x3F,
0x00, 5, out duration);
sense = dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F,
0x00, 5, out _);
if(sense || dev.Error)
sense = dev.ModeSense6(out cmdBuf, out senseBuf, false, ScsiModeSensePageControl.Current,
0x3F, 0x00, 5, out duration);
if(sense || dev.Error) sense = dev.ModeSense(out cmdBuf, out senseBuf, 5, out duration);
sense = dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current,
0x3F, 0x00, 5, out _);
if(sense || dev.Error) sense = dev.ModeSense(out cmdBuf, out _, 5, out _);
if(!sense && !dev.Error)
if(Modes.DecodeMode6(cmdBuf, dev.ScsiType).HasValue)
@@ -289,15 +263,33 @@ namespace DiscImageChef.Core.Devices.Dumping
}
}
if(dskType == MediaType.Unknown)
dskType = MediaTypeFromScsi.Get((byte)dev.ScsiType, dev.Manufacturer, dev.Model, scsiMediumType,
scsiDensityCode, blocks, blockSize);
dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * blockSize);
dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead);
dumpLog.WriteLine("Device reports {0} bytes per logical block.", blockSize);
dumpLog.WriteLine("Device reports {0} bytes per physical block.", scsiReader.LongBlockSize);
dumpLog.WriteLine("SCSI device type: {0}.", dev.ScsiType);
dumpLog.WriteLine("SCSI medium type: {0}.", scsiMediumType);
dumpLog.WriteLine("SCSI density type: {0}.", scsiDensityCode);
if(dskType == MediaType.Unknown && dev.IsUsb && containsFloppyPage) dskType = MediaType.FlashDrive;
DicConsole.WriteLine("Media identified as {0}", dskType);
dumpLog.WriteLine("SCSI floppy mode page present: {0}.", containsFloppyPage);
dumpLog.WriteLine("Media identified as {0}.", dskType);
uint longBlockSize = scsiReader.LongBlockSize;
if(dumpRaw)
if(blockSize == longBlockSize)
{
if(!scsiReader.CanReadRaw) DicConsole.ErrorWriteLine("Device doesn't seem capable of reading raw data from media.");
else
DicConsole
.ErrorWriteLine("Device is capable of reading raw data but I've been unable to guess correct sector size.");
DicConsole.ErrorWriteLine(!scsiReader.CanReadRaw
? "Device doesn't seem capable of reading raw data from media."
: "Device is capable of reading raw data but I've been unable to guess correct sector size.");
if(!force)
{
@@ -312,10 +304,8 @@ namespace DiscImageChef.Core.Devices.Dumping
}
else
{
if(longBlockSize == 37856
) // Only a block will be read, but it contains 16 sectors and command expect sector number not block number
blocksToRead = 16;
else blocksToRead = 1;
// Only a block will be read, but it contains 16 sectors and command expect sector number not block number
blocksToRead = (uint)(longBlockSize == 37856 ? 16 : 1);
DicConsole.WriteLine("Reading {0} raw bytes ({1} cooked bytes) per sector.", longBlockSize,
blockSize * blocksToRead);
physicalBlockSize = longBlockSize;
@@ -326,9 +316,9 @@ namespace DiscImageChef.Core.Devices.Dumping
string outputExtension = ".bin";
if(opticalDisc && blockSize == 2048) outputExtension = ".iso";
mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead);
ibgLog = new IbgLog(outputPrefix + ".ibg", currentProfile);
dumpFile = new DataFile(outputPrefix + outputExtension);
MhddLog mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead);
IbgLog ibgLog = new IbgLog(outputPrefix + ".ibg", SBC_PROFILE);
DataFile dumpFile = new DataFile(outputPrefix + outputExtension);
start = DateTime.UtcNow;
@@ -387,11 +377,9 @@ namespace DiscImageChef.Core.Devices.Dumping
// Write empty data
dumpFile.Write(new byte[blockSize * blocksToRead]);
errored += blocksToRead;
for(ulong b = i; b < i + blocksToRead; b++) resume.BadBlocks.Add(b);
if(cmdDuration < 500) mhddLog.Write(i, 65535);
else mhddLog.Write(i, cmdDuration);
mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration);
ibgLog.Write(i, 0);
dumpLog.WriteLine("Error reading {0} blocks from block {1}.", blocksToRead, i);
@@ -454,25 +442,12 @@ namespace DiscImageChef.Core.Devices.Dumping
goto repeatRetry;
}
Modes.DecodedMode? currentMode = null;
Modes.ModePage? currentModePage = null;
byte[] md6;
byte[] md10;
if(!runningPersistent && persistent)
{
sense = dev.ModeSense6(out readBuffer, out senseBuf, false, ScsiModeSensePageControl.Current, 0x01,
dev.Timeout, out duration);
if(sense)
{
sense = dev.ModeSense10(out readBuffer, out senseBuf, false, ScsiModeSensePageControl.Current,
0x01, dev.Timeout, out duration);
if(!sense) currentMode = Modes.DecodeMode10(readBuffer, dev.ScsiType);
}
else currentMode = Modes.DecodeMode6(readBuffer, dev.ScsiType);
if(currentMode.HasValue) currentModePage = currentMode.Value.Pages[0];
if(dev.ScsiType == PeripheralDeviceTypes.MultiMediaDevice)
{
Modes.ModePage_01_MMC pgMmc =
@@ -531,8 +506,8 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Sending MODE SELECT to drive.");
sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out duration);
if(sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out duration);
sense = dev.ModeSelect(md6, out _, true, false, dev.Timeout, out _);
if(sense) sense = dev.ModeSelect10(md10, out _, true, false, dev.Timeout, out _);
runningPersistent = true;
if(!sense && !dev.Error)
@@ -552,8 +527,8 @@ namespace DiscImageChef.Core.Devices.Dumping
md10 = Modes.EncodeMode10(md, dev.ScsiType);
dumpLog.WriteLine("Sending MODE SELECT to drive.");
sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out duration);
if(sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out duration);
sense = dev.ModeSelect(md6, out _, true, false, dev.Timeout, out _);
if(sense) dev.ModeSelect10(md10, out _, true, false, dev.Timeout, out _);
}
DicConsole.WriteLine();
@@ -563,7 +538,7 @@ namespace DiscImageChef.Core.Devices.Dumping
resume.BadBlocks.Sort();
currentTry.Extents = ExtentsConverter.ToMetadata(extents);
dataChk = new Checksum();
Checksum dataChk = new Checksum();
dumpFile.Seek(0, SeekOrigin.Begin);
blocksToRead = 500;
@@ -601,7 +576,6 @@ namespace DiscImageChef.Core.Devices.Dumping
PluginBase plugins = new PluginBase();
plugins.RegisterAllPlugins(encoding);
ImagePlugin imageFormat;
FiltersList filtersList = new FiltersList();
Filter inputFilter = filtersList.GetFilter(outputPrefix + outputExtension);
@@ -611,7 +585,7 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
imageFormat = ImageFormat.Detect(inputFilter);
ImagePlugin imageFormat = ImageFormat.Detect(inputFilter);
PartitionType[] xmlFileSysInfo = null;
try { if(!imageFormat.OpenImage(inputFilter)) imageFormat = null; }
@@ -648,7 +622,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
if(!plugin.Identify(imageFormat, partitions[i])) continue;
plugin.GetInformation(imageFormat, partitions[i], out string foo);
plugin.GetInformation(imageFormat, partitions[i], out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
dumpLog.WriteLine("Filesystem {0} found.", plugin.XmlFSType.Type);
@@ -689,7 +663,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
if(!plugin.Identify(imageFormat, wholePart)) continue;
plugin.GetInformation(imageFormat, wholePart, out string foo);
plugin.GetInformation(imageFormat, wholePart, out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
dumpLog.WriteLine("Filesystem {0} found.", plugin.XmlFSType.Type);

View File

@@ -50,15 +50,13 @@ namespace DiscImageChef.Core.Devices.Dumping
bool dumpRaw, bool persistent, bool stopOnError, bool separateSubchannel,
ref Resume resume, ref DumpLog dumpLog, bool dumpLeadIn, Encoding encoding)
{
byte[] senseBuf;
bool sense;
MediaType dskType = MediaType.Unknown;
int resets = 0;
if(dev.IsRemovable)
{
deviceGotReset:
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out double duration);
bool sense = dev.ScsiTestUnitReady(out byte[] senseBuf, dev.Timeout, out _);
if(sense)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuf);
@@ -81,7 +79,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
DicConsole.WriteLine("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
if(!sense) break;
decSense = Sense.DecodeFixed(senseBuf);
@@ -104,7 +102,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
DicConsole.WriteLine("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
if(!sense) break;
decSense = Sense.DecodeFixed(senseBuf);
@@ -141,7 +139,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
DicConsole.WriteLine("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
if(!sense) break;
decSense = Sense.DecodeFixed(senseBuf);

View File

@@ -53,8 +53,6 @@ namespace DiscImageChef.Core.Devices.Dumping
{
FixedSense? fxSense;
bool aborted;
MhddLog mhddLog;
IbgLog ibgLog;
bool sense;
ulong blocks = 0;
uint blockSize;
@@ -66,7 +64,6 @@ namespace DiscImageChef.Core.Devices.Dumping
double currentSpeed = 0;
double maxSpeed = double.MinValue;
double minSpeed = double.MaxValue;
Checksum dataChk;
dev.RequestSense(out byte[] senseBuf, dev.Timeout, out double duration);
fxSense = Sense.DecodeFixed(senseBuf, out string strSense);
@@ -87,7 +84,7 @@ namespace DiscImageChef.Core.Devices.Dumping
dumpLog.WriteLine("Rewinding, please wait...");
DicConsole.Write("Rewinding, please wait...");
// Rewind, let timeout apply
sense = dev.Rewind(out senseBuf, dev.Timeout, out duration);
dev.Rewind(out senseBuf, dev.Timeout, out duration);
// Still rewinding?
// TODO: Pause?
@@ -367,21 +364,17 @@ namespace DiscImageChef.Core.Devices.Dumping
}
}
Checksum partitionChk;
Checksum fileChk;
List<TapePartitionType> partitions = new List<TapePartitionType>();
List<TapeFileType> files = new List<TapeFileType>();
TapeFileType currentTapeFile;
TapePartitionType currentTapePartition;
DicConsole.WriteLine();
DataFile dumpFile = new DataFile(outputPrefix + ".bin");
dataChk = new Checksum();
Checksum dataChk = new Checksum();
start = DateTime.UtcNow;
mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, 1);
ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0008);
MhddLog mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, 1);
IbgLog ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0008);
currentTapeFile = new TapeFileType
TapeFileType currentTapeFile = new TapeFileType
{
Image = new ImageType
{
@@ -394,8 +387,8 @@ namespace DiscImageChef.Core.Devices.Dumping
StartBlock = (long)currentBlock,
BlockSize = blockSize
};
fileChk = new Checksum();
currentTapePartition = new TapePartitionType
Checksum fileChk = new Checksum();
TapePartitionType currentTapePartition = new TapePartitionType
{
Image = new ImageType
{
@@ -407,7 +400,7 @@ namespace DiscImageChef.Core.Devices.Dumping
Sequence = currentPartition,
StartBlock = (long)currentBlock
};
partitionChk = new Checksum();
Checksum partitionChk = new Checksum();
aborted = false;
System.Console.CancelKeyPress += (sender, e) => e.Cancel = aborted = true;
@@ -467,7 +460,7 @@ namespace DiscImageChef.Core.Devices.Dumping
currentPartitionSize = 0;
partitionChk = new Checksum();
DicConsole.WriteLine("Seeking to partition {0}", currentPartition);
sense = dev.Locate(out senseBuf, false, currentPartition, 0, dev.Timeout, out duration);
dev.Locate(out senseBuf, false, currentPartition, 0, dev.Timeout, out duration);
totalDuration += duration;
}

View File

@@ -57,8 +57,6 @@ namespace DiscImageChef.Core.Devices.Dumping
ref DumpLog dumpLog, Encoding encoding)
{
bool aborted;
MhddLog mhddLog;
IbgLog ibgLog;
if(dumpRaw)
{
@@ -73,8 +71,8 @@ namespace DiscImageChef.Core.Devices.Dumping
}
bool sense;
ushort currentProfile = 0x0001;
uint timeout = 5;
const ushort SD_PROFILE = 0x0001;
const uint TIMEOUT = 5;
double duration;
CICMMetadataType sidecar =
@@ -83,26 +81,21 @@ namespace DiscImageChef.Core.Devices.Dumping
uint blocksToRead = 128;
uint blockSize = 512;
ulong blocks = 0;
byte[] cid;
byte[] csd = null;
byte[] ocr = null;
byte[] ecsd = null;
byte[] scr = null;
uint[] response;
int physicalBlockSize = 0;
bool byteAddressed = true;
switch(dev.Type) {
case DeviceType.MMC:
{
ExtendedCSD ecsdDecoded = new ExtendedCSD();
CSD csdDecoded = new CSD();
dumpLog.WriteLine("Reading Extended CSD");
sense = dev.ReadExtendedCsd(out ecsd, out response, timeout, out duration);
sense = dev.ReadExtendedCsd(out ecsd, out _, TIMEOUT, out duration);
if(!sense)
{
ecsdDecoded = Decoders.MMC.Decoders.DecodeExtendedCSD(ecsd);
ExtendedCSD ecsdDecoded = Decoders.MMC.Decoders.DecodeExtendedCSD(ecsd);
blocksToRead = ecsdDecoded.OptimalReadSize;
blocks = ecsdDecoded.SectorCount;
blockSize = (uint)(ecsdDecoded.SectorSize == 1 ? 4096 : 512);
@@ -114,12 +107,12 @@ namespace DiscImageChef.Core.Devices.Dumping
else ecsd = null;
dumpLog.WriteLine("Reading CSD");
sense = dev.ReadCsd(out csd, out response, timeout, out duration);
sense = dev.ReadCsd(out csd, out _, TIMEOUT, out duration);
if(!sense)
{
if(blocks == 0)
{
csdDecoded = Decoders.MMC.Decoders.DecodeCSD(csd);
CSD csdDecoded = Decoders.MMC.Decoders.DecodeCSD(csd);
blocks = (ulong)((csdDecoded.Size + 1) * Math.Pow(2, csdDecoded.SizeMultiplier + 2));
blockSize = (uint)Math.Pow(2, csdDecoded.ReadBlockLength);
}
@@ -127,7 +120,7 @@ namespace DiscImageChef.Core.Devices.Dumping
else csd = null;
dumpLog.WriteLine("Reading OCR");
sense = dev.ReadOcr(out ocr, out response, timeout, out duration);
sense = dev.ReadOcr(out ocr, out _, TIMEOUT, out duration);
if(sense) ocr = null;
sidecar.BlockMedia[0].MultiMediaCard = new MultiMediaCardType();
@@ -135,13 +128,11 @@ namespace DiscImageChef.Core.Devices.Dumping
}
case DeviceType.SecureDigital:
{
Decoders.SecureDigital.CSD csdDecoded = new Decoders.SecureDigital.CSD();
dumpLog.WriteLine("Reading CSD");
sense = dev.ReadCsd(out csd, out response, timeout, out duration);
sense = dev.ReadCsd(out csd, out _, TIMEOUT, out duration);
if(!sense)
{
csdDecoded = Decoders.SecureDigital.Decoders.DecodeCSD(csd);
Decoders.SecureDigital.CSD csdDecoded = Decoders.SecureDigital.Decoders.DecodeCSD(csd);
blocks = (ulong)(csdDecoded.Structure == 0
? (csdDecoded.Size + 1) * Math.Pow(2, csdDecoded.SizeMultiplier + 2)
: (csdDecoded.Size + 1) * 1024);
@@ -152,11 +143,11 @@ namespace DiscImageChef.Core.Devices.Dumping
else csd = null;
dumpLog.WriteLine("Reading OCR");
sense = dev.ReadSdocr(out ocr, out response, timeout, out duration);
sense = dev.ReadSdocr(out ocr, out _, TIMEOUT, out duration);
if(sense) ocr = null;
dumpLog.WriteLine("Reading SCR");
sense = dev.ReadScr(out scr, out response, timeout, out duration);
sense = dev.ReadScr(out scr, out _, TIMEOUT, out duration);
if(sense) scr = null;
sidecar.BlockMedia[0].SecureDigital = new SecureDigitalType();
@@ -165,7 +156,7 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Reading CID");
sense = dev.ReadCid(out cid, out response, timeout, out duration);
sense = dev.ReadCid(out byte[] cid, out _, TIMEOUT, out duration);
if(sense) cid = null;
DumpType cidDump = null;
@@ -182,7 +173,7 @@ namespace DiscImageChef.Core.Devices.Dumping
};
DataFile.WriteTo("MMC/SecureDigital Dump", cidDump.Image, cid);
}
;
if(csd != null)
{
csdDump = new DumpType
@@ -193,7 +184,7 @@ namespace DiscImageChef.Core.Devices.Dumping
};
DataFile.WriteTo("MMC/SecureDigital Dump", csdDump.Image, csd);
}
;
if(ecsd != null)
{
sidecar.BlockMedia[0].MultiMediaCard.ExtendedCSD = new DumpType
@@ -205,7 +196,7 @@ namespace DiscImageChef.Core.Devices.Dumping
DataFile.WriteTo("MMC/SecureDigital Dump", sidecar.BlockMedia[0].MultiMediaCard.ExtendedCSD.Image,
ecsd);
}
;
if(ocr != null)
{
ocrDump = new DumpType
@@ -216,7 +207,7 @@ namespace DiscImageChef.Core.Devices.Dumping
};
DataFile.WriteTo("MMC/SecureDigital Dump", ocrDump.Image, ocr);
}
;
if(scr != null)
{
sidecar.BlockMedia[0].SecureDigital.SCR = new DumpType
@@ -227,7 +218,7 @@ namespace DiscImageChef.Core.Devices.Dumping
};
DataFile.WriteTo("MMC/SecureDigital Dump", sidecar.BlockMedia[0].SecureDigital.SCR.Image, scr);
}
;
switch(dev.Type) {
case DeviceType.MMC:
@@ -249,13 +240,10 @@ namespace DiscImageChef.Core.Devices.Dumping
double currentSpeed = 0;
double maxSpeed = double.MinValue;
double minSpeed = double.MaxValue;
Checksum dataChk;
aborted = false;
System.Console.CancelKeyPress += (sender, e) => e.Cancel = aborted = true;
DataFile dumpFile;
if(blocks == 0)
{
dumpLog.WriteLine("Cannot get device size.");
@@ -266,11 +254,11 @@ namespace DiscImageChef.Core.Devices.Dumping
dumpLog.WriteLine("Device reports {0} blocks.", blocks);
byte[] cmdBuf;
bool error = true;
bool error;
while(true)
{
error = dev.Read(out cmdBuf, out response, 0, blockSize, blocksToRead, byteAddressed, timeout,
error = dev.Read(out cmdBuf, out _, 0, blockSize, blocksToRead, byteAddressed, TIMEOUT,
out duration);
if(error) blocksToRead /= 2;
@@ -280,7 +268,6 @@ namespace DiscImageChef.Core.Devices.Dumping
if(error)
{
blocksToRead = 1;
dumpLog.WriteLine("ERROR: Cannot get blocks to read, device error {0}.", dev.LastError);
DicConsole.ErrorWriteLine("Device error {0} trying to guess ideal transfer length.", dev.LastError);
return;
@@ -297,9 +284,9 @@ namespace DiscImageChef.Core.Devices.Dumping
DicConsole.WriteLine("Reading {0} sectors at a time.", blocksToRead);
mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead);
ibgLog = new IbgLog(outputPrefix + ".ibg", currentProfile);
dumpFile = new DataFile(outputPrefix + ".bin");
MhddLog mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead);
IbgLog ibgLog = new IbgLog(outputPrefix + ".ibg", SD_PROFILE);
DataFile dumpFile = new DataFile(outputPrefix + ".bin");
dumpFile.Seek(resume.NextBlock, blockSize);
if(resume.NextBlock > 0) dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock);
@@ -322,7 +309,7 @@ namespace DiscImageChef.Core.Devices.Dumping
DicConsole.Write("\rReading sector {0} of {1} ({2:F3} MiB/sec.)", i, blocks, currentSpeed);
error = dev.Read(out cmdBuf, out response, (uint)i, blockSize, blocksToRead, byteAddressed, timeout,
error = dev.Read(out cmdBuf, out _, (uint)i, blockSize, blocksToRead, byteAddressed, TIMEOUT,
out duration);
if(!error)
@@ -336,8 +323,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
for(ulong b = i; b < i + blocksToRead; b++) resume.BadBlocks.Add(b);
if(duration < 500) mhddLog.Write(i, 65535);
else mhddLog.Write(i, duration);
mhddLog.Write(i, duration < 500 ? 65535 : duration);
ibgLog.Write(i, 0);
dumpFile.Write(new byte[blockSize * blocksToRead]);
@@ -380,7 +366,7 @@ namespace DiscImageChef.Core.Devices.Dumping
forward ? "forward" : "reverse",
runningPersistent ? "recovering partial data, " : "");
error = dev.Read(out cmdBuf, out response, (uint)badSector, blockSize, 1, byteAddressed, timeout,
error = dev.Read(out cmdBuf, out _, (uint)badSector, blockSize, 1, byteAddressed, TIMEOUT,
out duration);
totalDuration += duration;
@@ -410,7 +396,7 @@ namespace DiscImageChef.Core.Devices.Dumping
currentTry.Extents = ExtentsConverter.ToMetadata(extents);
dataChk = new Checksum();
Checksum dataChk = new Checksum();
dumpFile.Seek(0, SeekOrigin.Begin);
blocksToRead = 500;
@@ -448,7 +434,6 @@ namespace DiscImageChef.Core.Devices.Dumping
PluginBase plugins = new PluginBase();
plugins.RegisterAllPlugins(encoding);
ImagePlugin imageFormat;
FiltersList filtersList = new FiltersList();
Filter inputFilter = filtersList.GetFilter(outputPrefix + ".bin");
@@ -459,7 +444,7 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
imageFormat = ImageFormat.Detect(inputFilter);
ImagePlugin imageFormat = ImageFormat.Detect(inputFilter);
PartitionType[] xmlFileSysInfo = null;
try { if(!imageFormat.OpenImage(inputFilter)) imageFormat = null; }
@@ -496,7 +481,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
if(!plugin.Identify(imageFormat, partitions[i])) continue;
plugin.GetInformation(imageFormat, partitions[i], out string foo);
plugin.GetInformation(imageFormat, partitions[i], out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
dumpLog.WriteLine("Filesystem {0} found.", plugin.XmlFSType.Type);
@@ -527,7 +512,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
if(!plugin.Identify(imageFormat, wholePart)) continue;
plugin.GetInformation(imageFormat, wholePart, out string foo);
plugin.GetInformation(imageFormat, wholePart, out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
dumpLog.WriteLine("Filesystem {0} found.", plugin.XmlFSType.Type);
@@ -555,6 +540,7 @@ namespace DiscImageChef.Core.Devices.Dumping
sidecar.BlockMedia[0].Dimensions = Dimensions.DimensionsFromMediaType(CommonTypes.MediaType.SecureDigital);
break;
}
sidecar.BlockMedia[0].DiskType = xmlDskTyp;
sidecar.BlockMedia[0].DiskSubType = xmlDskSubTyp;
// TODO: Implement device firmware revision
@@ -569,6 +555,7 @@ namespace DiscImageChef.Core.Devices.Dumping
case DeviceType.SecureDigital: sidecar.BlockMedia[0].Interface = "SecureDigital";
break;
}
sidecar.BlockMedia[0].LogicalBlocks = (long)blocks;
sidecar.BlockMedia[0].PhysicalBlockSize = physicalBlockSize > 0 ? physicalBlockSize : (int)blockSize;
sidecar.BlockMedia[0].LogicalBlockSize = (int)blockSize;

View File

@@ -60,13 +60,10 @@ namespace DiscImageChef.Core.Devices.Dumping
ref MediaType dskType, ref Resume resume, ref DumpLog dumpLog,
Encoding encoding)
{
MhddLog mhddLog;
IbgLog ibgLog;
bool sense;
ulong blocks;
uint blockSize = 2048;
const uint BLOCK_SIZE = 2048;
uint blocksToRead = 64;
ulong errored = 0;
DateTime start;
DateTime end;
double totalDuration = 0;
@@ -74,13 +71,11 @@ namespace DiscImageChef.Core.Devices.Dumping
double currentSpeed = 0;
double maxSpeed = double.MinValue;
double minSpeed = double.MaxValue;
Checksum dataChk;
DataFile dumpFile;
bool aborted = false;
System.Console.CancelKeyPress += (sender, e) => e.Cancel = aborted = true;
dumpLog.WriteLine("Reading Xbox Security Sector.");
sense = dev.KreonExtractSs(out byte[] ssBuf, out byte[] senseBuf, dev.Timeout, out double duration);
sense = dev.KreonExtractSs(out byte[] ssBuf, out byte[] senseBuf, dev.Timeout, out _);
if(sense)
{
dumpLog.WriteLine("Cannot get Xbox Security Sector, not continuing.");
@@ -123,7 +118,7 @@ namespace DiscImageChef.Core.Devices.Dumping
// Get video partition size
DicConsole.DebugWriteLine("Dump-media command", "Getting video partition size");
dumpLog.WriteLine("Locking drive.");
sense = dev.KreonLock(out senseBuf, dev.Timeout, out duration);
sense = dev.KreonLock(out senseBuf, dev.Timeout, out _);
if(sense)
{
dumpLog.WriteLine("Cannot lock drive, not continuing.");
@@ -132,7 +127,7 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Getting video partition size.");
sense = dev.ReadCapacity(out byte[] readBuffer, out senseBuf, dev.Timeout, out duration);
sense = dev.ReadCapacity(out byte[] readBuffer, out senseBuf, dev.Timeout, out _);
if(sense)
{
dumpLog.WriteLine("Cannot get disc capacity.");
@@ -143,7 +138,7 @@ namespace DiscImageChef.Core.Devices.Dumping
totalSize = (ulong)((readBuffer[0] << 24) + (readBuffer[1] << 16) + (readBuffer[2] << 8) + readBuffer[3]);
dumpLog.WriteLine("Reading Physical Format Information.");
sense = dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, 0, out duration);
MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _);
if(sense)
{
dumpLog.WriteLine("Cannot get PFI.");
@@ -166,7 +161,7 @@ namespace DiscImageChef.Core.Devices.Dumping
l1Video = totalSize - l0Video + 1;
dumpLog.WriteLine("Reading Disc Manufacturing Information.");
sense = dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DiscManufacturingInformation, 0, 0, out duration);
MmcDiscStructureFormat.DiscManufacturingInformation, 0, 0, out _);
if(sense)
{
dumpLog.WriteLine("Cannot get DMI.");
@@ -187,7 +182,7 @@ namespace DiscImageChef.Core.Devices.Dumping
// Get game partition size
DicConsole.DebugWriteLine("Dump-media command", "Getting game partition size");
dumpLog.WriteLine("Unlocking drive (Xtreme).");
sense = dev.KreonUnlockXtreme(out senseBuf, dev.Timeout, out duration);
sense = dev.KreonUnlockXtreme(out senseBuf, dev.Timeout, out _);
if(sense)
{
dumpLog.WriteLine("Cannot unlock drive, not continuing.");
@@ -196,7 +191,7 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Getting game partition size.");
sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out duration);
sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out _);
if(sense)
{
dumpLog.WriteLine("Cannot get disc capacity.");
@@ -211,7 +206,7 @@ namespace DiscImageChef.Core.Devices.Dumping
// Get middle zone size
DicConsole.DebugWriteLine("Dump-media command", "Getting middle zone size");
dumpLog.WriteLine("Unlocking drive (Wxripper).");
sense = dev.KreonUnlockWxripper(out senseBuf, dev.Timeout, out duration);
sense = dev.KreonUnlockWxripper(out senseBuf, dev.Timeout, out _);
if(sense)
{
dumpLog.WriteLine("Cannot unlock drive, not continuing.");
@@ -220,7 +215,7 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Getting disc size.");
sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out duration);
sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out _);
if(sense)
{
dumpLog.WriteLine("Cannot get disc capacity.");
@@ -231,7 +226,7 @@ namespace DiscImageChef.Core.Devices.Dumping
totalSize = (ulong)((readBuffer[0] << 24) + (readBuffer[1] << 16) + (readBuffer[2] << 8) + readBuffer[3]);
dumpLog.WriteLine("Reading Physical Format Information.");
sense = dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, 0, out duration);
MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _);
if(sense)
{
dumpLog.WriteLine("Cannot get PFI.");
@@ -256,7 +251,7 @@ namespace DiscImageChef.Core.Devices.Dumping
dumpLog.WriteLine("Reading Disc Manufacturing Information.");
sense = dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DiscManufacturingInformation, 0, 0, out duration);
MmcDiscStructureFormat.DiscManufacturingInformation, 0, 0, out _);
if(sense)
{
dumpLog.WriteLine("Cannot get DMI.");
@@ -292,8 +287,8 @@ namespace DiscImageChef.Core.Devices.Dumping
dumpLog.WriteLine("Total 0 size: {0} sectors", totalSize);
dumpLog.WriteLine("Real layer break: {0}", layerBreak);
bool read12 = !dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, 1,
false, dev.Timeout, out duration);
bool read12 = !dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, BLOCK_SIZE, 0, 1,
false, dev.Timeout, out _);
if(!read12)
{
dumpLog.WriteLine("Cannot read medium, aborting scan...");
@@ -308,8 +303,8 @@ namespace DiscImageChef.Core.Devices.Dumping
{
if(read12)
{
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, 0, blockSize, 0,
blocksToRead, false, dev.Timeout, out duration);
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, 0, BLOCK_SIZE, 0,
blocksToRead, false, dev.Timeout, out _);
if(sense || dev.Error) blocksToRead /= 2;
}
@@ -326,9 +321,9 @@ namespace DiscImageChef.Core.Devices.Dumping
dumpLog.WriteLine("Reading {0} sectors at a time.", blocksToRead);
DicConsole.WriteLine("Reading {0} sectors at a time.", blocksToRead);
mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead);
ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0010);
dumpFile = new DataFile(outputPrefix + ".iso");
MhddLog mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, BLOCK_SIZE, blocksToRead);
IbgLog ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0010);
DataFile dumpFile = new DataFile(outputPrefix + ".iso");
start = DateTime.UtcNow;
@@ -342,7 +337,7 @@ namespace DiscImageChef.Core.Devices.Dumping
throw new Exception("Could not process resume file, not continuing...");
ulong currentSector = resume.NextBlock;
dumpFile.Seek(resume.NextBlock, blockSize);
dumpFile.Seek(resume.NextBlock, BLOCK_SIZE);
if(resume.NextBlock > 0) dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock);
dumpLog.WriteLine("Reading game partition.");
@@ -402,7 +397,7 @@ namespace DiscImageChef.Core.Devices.Dumping
DicConsole.Write("\rReading sector {0} of {1} ({2:F3} MiB/sec.)", i, totalSize, currentSpeed);
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)i, blockSize,
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)i, BLOCK_SIZE,
0, blocksToRead, false, dev.Timeout, out cmdDuration);
totalDuration += cmdDuration;
@@ -419,15 +414,13 @@ namespace DiscImageChef.Core.Devices.Dumping
if(stopOnError) return; // TODO: Return more cleanly
// Write empty data
dumpFile.Write(new byte[blockSize * blocksToRead]);
dumpFile.Write(new byte[BLOCK_SIZE * blocksToRead]);
errored += blocksToRead;
for(ulong b = i; b < i + blocksToRead; b++) resume.BadBlocks.Add(b);
DicConsole.DebugWriteLine("Dump-Media", "READ error:\n{0}",
Sense.PrettifySense(senseBuf));
if(cmdDuration < 500) mhddLog.Write(i, 65535);
else mhddLog.Write(i, cmdDuration);
mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration);
ibgLog.Write(i, 0);
@@ -437,7 +430,7 @@ namespace DiscImageChef.Core.Devices.Dumping
foreach(string senseLine in senseLines) dumpLog.WriteLine(senseLine);
}
currentSpeed = (double)blockSize * blocksToRead / 1048576 / (cmdDuration / 1000);
currentSpeed = (double)BLOCK_SIZE * blocksToRead / 1048576 / (cmdDuration / 1000);
blocksToRead = saveBlocksToRead;
currentSector = i + 1;
resume.NextBlock = currentSector;
@@ -485,7 +478,7 @@ namespace DiscImageChef.Core.Devices.Dumping
mhddLog.Write(middle + currentSector, cmdDuration);
ibgLog.Write(middle + currentSector, currentSpeed * 1024);
dumpFile.Write(new byte[blockSize * blocksToRead]);
dumpFile.Write(new byte[BLOCK_SIZE * blocksToRead]);
extents.Add(currentSector, blocksToRead, true);
currentSector += blocksToRead;
@@ -495,7 +488,7 @@ namespace DiscImageChef.Core.Devices.Dumping
blocksToRead = saveBlocksToRead;
dumpLog.WriteLine("Locking drive.");
sense = dev.KreonLock(out senseBuf, dev.Timeout, out duration);
sense = dev.KreonLock(out senseBuf, dev.Timeout, out _);
if(sense)
{
dumpLog.WriteLine("Cannot lock drive, not continuing.");
@@ -503,7 +496,7 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out duration);
sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out _);
if(sense)
{
DicConsole.ErrorWriteLine("Cannot get disc capacity.");
@@ -531,7 +524,7 @@ namespace DiscImageChef.Core.Devices.Dumping
DicConsole.Write("\rReading sector {0} of {1} ({2:F3} MiB/sec.)", currentSector, totalSize,
currentSpeed);
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)l1, blockSize, 0,
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)l1, BLOCK_SIZE, 0,
blocksToRead, false, dev.Timeout, out cmdDuration);
totalDuration += cmdDuration;
@@ -548,15 +541,14 @@ namespace DiscImageChef.Core.Devices.Dumping
if(stopOnError) return; // TODO: Return more cleanly
// Write empty data
dumpFile.Write(new byte[blockSize * blocksToRead]);
dumpFile.Write(new byte[BLOCK_SIZE * blocksToRead]);
// TODO: Handle errors in video partition
//errored += blocksToRead;
//resume.BadBlocks.Add(l1);
DicConsole.DebugWriteLine("Dump-Media", "READ error:\n{0}",
Sense.PrettifySense(senseBuf));
if(cmdDuration < 500) mhddLog.Write(l1, 65535);
else mhddLog.Write(l1, cmdDuration);
mhddLog.Write(l1, cmdDuration < 500 ? 65535 : cmdDuration);
ibgLog.Write(l1, 0);
dumpLog.WriteLine("Error reading {0} blocks from block {1}.", blocksToRead, l1);
@@ -566,13 +558,13 @@ namespace DiscImageChef.Core.Devices.Dumping
foreach(string senseLine in senseLines) dumpLog.WriteLine(senseLine);
}
currentSpeed = (double)blockSize * blocksToRead / 1048576 / (cmdDuration / 1000);
currentSpeed = (double)BLOCK_SIZE * blocksToRead / 1048576 / (cmdDuration / 1000);
currentSector += blocksToRead;
resume.NextBlock = currentSector;
}
dumpLog.WriteLine("Unlocking drive (Wxripper).");
sense = dev.KreonUnlockWxripper(out senseBuf, dev.Timeout, out duration);
sense = dev.KreonUnlockWxripper(out senseBuf, dev.Timeout, out _);
if(sense)
{
dumpLog.WriteLine("Cannot unlock drive, not continuing.");
@@ -580,7 +572,7 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out duration);
sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out _);
if(sense)
{
DicConsole.ErrorWriteLine("Cannot get disc capacity.");
@@ -590,11 +582,11 @@ namespace DiscImageChef.Core.Devices.Dumping
end = DateTime.UtcNow;
DicConsole.WriteLine();
mhddLog.Close();
ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024,
blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000), devicePath);
ibgLog.Close(dev, blocks, BLOCK_SIZE, (end - start).TotalSeconds, currentSpeed * 1024,
BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000), devicePath);
dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds);
dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.",
(double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000));
(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000));
#region Error handling
if(resume.BadBlocks.Count > 0 && !aborted)
@@ -627,17 +619,17 @@ namespace DiscImageChef.Core.Devices.Dumping
runningPersistent ? "recovering partial data, " : "");
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)badSector,
blockSize, 0, 1, false, dev.Timeout, out cmdDuration);
BLOCK_SIZE, 0, 1, false, dev.Timeout, out cmdDuration);
totalDuration += cmdDuration;
if(!sense && !dev.Error)
{
resume.BadBlocks.Remove(badSector);
extents.Add(badSector);
dumpFile.WriteAt(readBuffer, badSector, blockSize);
dumpFile.WriteAt(readBuffer, badSector, BLOCK_SIZE);
dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass);
}
else if(runningPersistent) dumpFile.WriteAt(readBuffer, badSector, blockSize);
else if(runningPersistent) dumpFile.WriteAt(readBuffer, badSector, BLOCK_SIZE);
}
if(pass < retryPasses && !aborted && resume.BadBlocks.Count > 0)
@@ -649,25 +641,12 @@ namespace DiscImageChef.Core.Devices.Dumping
goto repeatRetry;
}
Modes.DecodedMode? currentMode = null;
Modes.ModePage? currentModePage = null;
byte[] md6;
byte[] md10;
if(!runningPersistent && persistent)
{
sense = dev.ModeSense6(out readBuffer, out senseBuf, false, ScsiModeSensePageControl.Current, 0x01,
dev.Timeout, out duration);
if(sense)
{
sense = dev.ModeSense10(out readBuffer, out senseBuf, false, ScsiModeSensePageControl.Current,
0x01, dev.Timeout, out duration);
if(!sense) currentMode = Modes.DecodeMode10(readBuffer, dev.ScsiType);
}
else currentMode = Modes.DecodeMode6(readBuffer, dev.ScsiType);
if(currentMode.HasValue) currentModePage = currentMode.Value.Pages[0];
if(dev.ScsiType == PeripheralDeviceTypes.MultiMediaDevice)
{
Modes.ModePage_01_MMC pgMmc =
@@ -726,8 +705,8 @@ namespace DiscImageChef.Core.Devices.Dumping
}
dumpLog.WriteLine("Sending MODE SELECT to drive.");
sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out duration);
if(sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out duration);
sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _);
if(sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _);
runningPersistent = true;
if(!sense && !dev.Error)
@@ -747,8 +726,8 @@ namespace DiscImageChef.Core.Devices.Dumping
md10 = Modes.EncodeMode10(md, dev.ScsiType);
dumpLog.WriteLine("Sending MODE SELECT to drive.");
sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out duration);
if(sense) sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out duration);
sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _);
if(sense) dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _);
}
DicConsole.WriteLine();
@@ -758,7 +737,7 @@ namespace DiscImageChef.Core.Devices.Dumping
resume.BadBlocks.Sort();
currentTry.Extents = ExtentsConverter.ToMetadata(extents);
dataChk = new Checksum();
Checksum dataChk = new Checksum();
dumpFile.Seek(0, SeekOrigin.Begin);
blocksToRead = 500;
@@ -778,15 +757,15 @@ namespace DiscImageChef.Core.Devices.Dumping
DicConsole.Write("\rChecksumming sector {0} of {1} ({2:F3} MiB/sec.)", i, blocks, currentSpeed);
DateTime chkStart = DateTime.UtcNow;
byte[] dataToCheck = new byte[blockSize * blocksToRead];
dumpFile.Read(dataToCheck, 0, (int)(blockSize * blocksToRead));
byte[] dataToCheck = new byte[BLOCK_SIZE * blocksToRead];
dumpFile.Read(dataToCheck, 0, (int)(BLOCK_SIZE * blocksToRead));
dataChk.Update(dataToCheck);
DateTime chkEnd = DateTime.UtcNow;
double chkDuration = (chkEnd - chkStart).TotalMilliseconds;
totalChkDuration += chkDuration;
currentSpeed = (double)blockSize * blocksToRead / 1048576 / (chkDuration / 1000);
currentSpeed = (double)BLOCK_SIZE * blocksToRead / 1048576 / (chkDuration / 1000);
}
DicConsole.WriteLine();
@@ -794,11 +773,10 @@ namespace DiscImageChef.Core.Devices.Dumping
end = DateTime.UtcNow;
dumpLog.WriteLine("Checksum finished in {0} seconds.", (end - start).TotalSeconds);
dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.",
(double)blockSize * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000));
(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000));
PluginBase plugins = new PluginBase();
plugins.RegisterAllPlugins(encoding);
ImagePlugin imageFormat;
FiltersList filtersList = new FiltersList();
Filter inputFilter = filtersList.GetFilter(outputPrefix + ".iso");
@@ -808,7 +786,7 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
imageFormat = ImageFormat.Detect(inputFilter);
ImagePlugin imageFormat = ImageFormat.Detect(inputFilter);
PartitionType[] xmlFileSysInfo = null;
try { if(!imageFormat.OpenImage(inputFilter)) imageFormat = null; }
@@ -845,7 +823,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{
if(!plugin.Identify(imageFormat, partitions[i])) continue;
plugin.GetInformation(imageFormat, partitions[i], out string foo);
plugin.GetInformation(imageFormat, partitions[i], out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
dumpLog.WriteLine("Filesystem {0} found.", plugin.XmlFSType.Type);
@@ -879,14 +857,14 @@ namespace DiscImageChef.Core.Devices.Dumping
List<FileSystemType> lstFs = new List<FileSystemType>();
Partition wholePart =
new Partition {Name = "Whole device", Length = blocks, Size = blocks * blockSize};
new Partition {Name = "Whole device", Length = blocks, Size = blocks * BLOCK_SIZE};
foreach(Filesystem plugin in plugins.PluginsList.Values)
try
{
if(!plugin.Identify(imageFormat, wholePart)) continue;
plugin.GetInformation(imageFormat, wholePart, out string foo);
plugin.GetInformation(imageFormat, wholePart, out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
dumpLog.WriteLine("Filesystem {0} found.", plugin.XmlFSType.Type);
@@ -932,7 +910,7 @@ namespace DiscImageChef.Core.Devices.Dumping
sidecar.OpticalDisc[0].Track = new TrackType[1];
sidecar.OpticalDisc[0].Track[0] = new TrackType
{
BytesPerSector = (int)blockSize,
BytesPerSector = (int)BLOCK_SIZE,
Checksums = sidecar.OpticalDisc[0].Checksums,
EndSector = (long)(blocks - 1),
Image =
@@ -944,7 +922,7 @@ namespace DiscImageChef.Core.Devices.Dumping
Value = sidecar.OpticalDisc[0].Image.Value
},
Sequence = new TrackSequenceType {Session = 1, TrackNumber = 1},
Size = (long)(totalSize * blockSize),
Size = (long)(totalSize * BLOCK_SIZE),
StartSector = 0
};
if(xmlFileSysInfo != null) sidecar.OpticalDisc[0].Track[0].FileSystemInformation = xmlFileSysInfo;

View File

@@ -42,7 +42,7 @@ namespace DiscImageChef.Core.Devices
uint timeout;
internal string ErrorMessage { get; private set; }
internal ulong Blocks { get; set; }
internal ulong Blocks { get; private set; }
internal uint BlocksToRead { get; private set; }
internal uint LogicalBlockSize { get; private set; }
internal uint PhysicalBlockSize { get; private set; }
@@ -50,11 +50,11 @@ namespace DiscImageChef.Core.Devices
internal bool CanReadRaw { get; private set; }
internal bool CanSeek
{
get { return ataSeek || seek6 || seek10; }
get => ataSeek || seek6 || seek10;
}
internal bool CanSeekLba
{
get { return ataSeekLba || seek6 || seek10; }
get => ataSeekLba || seek6 || seek10;
}
internal Reader(Device dev, uint timeout, byte[] identification, bool raw = false)

View File

@@ -103,39 +103,32 @@ namespace DiscImageChef.Core.Devices
bool AtaFindReadCommand()
{
byte[] cmdBuf;
bool sense;
AtaErrorRegistersCHS errorChs;
AtaErrorRegistersLBA28 errorLba;
AtaErrorRegistersLBA48 errorLba48;
double duration;
sense = dev.Read(out cmdBuf, out errorChs, false, 0, 0, 1, 1, timeout, out duration);
bool sense = dev.Read(out byte[] cmdBuf, out AtaErrorRegistersCHS errorChs, false, 0, 0, 1, 1, timeout, out _);
ataRead = !sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0;
sense = dev.Read(out cmdBuf, out errorChs, true, 0, 0, 1, 1, timeout, out duration);
sense = dev.Read(out cmdBuf, out errorChs, true, 0, 0, 1, 1, timeout, out _);
ataReadRetry = !sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0;
sense = dev.ReadDma(out cmdBuf, out errorChs, false, 0, 0, 1, 1, timeout, out duration);
sense = dev.ReadDma(out cmdBuf, out errorChs, false, 0, 0, 1, 1, timeout, out _);
ataReadDma = !sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0;
sense = dev.ReadDma(out cmdBuf, out errorChs, true, 0, 0, 1, 1, timeout, out duration);
sense = dev.ReadDma(out cmdBuf, out errorChs, true, 0, 0, 1, 1, timeout, out _);
ataReadDmaRetry = !sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0;
sense = dev.Read(out cmdBuf, out errorLba, false, 0, 1, timeout, out duration);
sense = dev.Read(out cmdBuf, out AtaErrorRegistersLBA28 errorLba, false, 0, 1, timeout, out _);
ataReadLba = !sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0;
sense = dev.Read(out cmdBuf, out errorLba, true, 0, 1, timeout, out duration);
sense = dev.Read(out cmdBuf, out errorLba, true, 0, 1, timeout, out _);
ataReadRetryLba = !sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0;
sense = dev.ReadDma(out cmdBuf, out errorLba, false, 0, 1, timeout, out duration);
sense = dev.ReadDma(out cmdBuf, out errorLba, false, 0, 1, timeout, out _);
ataReadDmaLba = !sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0;
sense = dev.ReadDma(out cmdBuf, out errorLba, true, 0, 1, timeout, out duration);
sense = dev.ReadDma(out cmdBuf, out errorLba, true, 0, 1, timeout, out _);
ataReadDmaRetryLba = !sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0;
sense = dev.Read(out cmdBuf, out errorLba48, 0, 1, timeout, out duration);
sense = dev.Read(out cmdBuf, out AtaErrorRegistersLBA48 errorLba48, 0, 1, timeout, out _);
ataReadLba48 = !sense && (errorLba48.status & 0x27) == 0 && errorLba48.error == 0 && cmdBuf.Length > 0;
sense = dev.ReadDma(out cmdBuf, out errorLba48, 0, 1, timeout, out duration);
sense = dev.ReadDma(out cmdBuf, out errorLba48, 0, 1, timeout, out _);
ataReadDmaLba48 = !sense && (errorLba48.status & 0x27) == 0 && errorLba48.error == 0 && cmdBuf.Length > 0;
sense = dev.Seek(out errorChs, 0, 0, 1, timeout, out duration);
sense = dev.Seek(out errorChs, 0, 0, 1, timeout, out _);
ataSeek = !sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0;
sense = dev.Seek(out errorLba, 0, timeout, out duration);
sense = dev.Seek(out errorLba, 0, timeout, out _);
ataSeekLba = !sense && (errorLba.status & 0x27) == 0 && errorChs.error == 0;
if(IsLba)
@@ -217,44 +210,46 @@ namespace DiscImageChef.Core.Devices
return false;
}
byte[] cmdBuf;
bool sense;
AtaErrorRegistersLBA28 errorLba;
AtaErrorRegistersLBA48 errorLba48;
double duration;
bool error = true;
while(IsLba)
{
byte[] cmdBuf;
bool sense;
AtaErrorRegistersLBA48 errorLba48;
if(ataReadDmaLba48)
{
sense = dev.ReadDma(out cmdBuf, out errorLba48, 0, (byte)BlocksToRead, timeout, out duration);
sense = dev.ReadDma(out cmdBuf, out errorLba48, 0, (byte)BlocksToRead, timeout, out _);
error = !(!sense && (errorLba48.status & 0x27) == 0 && errorLba48.error == 0 && cmdBuf.Length > 0);
}
else if(ataReadLba48)
{
sense = dev.Read(out cmdBuf, out errorLba48, 0, (byte)BlocksToRead, timeout, out duration);
sense = dev.Read(out cmdBuf, out errorLba48, 0, (byte)BlocksToRead, timeout, out _);
error = !(!sense && (errorLba48.status & 0x27) == 0 && errorLba48.error == 0 && cmdBuf.Length > 0);
}
else if(ataReadDmaRetryLba)
else
{
sense = dev.ReadDma(out cmdBuf, out errorLba, true, 0, (byte)BlocksToRead, timeout, out duration);
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
}
else if(ataReadDmaLba)
{
sense = dev.ReadDma(out cmdBuf, out errorLba, false, 0, (byte)BlocksToRead, timeout, out duration);
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
}
else if(ataReadRetryLba)
{
sense = dev.Read(out cmdBuf, out errorLba, true, 0, (byte)BlocksToRead, timeout, out duration);
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
}
else if(ataReadLba)
{
sense = dev.Read(out cmdBuf, out errorLba, false, 0, (byte)BlocksToRead, timeout, out duration);
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
AtaErrorRegistersLBA28 errorLba;
if(ataReadDmaRetryLba)
{
sense = dev.ReadDma(out cmdBuf, out errorLba, true, 0, (byte)BlocksToRead, timeout, out _);
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
}
else if(ataReadDmaLba)
{
sense = dev.ReadDma(out cmdBuf, out errorLba, false, 0, (byte)BlocksToRead, timeout, out _);
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
}
else if(ataReadRetryLba)
{
sense = dev.Read(out cmdBuf, out errorLba, true, 0, (byte)BlocksToRead, timeout, out _);
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
}
else if(ataReadLba)
{
sense = dev.Read(out cmdBuf, out errorLba, false, 0, (byte)BlocksToRead, timeout, out _);
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
}
}
if(error) BlocksToRead /= 2;
@@ -372,17 +367,13 @@ namespace DiscImageChef.Core.Devices
bool AtaSeek(ulong block, out double duration)
{
AtaErrorRegistersLBA28 errorLba;
bool sense = dev.Seek(out errorLba, (uint)block, timeout, out duration);
bool sense = dev.Seek(out AtaErrorRegistersLBA28 errorLba, (uint)block, timeout, out duration);
return !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0);
}
bool AtaSeekChs(ushort cylinder, byte head, byte sector, out double duration)
{
AtaErrorRegistersCHS errorChs;
bool sense = dev.Seek(out errorChs, cylinder, head, sector, timeout, out duration);
bool sense = dev.Seek(out AtaErrorRegistersCHS errorChs, cylinder, head, sector, timeout, out duration);
return !(!sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0);
}
}

View File

@@ -60,24 +60,20 @@ namespace DiscImageChef.Core.Devices
bool ScsiFindReadCommand()
{
byte[] readBuffer;
byte[] senseBuf;
double duration;
read6 = !dev.Read6(out _, out byte[] senseBuf, 0, LogicalBlockSize, timeout, out _);
read6 = !dev.Read6(out readBuffer, out senseBuf, 0, LogicalBlockSize, timeout, out duration);
read10 = !dev.Read10(out _, out senseBuf, 0, false, true, false, false, 0, LogicalBlockSize, 0, 1,
timeout, out _);
read10 = !dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, 0, LogicalBlockSize, 0, 1,
timeout, out duration);
read12 = !dev.Read12(out _, out senseBuf, 0, false, true, false, false, 0, LogicalBlockSize, 0, 1, false,
timeout, out _);
read12 = !dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, LogicalBlockSize, 0, 1, false,
timeout, out duration);
read16 = !dev.Read16(out _, out senseBuf, 0, false, true, false, 0, LogicalBlockSize, 0, 1, false,
timeout, out _);
read16 = !dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, 0, LogicalBlockSize, 0, 1, false,
timeout, out duration);
seek6 = !dev.Seek6(out senseBuf, 0, timeout, out _);
seek6 = !dev.Seek6(out senseBuf, 0, timeout, out duration);
seek10 = !dev.Seek10(out senseBuf, 0, timeout, out duration);
seek10 = !dev.Seek10(out senseBuf, 0, timeout, out _);
if(!read6 && !read10 && !read12 && !read16)
{
@@ -102,7 +98,6 @@ namespace DiscImageChef.Core.Devices
if(CanReadRaw)
{
bool testSense;
FixedSense? decSense;
CanReadRaw = false;
if(dev.ScsiType != PeripheralDeviceTypes.MultiMediaDevice)
@@ -126,8 +121,9 @@ namespace DiscImageChef.Core.Devices
}
}*/
testSense = dev.ReadLong10(out readBuffer, out senseBuf, false, false, 0, 0xFFFF, timeout,
out duration);
testSense = dev.ReadLong10(out _, out senseBuf, false, false, 0, 0xFFFF, timeout,
out _);
FixedSense? decSense;
if(testSense && !dev.Error)
{
decSense = Sense.DecodeFixed(senseBuf);
@@ -139,8 +135,8 @@ namespace DiscImageChef.Core.Devices
if(decSense.Value.InformationValid && decSense.Value.ILI)
{
LongBlockSize = 0xFFFF - (decSense.Value.Information & 0xFFFF);
readLong10 = !dev.ReadLong10(out readBuffer, out senseBuf, false, false, 0,
(ushort)LongBlockSize, timeout, out duration);
readLong10 = !dev.ReadLong10(out _, out senseBuf, false, false, 0,
(ushort)LongBlockSize, timeout, out _);
}
}
}
@@ -157,8 +153,8 @@ namespace DiscImageChef.Core.Devices
600, 610, 630
})
{
testSense = dev.ReadLong16(out readBuffer, out senseBuf, false, 0, testSize, timeout,
out duration);
testSense = dev.ReadLong16(out _, out senseBuf, false, 0, testSize, timeout,
out _);
if(!testSense && !dev.Error)
{
readLong16 = true;
@@ -167,8 +163,8 @@ namespace DiscImageChef.Core.Devices
break;
}
testSense = dev.ReadLong10(out readBuffer, out senseBuf, false, false, 0, testSize,
timeout, out duration);
testSense = dev.ReadLong10(out _, out senseBuf, false, false, 0, testSize,
timeout, out _);
if(testSense || dev.Error) continue;
readLong10 = true;
@@ -185,8 +181,8 @@ namespace DiscImageChef.Core.Devices
1200
})
{
testSense = dev.ReadLong16(out readBuffer, out senseBuf, false, 0, testSize, timeout,
out duration);
testSense = dev.ReadLong16(out _, out senseBuf, false, 0, testSize, timeout,
out _);
if(!testSense && !dev.Error)
{
readLong16 = true;
@@ -195,8 +191,8 @@ namespace DiscImageChef.Core.Devices
break;
}
testSense = dev.ReadLong10(out readBuffer, out senseBuf, false, false, 0, testSize,
timeout, out duration);
testSense = dev.ReadLong10(out _, out senseBuf, false, false, 0, testSize,
timeout, out _);
if(testSense || dev.Error) continue;
readLong10 = true;
@@ -206,8 +202,8 @@ namespace DiscImageChef.Core.Devices
}
else if(LogicalBlockSize == 2048)
{
testSense = dev.ReadLong16(out readBuffer, out senseBuf, false, 0, 2380, timeout,
out duration);
testSense = dev.ReadLong16(out _, out senseBuf, false, 0, 2380, timeout,
out _);
if(!testSense && !dev.Error)
{
readLong16 = true;
@@ -216,8 +212,8 @@ namespace DiscImageChef.Core.Devices
}
else
{
testSense = dev.ReadLong10(out readBuffer, out senseBuf, false, false, 0, 2380, timeout,
out duration);
testSense = dev.ReadLong10(out _, out senseBuf, false, false, 0, 2380, timeout,
out _);
if(!testSense && !dev.Error)
{
readLong10 = true;
@@ -228,8 +224,8 @@ namespace DiscImageChef.Core.Devices
}
else if(LogicalBlockSize == 4096)
{
testSense = dev.ReadLong16(out readBuffer, out senseBuf, false, 0, 4760, timeout,
out duration);
testSense = dev.ReadLong16(out _, out senseBuf, false, 0, 4760, timeout,
out _);
if(!testSense && !dev.Error)
{
readLong16 = true;
@@ -238,8 +234,8 @@ namespace DiscImageChef.Core.Devices
}
else
{
testSense = dev.ReadLong10(out readBuffer, out senseBuf, false, false, 0, 4760, timeout,
out duration);
testSense = dev.ReadLong10(out _, out senseBuf, false, false, 0, 4760, timeout,
out _);
if(!testSense && !dev.Error)
{
readLong10 = true;
@@ -250,8 +246,8 @@ namespace DiscImageChef.Core.Devices
}
else if(LogicalBlockSize == 8192)
{
testSense = dev.ReadLong16(out readBuffer, out senseBuf, false, 0, 9424, timeout,
out duration);
testSense = dev.ReadLong16(out _, out senseBuf, false, 0, 9424, timeout,
out _);
if(!testSense && !dev.Error)
{
readLong16 = true;
@@ -260,8 +256,8 @@ namespace DiscImageChef.Core.Devices
}
else
{
testSense = dev.ReadLong10(out readBuffer, out senseBuf, false, false, 0, 9424, timeout,
out duration);
testSense = dev.ReadLong10(out _, out senseBuf, false, false, 0, 9424, timeout,
out _);
if(!testSense && !dev.Error)
{
readLong10 = true;
@@ -273,8 +269,8 @@ namespace DiscImageChef.Core.Devices
if(!CanReadRaw && dev.Manufacturer == "SYQUEST")
{
testSense = dev.SyQuestReadLong10(out readBuffer, out senseBuf, 0, 0xFFFF, timeout,
out duration);
testSense = dev.SyQuestReadLong10(out _, out senseBuf, 0, 0xFFFF, timeout,
out _);
if(testSense)
{
decSense = Sense.DecodeFixed(senseBuf);
@@ -287,14 +283,14 @@ namespace DiscImageChef.Core.Devices
{
LongBlockSize = 0xFFFF - (decSense.Value.Information & 0xFFFF);
syqReadLong10 =
!dev.SyQuestReadLong10(out readBuffer, out senseBuf, 0, LongBlockSize,
timeout, out duration);
!dev.SyQuestReadLong10(out _, out senseBuf, 0, LongBlockSize,
timeout, out _);
}
}
else
{
testSense = dev.SyQuestReadLong6(out readBuffer, out senseBuf, 0, 0xFFFF, timeout,
out duration);
testSense = dev.SyQuestReadLong6(out _, out senseBuf, 0, 0xFFFF, timeout,
out _);
if(testSense)
{
decSense = Sense.DecodeFixed(senseBuf);
@@ -307,8 +303,8 @@ namespace DiscImageChef.Core.Devices
{
LongBlockSize = 0xFFFF - (decSense.Value.Information & 0xFFFF);
syqReadLong6 =
!dev.SyQuestReadLong6(out readBuffer, out senseBuf, 0,
LongBlockSize, timeout, out duration);
!dev.SyQuestReadLong6(out _, out senseBuf, 0,
LongBlockSize, timeout, out _);
}
}
}
@@ -317,8 +313,8 @@ namespace DiscImageChef.Core.Devices
if(!CanReadRaw && LogicalBlockSize == 256)
{
testSense = dev.SyQuestReadLong6(out readBuffer, out senseBuf, 0, 262, timeout,
out duration);
testSense = dev.SyQuestReadLong6(out _, out senseBuf, 0, 262, timeout,
out _);
if(!testSense && !dev.Error)
{
syqReadLong6 = true;
@@ -333,11 +329,11 @@ namespace DiscImageChef.Core.Devices
switch(dev.Manufacturer) {
case "HL-DT-ST":
hldtstReadRaw =
!dev.HlDtStReadRawDvd(out readBuffer, out senseBuf, 0, 1, timeout, out duration);
!dev.HlDtStReadRawDvd(out _, out senseBuf, 0, 1, timeout, out _);
break;
case "PLEXTOR":
plextorReadRaw =
!dev.PlextorReadRawDvd(out readBuffer, out senseBuf, 0, 1, timeout, out duration);
!dev.PlextorReadRawDvd(out _, out senseBuf, 0, 1, timeout, out _);
break;
}
@@ -350,8 +346,8 @@ namespace DiscImageChef.Core.Devices
// READ LONG (10) for some DVD drives
if(!CanReadRaw && dev.Manufacturer == "MATSHITA")
{
testSense = dev.ReadLong10(out readBuffer, out senseBuf, false, false, 0, 37856, timeout,
out duration);
testSense = dev.ReadLong10(out _, out senseBuf, false, false, 0, 37856, timeout,
out _);
if(!testSense && !dev.Error)
{
readLongDvd = true;
@@ -382,12 +378,9 @@ namespace DiscImageChef.Core.Devices
bool ScsiGetBlockSize()
{
bool sense;
byte[] cmdBuf;
byte[] senseBuf;
double duration;
Blocks = 0;
sense = dev.ReadCapacity(out cmdBuf, out senseBuf, timeout, out duration);
sense = dev.ReadCapacity(out byte[] cmdBuf, out byte[] senseBuf, timeout, out _);
if(!sense)
{
Blocks = (ulong)((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]);
@@ -396,7 +389,7 @@ namespace DiscImageChef.Core.Devices
if(sense || Blocks == 0xFFFFFFFF)
{
sense = dev.ReadCapacity16(out cmdBuf, out senseBuf, timeout, out duration);
sense = dev.ReadCapacity16(out cmdBuf, out senseBuf, timeout, out _);
if(sense && Blocks == 0)
if(dev.ScsiType != PeripheralDeviceTypes.MultiMediaDevice)
@@ -424,35 +417,32 @@ namespace DiscImageChef.Core.Devices
bool ScsiGetBlocksToRead(uint startWithBlocks)
{
byte[] readBuffer;
byte[] senseBuf;
double duration;
BlocksToRead = startWithBlocks;
while(true)
{
if(read16)
{
dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, 0, LogicalBlockSize, 0,
BlocksToRead, false, timeout, out duration);
dev.Read16(out _, out _, 0, false, true, false, 0, LogicalBlockSize, 0,
BlocksToRead, false, timeout, out _);
if(dev.Error) BlocksToRead /= 2;
}
else if(read12)
{
dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, 0, LogicalBlockSize, 0,
BlocksToRead, false, timeout, out duration);
dev.Read12(out _, out _, 0, false, false, false, false, 0, LogicalBlockSize, 0,
BlocksToRead, false, timeout, out _);
if(dev.Error) BlocksToRead /= 2;
}
else if(read10)
{
dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, 0, LogicalBlockSize, 0,
(ushort)BlocksToRead, timeout, out duration);
dev.Read10(out _, out _, 0, false, true, false, false, 0, LogicalBlockSize, 0,
(ushort)BlocksToRead, timeout, out _);
if(dev.Error) BlocksToRead /= 2;
}
else if(read6)
{
dev.Read6(out readBuffer, out senseBuf, 0, LogicalBlockSize, (byte)BlocksToRead, timeout,
out duration);
dev.Read6(out _, out _, 0, LogicalBlockSize, (byte)BlocksToRead, timeout,
out _);
if(dev.Error) BlocksToRead /= 2;
}
@@ -468,8 +458,8 @@ namespace DiscImageChef.Core.Devices
bool ScsiReadBlocks(out byte[] buffer, ulong block, uint count, out double duration)
{
bool sense = false;
byte[] senseBuf = null;
bool sense;
byte[] senseBuf;
buffer = null;
duration = 0;
@@ -519,12 +509,11 @@ namespace DiscImageChef.Core.Devices
bool ScsiSeek(ulong block, out double duration)
{
byte[] senseBuf;
bool sense = true;
duration = 0;
if(seek6) sense = dev.Seek6(out senseBuf, (uint)block, timeout, out duration);
else if(seek10) sense = dev.Seek10(out senseBuf, (uint)block, timeout, out duration);
if(seek6) sense = dev.Seek6(out _, (uint)block, timeout, out duration);
else if(seek10) sense = dev.Seek10(out _, (uint)block, timeout, out duration);
return sense;
}

View File

@@ -45,21 +45,17 @@ namespace DiscImageChef.Core.Devices.Report
{
if(report == null) return;
AtaErrorRegistersCHS errorRegs;
byte[] buffer;
double duration;
uint timeout = 5;
ConsoleKeyInfo pressedKey;
const uint TIMEOUT = 5;
if(dev.IsUsb) Usb.Report(dev, ref report, debug, ref removable);
if(dev.IsFireWire) FireWire.Report(dev, ref report, debug, ref removable);
if(dev.IsFireWire) FireWire.Report(dev, ref report, ref removable);
if(dev.IsPcmcia) Pcmcia.Report(dev, ref report, debug, ref removable);
if(dev.IsPcmcia) Pcmcia.Report(dev, ref report);
DicConsole.WriteLine("Querying ATA IDENTIFY...");
dev.AtaIdentify(out buffer, out errorRegs, timeout, out duration);
dev.AtaIdentify(out byte[] buffer, out _, TIMEOUT, out _);
if(!Identify.Decode(buffer).HasValue) return;
@@ -67,6 +63,7 @@ namespace DiscImageChef.Core.Devices.Report
if(ataIdNullable != null) {
Identify.IdentifyDevice ataId = ataIdNullable.Value;
ConsoleKeyInfo pressedKey;
if((ushort)ataId.GeneralConfiguration == 0x848A)
{
report.CompactFlash = true;
@@ -92,7 +89,7 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Please remove any media from the device and press any key when it is out.");
System.Console.ReadKey(true);
DicConsole.WriteLine("Querying ATA IDENTIFY...");
dev.AtaIdentify(out buffer, out errorRegs, timeout, out duration);
dev.AtaIdentify(out buffer, out _, TIMEOUT, out _);
ataId = Identify.Decode(buffer).Value;
}
@@ -521,7 +518,7 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.MediaIsRecognized = true;
DicConsole.WriteLine("Querying ATA IDENTIFY...");
dev.AtaIdentify(out buffer, out errorRegs, timeout, out duration);
dev.AtaIdentify(out buffer, out _, TIMEOUT, out _);
if(Identify.Decode(buffer).HasValue)
{
@@ -540,10 +537,12 @@ namespace DiscImageChef.Core.Devices.Report
if(ataId.Cylinders > 0 && ataId.Heads > 0 && ataId.SectorsPerTrack > 0)
{
mediaTest.CHS = new chsType();
mediaTest.CHS.Cylinders = ataId.Cylinders;
mediaTest.CHS.Heads = ataId.Heads;
mediaTest.CHS.Sectors = ataId.SectorsPerTrack;
mediaTest.CHS = new chsType
{
Cylinders = ataId.Cylinders,
Heads = ataId.Heads,
Sectors = ataId.SectorsPerTrack
};
mediaTest.Blocks = (ulong)(ataId.Cylinders * ataId.Heads * ataId.SectorsPerTrack);
mediaTest.BlocksSpecified = true;
}
@@ -551,10 +550,12 @@ namespace DiscImageChef.Core.Devices.Report
if(ataId.CurrentCylinders > 0 && ataId.CurrentHeads > 0 &&
ataId.CurrentSectorsPerTrack > 0)
{
mediaTest.CurrentCHS = new chsType();
mediaTest.CurrentCHS.Cylinders = ataId.CurrentCylinders;
mediaTest.CurrentCHS.Heads = ataId.CurrentHeads;
mediaTest.CurrentCHS.Sectors = ataId.CurrentSectorsPerTrack;
mediaTest.CurrentCHS = new chsType
{
Cylinders = ataId.CurrentCylinders,
Heads = ataId.CurrentHeads,
Sectors = ataId.CurrentSectorsPerTrack
};
if(mediaTest.Blocks == 0)
mediaTest.Blocks =
(ulong)(ataId.CurrentCylinders * ataId.CurrentHeads *
@@ -676,16 +677,11 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.SupportsReadLongRetrySpecified = true;
mediaTest.SupportsSeekSpecified = true;
AtaErrorRegistersCHS errorChs;
AtaErrorRegistersLBA28 errorLba;
AtaErrorRegistersLBA48 errorLba48;
byte[] readBuf;
ulong checkCorrectRead = BitConverter.ToUInt64(buffer, 0);
bool sense;
DicConsole.WriteLine("Trying READ SECTOR(S) in CHS mode...");
sense = dev.Read(out readBuf, out errorChs, false, 0, 0, 1, 1, timeout, out duration);
sense = dev.Read(out byte[] readBuf, out AtaErrorRegistersCHS errorChs, false, 0, 0, 1, 1, TIMEOUT, out _);
mediaTest.SupportsRead =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 &&
readBuf.Length > 0;
@@ -698,7 +694,7 @@ namespace DiscImageChef.Core.Devices.Report
readBuf);
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in CHS mode...");
sense = dev.Read(out readBuf, out errorChs, true, 0, 0, 1, 1, timeout, out duration);
sense = dev.Read(out readBuf, out errorChs, true, 0, 0, 1, 1, TIMEOUT, out _);
mediaTest.SupportsReadRetry =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 &&
readBuf.Length > 0;
@@ -711,8 +707,8 @@ namespace DiscImageChef.Core.Devices.Report
readBuf);
DicConsole.WriteLine("Trying READ DMA in CHS mode...");
sense = dev.ReadDma(out readBuf, out errorChs, false, 0, 0, 1, 1, timeout,
out duration);
sense = dev.ReadDma(out readBuf, out errorChs, false, 0, 0, 1, 1, TIMEOUT,
out _);
mediaTest.SupportsReadDma =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 &&
readBuf.Length > 0;
@@ -725,7 +721,7 @@ namespace DiscImageChef.Core.Devices.Report
readBuf);
DicConsole.WriteLine("Trying READ DMA RETRY in CHS mode...");
sense = dev.ReadDma(out readBuf, out errorChs, true, 0, 0, 1, 1, timeout, out duration);
sense = dev.ReadDma(out readBuf, out errorChs, true, 0, 0, 1, 1, TIMEOUT, out _);
mediaTest.SupportsReadDmaRetry =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 &&
readBuf.Length > 0;
@@ -738,7 +734,7 @@ namespace DiscImageChef.Core.Devices.Report
readBuf);
DicConsole.WriteLine("Trying SEEK in CHS mode...");
sense = dev.Seek(out errorChs, 0, 0, 1, timeout, out duration);
sense = dev.Seek(out errorChs, 0, 0, 1, TIMEOUT, out _);
mediaTest.SupportsSeek =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -746,7 +742,7 @@ namespace DiscImageChef.Core.Devices.Report
errorChs.status, errorChs.error);
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA mode...");
sense = dev.Read(out readBuf, out errorLba, false, 0, 1, timeout, out duration);
sense = dev.Read(out readBuf, out AtaErrorRegistersLBA28 errorLba, false, 0, 1, TIMEOUT, out _);
mediaTest.SupportsReadLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 &&
readBuf.Length > 0;
@@ -759,7 +755,7 @@ namespace DiscImageChef.Core.Devices.Report
readBuf);
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in LBA mode...");
sense = dev.Read(out readBuf, out errorLba, true, 0, 1, timeout, out duration);
sense = dev.Read(out readBuf, out errorLba, true, 0, 1, TIMEOUT, out _);
mediaTest.SupportsReadRetryLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 &&
readBuf.Length > 0;
@@ -772,7 +768,7 @@ namespace DiscImageChef.Core.Devices.Report
readBuf);
DicConsole.WriteLine("Trying READ DMA in LBA mode...");
sense = dev.ReadDma(out readBuf, out errorLba, false, 0, 1, timeout, out duration);
sense = dev.ReadDma(out readBuf, out errorLba, false, 0, 1, TIMEOUT, out _);
mediaTest.SupportsReadDmaLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 &&
readBuf.Length > 0;
@@ -785,7 +781,7 @@ namespace DiscImageChef.Core.Devices.Report
readBuf);
DicConsole.WriteLine("Trying READ DMA RETRY in LBA mode...");
sense = dev.ReadDma(out readBuf, out errorLba, true, 0, 1, timeout, out duration);
sense = dev.ReadDma(out readBuf, out errorLba, true, 0, 1, TIMEOUT, out _);
mediaTest.SupportsReadDmaRetryLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 &&
readBuf.Length > 0;
@@ -798,7 +794,7 @@ namespace DiscImageChef.Core.Devices.Report
readBuf);
DicConsole.WriteLine("Trying SEEK in LBA mode...");
sense = dev.Seek(out errorLba, 0, timeout, out duration);
sense = dev.Seek(out errorLba, 0, TIMEOUT, out _);
mediaTest.SupportsSeekLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -806,7 +802,7 @@ namespace DiscImageChef.Core.Devices.Report
errorChs.status, errorChs.error);
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA48 mode...");
sense = dev.Read(out readBuf, out errorLba48, 0, 1, timeout, out duration);
sense = dev.Read(out readBuf, out AtaErrorRegistersLBA48 errorLba48, 0, 1, TIMEOUT, out _);
mediaTest.SupportsReadLba48 =
!sense && (errorLba48.status & 0x01) != 0x01 && errorLba48.error == 0 &&
readBuf.Length > 0;
@@ -819,7 +815,7 @@ namespace DiscImageChef.Core.Devices.Report
readBuf);
DicConsole.WriteLine("Trying READ DMA in LBA48 mode...");
sense = dev.ReadDma(out readBuf, out errorLba48, 0, 1, timeout, out duration);
sense = dev.ReadDma(out readBuf, out errorLba48, 0, 1, TIMEOUT, out _);
mediaTest.SupportsReadDmaLba48 =
!sense && (errorLba48.status & 0x01) != 0x01 && errorLba48.error == 0 &&
readBuf.Length > 0;
@@ -833,7 +829,7 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Trying READ LONG in CHS mode...");
sense = dev.ReadLong(out readBuf, out errorChs, false, 0, 0, 1, mediaTest.LongBlockSize,
timeout, out duration);
TIMEOUT, out _);
mediaTest.SupportsReadLong =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 &&
readBuf.Length > 0 && BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
@@ -847,7 +843,7 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Trying READ LONG RETRY in CHS mode...");
sense = dev.ReadLong(out readBuf, out errorChs, true, 0, 0, 1, mediaTest.LongBlockSize,
timeout, out duration);
TIMEOUT, out _);
mediaTest.SupportsReadLongRetry =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 &&
readBuf.Length > 0 && BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
@@ -861,7 +857,7 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Trying READ LONG in LBA mode...");
sense = dev.ReadLong(out readBuf, out errorLba, false, 0, mediaTest.LongBlockSize,
timeout, out duration);
TIMEOUT, out _);
mediaTest.SupportsReadLongLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 &&
readBuf.Length > 0 && BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
@@ -875,7 +871,7 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Trying READ LONG RETRY in LBA mode...");
sense = dev.ReadLong(out readBuf, out errorLba, true, 0, mediaTest.LongBlockSize,
timeout, out duration);
TIMEOUT, out _);
mediaTest.SupportsReadLongRetryLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 &&
readBuf.Length > 0 && BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
@@ -911,10 +907,12 @@ namespace DiscImageChef.Core.Devices.Report
if(ataId.Cylinders > 0 && ataId.Heads > 0 && ataId.SectorsPerTrack > 0)
{
report.ATA.ReadCapabilities.CHS = new chsType();
report.ATA.ReadCapabilities.CHS.Cylinders = ataId.Cylinders;
report.ATA.ReadCapabilities.CHS.Heads = ataId.Heads;
report.ATA.ReadCapabilities.CHS.Sectors = ataId.SectorsPerTrack;
report.ATA.ReadCapabilities.CHS = new chsType
{
Cylinders = ataId.Cylinders,
Heads = ataId.Heads,
Sectors = ataId.SectorsPerTrack
};
report.ATA.ReadCapabilities.Blocks =
(ulong)(ataId.Cylinders * ataId.Heads * ataId.SectorsPerTrack);
report.ATA.ReadCapabilities.BlocksSpecified = true;
@@ -922,10 +920,12 @@ namespace DiscImageChef.Core.Devices.Report
if(ataId.CurrentCylinders > 0 && ataId.CurrentHeads > 0 && ataId.CurrentSectorsPerTrack > 0)
{
report.ATA.ReadCapabilities.CurrentCHS = new chsType();
report.ATA.ReadCapabilities.CurrentCHS.Cylinders = ataId.CurrentCylinders;
report.ATA.ReadCapabilities.CurrentCHS.Heads = ataId.CurrentHeads;
report.ATA.ReadCapabilities.CurrentCHS.Sectors = ataId.CurrentSectorsPerTrack;
report.ATA.ReadCapabilities.CurrentCHS = new chsType
{
Cylinders = ataId.CurrentCylinders,
Heads = ataId.CurrentHeads,
Sectors = ataId.CurrentSectorsPerTrack
};
report.ATA.ReadCapabilities.Blocks =
(ulong)(ataId.CurrentCylinders * ataId.CurrentHeads * ataId.CurrentSectorsPerTrack);
report.ATA.ReadCapabilities.BlocksSpecified = true;
@@ -1044,16 +1044,11 @@ namespace DiscImageChef.Core.Devices.Report
report.ATA.ReadCapabilities.SupportsReadLongRetrySpecified = true;
report.ATA.ReadCapabilities.SupportsSeekSpecified = true;
AtaErrorRegistersCHS errorChs;
AtaErrorRegistersLBA28 errorLba;
AtaErrorRegistersLBA48 errorLba48;
byte[] readBuf;
ulong checkCorrectRead = BitConverter.ToUInt64(buffer, 0);
bool sense;
DicConsole.WriteLine("Trying READ SECTOR(S) in CHS mode...");
sense = dev.Read(out readBuf, out errorChs, false, 0, 0, 1, 1, timeout, out duration);
sense = dev.Read(out byte[] readBuf, out AtaErrorRegistersCHS errorChs, false, 0, 0, 1, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsRead =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -1064,7 +1059,7 @@ namespace DiscImageChef.Core.Devices.Report
"read results", readBuf);
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in CHS mode...");
sense = dev.Read(out readBuf, out errorChs, true, 0, 0, 1, 1, timeout, out duration);
sense = dev.Read(out readBuf, out errorChs, true, 0, 0, 1, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadRetry =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -1075,7 +1070,7 @@ namespace DiscImageChef.Core.Devices.Report
"read results", readBuf);
DicConsole.WriteLine("Trying READ DMA in CHS mode...");
sense = dev.ReadDma(out readBuf, out errorChs, false, 0, 0, 1, 1, timeout, out duration);
sense = dev.ReadDma(out readBuf, out errorChs, false, 0, 0, 1, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadDma =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -1086,7 +1081,7 @@ namespace DiscImageChef.Core.Devices.Report
"read results", readBuf);
DicConsole.WriteLine("Trying READ DMA RETRY in CHS mode...");
sense = dev.ReadDma(out readBuf, out errorChs, true, 0, 0, 1, 1, timeout, out duration);
sense = dev.ReadDma(out readBuf, out errorChs, true, 0, 0, 1, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadDmaRetry =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -1097,14 +1092,14 @@ namespace DiscImageChef.Core.Devices.Report
"read results", readBuf);
DicConsole.WriteLine("Trying SEEK in CHS mode...");
sense = dev.Seek(out errorChs, 0, 0, 1, timeout, out duration);
sense = dev.Seek(out errorChs, 0, 0, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsSeek =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}", sense,
errorChs.status, errorChs.error);
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA mode...");
sense = dev.Read(out readBuf, out errorLba, false, 0, 1, timeout, out duration);
sense = dev.Read(out readBuf, out AtaErrorRegistersLBA28 errorLba, false, 0, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -1115,7 +1110,7 @@ namespace DiscImageChef.Core.Devices.Report
"read results", readBuf);
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in LBA mode...");
sense = dev.Read(out readBuf, out errorLba, true, 0, 1, timeout, out duration);
sense = dev.Read(out readBuf, out errorLba, true, 0, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadRetryLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -1126,7 +1121,7 @@ namespace DiscImageChef.Core.Devices.Report
"read results", readBuf);
DicConsole.WriteLine("Trying READ DMA in LBA mode...");
sense = dev.ReadDma(out readBuf, out errorLba, false, 0, 1, timeout, out duration);
sense = dev.ReadDma(out readBuf, out errorLba, false, 0, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadDmaLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -1137,7 +1132,7 @@ namespace DiscImageChef.Core.Devices.Report
readBuf);
DicConsole.WriteLine("Trying READ DMA RETRY in LBA mode...");
sense = dev.ReadDma(out readBuf, out errorLba, true, 0, 1, timeout, out duration);
sense = dev.ReadDma(out readBuf, out errorLba, true, 0, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadDmaRetryLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -1148,14 +1143,14 @@ namespace DiscImageChef.Core.Devices.Report
"read results", readBuf);
DicConsole.WriteLine("Trying SEEK in LBA mode...");
sense = dev.Seek(out errorLba, 0, timeout, out duration);
sense = dev.Seek(out errorLba, 0, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsSeekLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}", sense,
errorLba.status, errorLba.error);
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA48 mode...");
sense = dev.Read(out readBuf, out errorLba48, 0, 1, timeout, out duration);
sense = dev.Read(out readBuf, out AtaErrorRegistersLBA48 errorLba48, 0, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadLba48 =
!sense && (errorLba48.status & 0x01) != 0x01 && errorLba48.error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -1166,7 +1161,7 @@ namespace DiscImageChef.Core.Devices.Report
"read results", readBuf);
DicConsole.WriteLine("Trying READ DMA in LBA48 mode...");
sense = dev.ReadDma(out readBuf, out errorLba48, 0, 1, timeout, out duration);
sense = dev.ReadDma(out readBuf, out errorLba48, 0, 1, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadDmaLba48 =
!sense && (errorLba48.status & 0x01) != 0x01 && errorLba48.error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
@@ -1178,7 +1173,7 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Trying READ LONG in CHS mode...");
sense = dev.ReadLong(out readBuf, out errorChs, false, 0, 0, 1,
report.ATA.ReadCapabilities.LongBlockSize, timeout, out duration);
report.ATA.ReadCapabilities.LongBlockSize, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadLong =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 && readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
@@ -1191,7 +1186,7 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Trying READ LONG RETRY in CHS mode...");
sense = dev.ReadLong(out readBuf, out errorChs, true, 0, 0, 1,
report.ATA.ReadCapabilities.LongBlockSize, timeout, out duration);
report.ATA.ReadCapabilities.LongBlockSize, TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadLongRetry =
!sense && (errorChs.status & 0x01) != 0x01 && errorChs.error == 0 && readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
@@ -1204,7 +1199,7 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Trying READ LONG in LBA mode...");
sense = dev.ReadLong(out readBuf, out errorLba, false, 0, report.ATA.ReadCapabilities.LongBlockSize,
timeout, out duration);
TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadLongLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 && readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
@@ -1217,7 +1212,7 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Trying READ LONG RETRY in LBA mode...");
sense = dev.ReadLong(out readBuf, out errorLba, true, 0, report.ATA.ReadCapabilities.LongBlockSize,
timeout, out duration);
TIMEOUT, out _);
report.ATA.ReadCapabilities.SupportsReadLongRetryLba =
!sense && (errorLba.status & 0x01) != 0x01 && errorLba.error == 0 && readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;

View File

@@ -43,14 +43,11 @@ namespace DiscImageChef.Core.Devices.Report
{
if(report == null) return;
byte[] buffer;
double duration;
uint timeout = 5;
const uint TIMEOUT = 5;
DicConsole.WriteLine("Querying ATAPI IDENTIFY...");
AtaErrorRegistersCHS errorRegs;
dev.AtapiIdentify(out buffer, out errorRegs, timeout, out duration);
dev.AtapiIdentify(out byte[] buffer, out _, TIMEOUT, out _);
if(!Identify.Decode(buffer).HasValue) return;

View File

@@ -39,7 +39,7 @@ namespace DiscImageChef.Core.Devices.Report
{
static class FireWire
{
internal static void Report(Device dev, ref DeviceReport report, bool debug, ref bool removable)
internal static void Report(Device dev, ref DeviceReport report, ref bool removable)
{
if(report == null) return;
@@ -53,11 +53,13 @@ namespace DiscImageChef.Core.Devices.Report
if(pressedKey.Key != ConsoleKey.Y) return;
report.FireWire = new firewireType();
report.FireWire.Manufacturer = dev.FireWireVendorName;
report.FireWire.Product = dev.FireWireModelName;
report.FireWire.ProductID = dev.FireWireModel;
report.FireWire.VendorID = dev.FireWireVendor;
report.FireWire = new firewireType
{
Manufacturer = dev.FireWireVendorName,
Product = dev.FireWireModelName,
ProductID = dev.FireWireModel,
VendorID = dev.FireWireVendor
};
pressedKey = new ConsoleKeyInfo();
while(pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)

View File

@@ -38,10 +38,9 @@ namespace DiscImageChef.Core.Devices.Report
{
static class Pcmcia
{
internal static void Report(Device dev, ref DeviceReport report, bool debug, ref bool removable)
internal static void Report(Device dev, ref DeviceReport report)
{
report.PCMCIA = new pcmciaType();
report.PCMCIA.CIS = dev.Cis;
report.PCMCIA = new pcmciaType {CIS = dev.Cis};
Tuple[] tuples = CIS.GetTuples(dev.Cis);
if(tuples == null) return;

View File

@@ -48,18 +48,15 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
if(report == null) return;
byte[] senseBuffer;
byte[] buffer;
double duration;
bool sense;
uint timeout = 5;
const uint TIMEOUT = 5;
ConsoleKeyInfo pressedKey;
if(dev.IsUsb) Usb.Report(dev, ref report, debug, ref removable);
if(dev.IsFireWire) FireWire.Report(dev, ref report, debug, ref removable);
if(dev.IsFireWire) FireWire.Report(dev, ref report, ref removable);
if(dev.IsPcmcia) Pcmcia.Report(dev, ref report, debug, ref removable);
if(dev.IsPcmcia) Pcmcia.Report(dev, ref report);
if(!dev.IsUsb && !dev.IsFireWire && dev.IsRemovable)
{
@@ -77,7 +74,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(dev.Type == DeviceType.ATAPI) Atapi.Report(dev, ref report, debug, ref removable);
DicConsole.WriteLine("Querying SCSI INQUIRY...");
sense = dev.ScsiInquiry(out buffer, out senseBuffer);
sense = dev.ScsiInquiry(out byte[] buffer, out byte[] senseBuffer);
report.SCSI = new scsiType();
@@ -192,9 +189,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
sense = dev.ScsiInquiry(out buffer, out senseBuffer, page);
if(sense) continue;
pageType evpd = new pageType();
evpd.page = page;
evpd.value = buffer;
pageType evpd = new pageType {page = page, value = buffer};
evpds.Add(evpd);
}
@@ -206,15 +201,16 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
switch(dev.ScsiType) {
case PeripheralDeviceTypes.MultiMediaDevice:
dev.AllowMediumRemoval(out senseBuffer, timeout, out duration);
dev.EjectTray(out senseBuffer, timeout, out duration);
dev.AllowMediumRemoval(out senseBuffer, TIMEOUT, out _);
dev.EjectTray(out senseBuffer, TIMEOUT, out _);
break;
case PeripheralDeviceTypes.SequentialAccess:
dev.SpcAllowMediumRemoval(out senseBuffer, timeout, out duration);
dev.SpcAllowMediumRemoval(out senseBuffer, TIMEOUT, out _);
DicConsole.WriteLine("Asking drive to unload tape (can take a few minutes)...");
dev.Unload(out senseBuffer, timeout, out duration);
dev.Unload(out senseBuffer, TIMEOUT, out _);
break;
}
DicConsole.WriteLine("Please remove any media from the device and press any key when it is out.");
System.Console.ReadKey(true);
}
@@ -224,12 +220,12 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (10)...");
sense = dev.ModeSense10(out byte[] mode10Buffer, out senseBuffer, false, true,
ScsiModeSensePageControl.Default, 0x3F, 0xFF, timeout, out duration);
ScsiModeSensePageControl.Default, 0x3F, 0xFF, TIMEOUT, out _);
if(sense || dev.Error)
{
DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (10)...");
sense = dev.ModeSense10(out mode10Buffer, out senseBuffer, false, true,
ScsiModeSensePageControl.Default, 0x3F, 0x00, timeout, out duration);
ScsiModeSensePageControl.Default, 0x3F, 0x00, TIMEOUT, out _);
if(!sense && !dev.Error)
{
report.SCSI.SupportsModeSense10 = true;
@@ -246,16 +242,16 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (6)...");
sense = dev.ModeSense6(out byte[] mode6Buffer, out senseBuffer, false, ScsiModeSensePageControl.Default,
0x3F, 0xFF, timeout, out duration);
0x3F, 0xFF, TIMEOUT, out _);
if(sense || dev.Error)
{
DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (6)...");
sense = dev.ModeSense6(out mode6Buffer, out senseBuffer, false, ScsiModeSensePageControl.Default, 0x3F,
0x00, timeout, out duration);
0x00, TIMEOUT, out _);
if(sense || dev.Error)
{
DicConsole.WriteLine("Querying SCSI MODE SENSE (6)...");
sense = dev.ModeSense(out mode6Buffer, out senseBuffer, timeout, out duration);
sense = dev.ModeSense(out mode6Buffer, out senseBuffer, TIMEOUT, out _);
}
}
else report.SCSI.SupportsModeSubpages = true;
@@ -272,10 +268,12 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(decMode.HasValue)
{
report.SCSI.ModeSense = new modeType();
report.SCSI.ModeSense.BlankCheckEnabled = decMode.Value.Header.EBC;
report.SCSI.ModeSense.DPOandFUA = decMode.Value.Header.DPOFUA;
report.SCSI.ModeSense.WriteProtected = decMode.Value.Header.WriteProtected;
report.SCSI.ModeSense = new modeType
{
BlankCheckEnabled = decMode.Value.Header.EBC,
DPOandFUA = decMode.Value.Header.DPOFUA,
WriteProtected = decMode.Value.Header.WriteProtected
};
if(decMode.Value.Header.BufferedMode > 0)
{
@@ -294,10 +292,12 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
List<modePageType> modePages = new List<modePageType>();
foreach(Modes.ModePage page in decMode.Value.Pages)
{
modePageType modePage = new modePageType();
modePage.page = page.Page;
modePage.subpage = page.Subpage;
modePage.value = page.PageResponse;
modePageType modePage = new modePageType
{
page = page.Page,
subpage = page.Subpage,
value = page.PageResponse
};
modePages.Add(modePage);
if(modePage.page == 0x2A && modePage.subpage == 0x00) cdromMode = Modes.DecodeModePage_2A(page.PageResponse);
@@ -347,7 +347,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.ModelSpecified = true;
mediaTest.MediaIsRecognized = true;
sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _);
if(sense)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
@@ -359,7 +359,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
DicConsole.Write("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _);
if(!sense) break;
leftRetries--;
@@ -374,7 +374,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
DicConsole.Write("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _);
if(!sense) break;
leftRetries--;
@@ -392,7 +392,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.SupportsReadCapacity16Specified = true;
DicConsole.WriteLine("Querying SCSI READ CAPACITY...");
sense = dev.ReadCapacity(out buffer, out senseBuffer, timeout, out duration);
sense = dev.ReadCapacity(out buffer, out senseBuffer, TIMEOUT, out _);
if(!sense && !dev.Error)
{
mediaTest.SupportsReadCapacity = true;
@@ -406,7 +406,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
sense = dev.ReadCapacity16(out buffer, out buffer, timeout, out duration);
sense = dev.ReadCapacity16(out buffer, out buffer, TIMEOUT, out _);
if(!sense && !dev.Error)
{
mediaTest.SupportsReadCapacity16 = true;
@@ -425,8 +425,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
sense = dev.ModeSense10(out buffer, out senseBuffer, false, true,
ScsiModeSensePageControl.Current, 0x3F, 0x00, timeout,
out duration);
ScsiModeSensePageControl.Current, 0x3F, 0x00, TIMEOUT,
out _);
if(!sense && !dev.Error)
{
report.SCSI.SupportsModeSense10 = true;
@@ -435,7 +435,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
sense = dev.ModeSense(out buffer, out senseBuffer, timeout, out duration);
sense = dev.ModeSense(out buffer, out senseBuffer, TIMEOUT, out _);
if(!sense && !dev.Error)
{
report.SCSI.SupportsModeSense6 = true;
@@ -464,7 +464,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying SCSI READ (6)...");
mediaTest.SupportsRead = !dev.Read6(out buffer, out senseBuffer, 0, mediaTest.BlockSize,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead);
if(debug)
DataFile.WriteTo("SCSI Report", "read6",
@@ -474,7 +474,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying SCSI READ (10)...");
mediaTest.SupportsRead10 =
!dev.Read10(out buffer, out senseBuffer, 0, false, true, false, false, 0,
mediaTest.BlockSize, 0, 1, timeout, out duration);
mediaTest.BlockSize, 0, 1, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
if(debug)
DataFile.WriteTo("SCSI Report", "read10",
@@ -484,7 +484,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying SCSI READ (12)...");
mediaTest.SupportsRead12 =
!dev.Read12(out buffer, out senseBuffer, 0, false, true, false, false, 0,
mediaTest.BlockSize, 0, 1, false, timeout, out duration);
mediaTest.BlockSize, 0, 1, false, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
if(debug)
DataFile.WriteTo("SCSI Report", "read12",
@@ -494,7 +494,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying SCSI READ (16)...");
mediaTest.SupportsRead16 =
!dev.Read16(out buffer, out senseBuffer, 0, false, true, false, 0,
mediaTest.BlockSize, 0, 1, false, timeout, out duration);
mediaTest.BlockSize, 0, 1, false, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
if(debug)
DataFile.WriteTo("SCSI Report", "read16",
@@ -503,8 +503,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.LongBlockSize = mediaTest.BlockSize;
DicConsole.WriteLine("Trying SCSI READ LONG (10)...");
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, timeout,
out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, TIMEOUT,
out _);
if(sense && !dev.Error)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
@@ -535,7 +535,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
})
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0,
testSize, timeout, out duration);
testSize, TIMEOUT, out _);
if(sense || dev.Error) continue;
mediaTest.SupportsReadLong = true;
@@ -553,7 +553,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
})
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0,
testSize, timeout, out duration);
testSize, TIMEOUT, out _);
if(sense || dev.Error) continue;
mediaTest.SupportsReadLong = true;
@@ -564,7 +564,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
else if(mediaTest.BlockSize == 2048)
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 2380,
timeout, out duration);
TIMEOUT, out _);
if(!sense && !dev.Error)
{
mediaTest.SupportsReadLong = true;
@@ -575,7 +575,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
else if(mediaTest.BlockSize == 4096)
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 4760,
timeout, out duration);
TIMEOUT, out _);
if(!sense && !dev.Error)
{
mediaTest.SupportsReadLong = true;
@@ -586,7 +586,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
else if(mediaTest.BlockSize == 8192)
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 9424,
timeout, out duration);
TIMEOUT, out _);
if(!sense && !dev.Error)
{
mediaTest.SupportsReadLong = true;
@@ -608,11 +608,11 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(pressedKey.Key == ConsoleKey.Y)
{
for(ushort i = (ushort)mediaTest.BlockSize; true; i++)
for(ushort i = (ushort)mediaTest.BlockSize; ; i++)
{
DicConsole.Write("\rTrying to READ LONG with a size of {0} bytes...", i);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, i,
timeout, out duration);
TIMEOUT, out _);
if(!sense)
{
mediaTest.LongBlockSize = i;
@@ -631,7 +631,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.LongBlockSize != mediaTest.BlockSize)
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0,
(ushort)mediaTest.LongBlockSize, timeout, out duration);
(ushort)mediaTest.LongBlockSize, TIMEOUT, out _);
if(!sense)
DataFile.WriteTo("SCSI Report", "readlong10",
"_debug_" + mediaTest.MediumTypeName + ".bin", "read results",
@@ -641,7 +641,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.CanReadMediaSerialSpecified = true;
DicConsole.WriteLine("Trying SCSI READ MEDIA SERIAL NUMBER...");
mediaTest.CanReadMediaSerial =
!dev.ReadMediaSerialNumber(out buffer, out senseBuffer, timeout, out duration);
!dev.ReadMediaSerialNumber(out buffer, out senseBuffer, TIMEOUT, out _);
}
mediaTests.Add(mediaTest);
@@ -659,7 +659,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
report.SCSI.ReadCapabilities.SupportsReadCapacity16Specified = true;
DicConsole.WriteLine("Querying SCSI READ CAPACITY...");
sense = dev.ReadCapacity(out buffer, out senseBuffer, timeout, out duration);
sense = dev.ReadCapacity(out buffer, out senseBuffer, TIMEOUT, out _);
if(!sense && !dev.Error)
{
report.SCSI.ReadCapabilities.SupportsReadCapacity = true;
@@ -672,7 +672,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
sense = dev.ReadCapacity16(out buffer, out buffer, timeout, out duration);
sense = dev.ReadCapacity16(out buffer, out buffer, TIMEOUT, out _);
if(!sense && !dev.Error)
{
report.SCSI.ReadCapabilities.SupportsReadCapacity16 = true;
@@ -690,7 +690,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
sense = dev.ModeSense10(out buffer, out senseBuffer, false, true, ScsiModeSensePageControl.Current,
0x3F, 0x00, timeout, out duration);
0x3F, 0x00, TIMEOUT, out _);
if(!sense && !dev.Error)
{
report.SCSI.SupportsModeSense10 = true;
@@ -699,7 +699,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
sense = dev.ModeSense(out buffer, out senseBuffer, timeout, out duration);
sense = dev.ModeSense(out buffer, out senseBuffer, TIMEOUT, out _);
if(!sense && !dev.Error)
{
report.SCSI.SupportsModeSense6 = true;
@@ -729,7 +729,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying SCSI READ (6)...");
report.SCSI.ReadCapabilities.SupportsRead = !dev.Read6(out buffer, out senseBuffer, 0,
report.SCSI.ReadCapabilities.BlockSize,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !report.SCSI.ReadCapabilities.SupportsRead);
if(debug)
DataFile.WriteTo("SCSI Report", "read6",
@@ -739,7 +739,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying SCSI READ (10)...");
report.SCSI.ReadCapabilities.SupportsRead10 =
!dev.Read10(out buffer, out senseBuffer, 0, false, true, false, false, 0,
report.SCSI.ReadCapabilities.BlockSize, 0, 1, timeout, out duration);
report.SCSI.ReadCapabilities.BlockSize, 0, 1, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!report.SCSI.ReadCapabilities.SupportsRead10);
if(debug)
@@ -750,7 +750,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying SCSI READ (12)...");
report.SCSI.ReadCapabilities.SupportsRead12 =
!dev.Read12(out buffer, out senseBuffer, 0, false, true, false, false, 0,
report.SCSI.ReadCapabilities.BlockSize, 0, 1, false, timeout, out duration);
report.SCSI.ReadCapabilities.BlockSize, 0, 1, false, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!report.SCSI.ReadCapabilities.SupportsRead12);
if(debug)
@@ -761,7 +761,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying SCSI READ (16)...");
report.SCSI.ReadCapabilities.SupportsRead16 =
!dev.Read16(out buffer, out senseBuffer, 0, false, true, false, 0,
report.SCSI.ReadCapabilities.BlockSize, 0, 1, false, timeout, out duration);
report.SCSI.ReadCapabilities.BlockSize, 0, 1, false, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!report.SCSI.ReadCapabilities.SupportsRead16);
if(debug)
@@ -771,7 +771,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
report.SCSI.ReadCapabilities.LongBlockSize = report.SCSI.ReadCapabilities.BlockSize;
DicConsole.WriteLine("Trying SCSI READ LONG (10)...");
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, timeout, out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, TIMEOUT, out _);
if(sense && !dev.Error)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
@@ -802,8 +802,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
600, 610, 630
})
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, testSize, timeout,
out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, testSize, TIMEOUT,
out _);
if(sense || dev.Error) continue;
report.SCSI.ReadCapabilities.SupportsReadLong = true;
@@ -820,8 +820,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
1200
})
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, testSize, timeout,
out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, testSize, TIMEOUT,
out _);
if(sense || dev.Error) continue;
report.SCSI.ReadCapabilities.SupportsReadLong = true;
@@ -831,8 +831,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
else if(report.SCSI.ReadCapabilities.BlockSize == 2048)
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 2380, timeout,
out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 2380, TIMEOUT,
out _);
if(!sense && !dev.Error)
{
report.SCSI.ReadCapabilities.SupportsReadLong = true;
@@ -842,8 +842,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
else if(report.SCSI.ReadCapabilities.BlockSize == 4096)
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 4760, timeout,
out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 4760, TIMEOUT,
out _);
if(!sense && !dev.Error)
{
report.SCSI.ReadCapabilities.SupportsReadLong = true;
@@ -853,8 +853,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
else if(report.SCSI.ReadCapabilities.BlockSize == 8192)
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 9424, timeout,
out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 9424, TIMEOUT,
out _);
if(!sense && !dev.Error)
{
report.SCSI.ReadCapabilities.SupportsReadLong = true;
@@ -877,11 +877,11 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(pressedKey.Key == ConsoleKey.Y)
{
for(ushort i = (ushort)report.SCSI.ReadCapabilities.BlockSize; true; i++)
for(ushort i = (ushort)report.SCSI.ReadCapabilities.BlockSize; ; i++)
{
DicConsole.Write("\rTrying to READ LONG with a size of {0} bytes...", i);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, i, timeout,
out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, i, TIMEOUT,
out _);
if(!sense)
{
if(debug)
@@ -909,8 +909,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
report.SCSI.ReadCapabilities.LongBlockSize != report.SCSI.ReadCapabilities.BlockSize)
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0,
(ushort)report.SCSI.ReadCapabilities.LongBlockSize, timeout,
out duration);
(ushort)report.SCSI.ReadCapabilities.LongBlockSize, TIMEOUT,
out _);
if(!sense)
DataFile.WriteTo("SCSI Report", "readlong10",
"_debug_" + report.SCSI.Inquiry.ProductIdentification + ".bin",

View File

@@ -50,13 +50,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
if(report == null) return;
byte[] senseBuffer;
byte[] buffer;
double duration;
bool sense;
uint timeout = 5;
ConsoleKeyInfo pressedKey;
Modes.DecodedMode? decMode;
const uint TIMEOUT = 5;
report.SCSI.MultiMediaDevice = new mmcType();
@@ -163,7 +158,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying MMC GET CONFIGURATION...");
sense = dev.GetConfiguration(out buffer, out senseBuffer, timeout, out duration);
sense = dev.GetConfiguration(out byte[] buffer, out byte[] senseBuffer, TIMEOUT, out _);
if(!sense)
{
@@ -558,35 +553,32 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
Features.Decode_010C(desc.Data);
if(ftr010C.HasValue)
{
string syear, smonth, sday, shour, sminute, ssecond;
byte[] temp;
temp = new byte[4];
byte[] temp = new byte[4];
temp[0] = (byte)((ftr010C.Value.Century & 0xFF00) >> 8);
temp[1] = (byte)(ftr010C.Value.Century & 0xFF);
temp[2] = (byte)((ftr010C.Value.Year & 0xFF00) >> 8);
temp[3] = (byte)(ftr010C.Value.Year & 0xFF);
syear = Encoding.ASCII.GetString(temp);
string syear = Encoding.ASCII.GetString(temp);
temp = new byte[2];
temp[0] = (byte)((ftr010C.Value.Month & 0xFF00) >> 8);
temp[1] = (byte)(ftr010C.Value.Month & 0xFF);
smonth = Encoding.ASCII.GetString(temp);
string smonth = Encoding.ASCII.GetString(temp);
temp = new byte[2];
temp[0] = (byte)((ftr010C.Value.Day & 0xFF00) >> 8);
temp[1] = (byte)(ftr010C.Value.Day & 0xFF);
sday = Encoding.ASCII.GetString(temp);
string sday = Encoding.ASCII.GetString(temp);
temp = new byte[2];
temp[0] = (byte)((ftr010C.Value.Hour & 0xFF00) >> 8);
temp[1] = (byte)(ftr010C.Value.Hour & 0xFF);
shour = Encoding.ASCII.GetString(temp);
string shour = Encoding.ASCII.GetString(temp);
temp = new byte[2];
temp[0] = (byte)((ftr010C.Value.Minute & 0xFF00) >> 8);
temp[1] = (byte)(ftr010C.Value.Minute & 0xFF);
sminute = Encoding.ASCII.GetString(temp);
string sminute = Encoding.ASCII.GetString(temp);
temp = new byte[2];
temp[0] = (byte)((ftr010C.Value.Second & 0xFF00) >> 8);
temp[1] = (byte)(ftr010C.Value.Second & 0xFF);
ssecond = Encoding.ASCII.GetString(temp);
string ssecond = Encoding.ASCII.GetString(temp);
try
{
@@ -598,7 +590,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
report.SCSI.MultiMediaDevice.Features.FirmwareDateSpecified = true;
}
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
catch { }
catch { // ignored
}
#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
}
}
@@ -737,7 +730,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
List<testedMediaType> mediaTests = new List<testedMediaType>();
foreach(string mediaType in mediaTypes)
{
pressedKey = new ConsoleKeyInfo();
ConsoleKeyInfo pressedKey = new ConsoleKeyInfo();
while(pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)
{
DicConsole.Write("Do you have a {0} disc that you can insert in the drive? (Y/N): ", mediaType);
@@ -747,16 +740,15 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(pressedKey.Key == ConsoleKey.Y)
{
dev.AllowMediumRemoval(out senseBuffer, timeout, out duration);
dev.EjectTray(out senseBuffer, timeout, out duration);
dev.AllowMediumRemoval(out senseBuffer, TIMEOUT, out _);
dev.EjectTray(out senseBuffer, TIMEOUT, out _);
DicConsole.WriteLine("Please insert it in the drive and press any key when it is ready.");
System.Console.ReadKey(true);
testedMediaType mediaTest = new testedMediaType();
mediaTest.MediumTypeName = mediaType;
mediaTest.MediaIsRecognized = true;
testedMediaType mediaTest =
new testedMediaType {MediumTypeName = mediaType, MediaIsRecognized = true};
sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _);
if(sense)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
@@ -768,7 +760,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
DicConsole.Write("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _);
if(!sense) break;
leftRetries--;
@@ -783,7 +775,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
DicConsole.Write("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _);
if(!sense) break;
leftRetries--;
@@ -799,7 +791,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
DicConsole.Write("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _);
if(!sense) break;
leftRetries--;
@@ -817,7 +809,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.SupportsReadCapacity16Specified = true;
DicConsole.WriteLine("Querying SCSI READ CAPACITY...");
sense = dev.ReadCapacity(out buffer, out senseBuffer, timeout, out duration);
sense = dev.ReadCapacity(out buffer, out senseBuffer, TIMEOUT, out _);
if(!sense && !dev.Error)
{
mediaTest.SupportsReadCapacity = true;
@@ -830,7 +822,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
sense = dev.ReadCapacity16(out buffer, out buffer, timeout, out duration);
sense = dev.ReadCapacity16(out buffer, out buffer, TIMEOUT, out _);
if(!sense && !dev.Error)
{
mediaTest.SupportsReadCapacity16 = true;
@@ -844,11 +836,11 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.BlockSizeSpecified = true;
}
decMode = null;
Modes.DecodedMode? decMode = null;
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
sense = dev.ModeSense10(out buffer, out senseBuffer, false, true,
ScsiModeSensePageControl.Current, 0x3F, 0x00, timeout, out duration);
ScsiModeSensePageControl.Current, 0x3F, 0x00, TIMEOUT, out _);
if(!sense && !dev.Error)
{
report.SCSI.SupportsModeSense10 = true;
@@ -856,7 +848,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(debug) mediaTest.ModeSense10Data = buffer;
}
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
sense = dev.ModeSense(out buffer, out senseBuffer, timeout, out duration);
sense = dev.ModeSense(out buffer, out senseBuffer, TIMEOUT, out _);
if(!sense && !dev.Error)
{
report.SCSI.SupportsModeSense6 = true;
@@ -883,7 +875,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.CanReadFullTOCSpecified = true;
DicConsole.WriteLine("Querying CD TOC...");
mediaTest.CanReadTOC =
!dev.ReadTocPmaAtip(out buffer, out senseBuffer, false, 0, 0, timeout, out duration);
!dev.ReadTocPmaAtip(out buffer, out senseBuffer, false, 0, 0, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadTOC);
if(debug)
DataFile.WriteTo("SCSI Report", "readtoc",
@@ -892,7 +884,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying CD Full TOC...");
mediaTest.CanReadFullTOC =
!dev.ReadRawToc(out buffer, out senseBuffer, 1, timeout, out duration);
!dev.ReadRawToc(out buffer, out senseBuffer, 1, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadFullTOC);
if(debug)
DataFile.WriteTo("SCSI Report", "readfulltoc",
@@ -906,14 +898,14 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.CanReadATIPSpecified = true;
mediaTest.CanReadPMASpecified = true;
DicConsole.WriteLine("Querying CD ATIP...");
mediaTest.CanReadATIP = !dev.ReadAtip(out buffer, out senseBuffer, timeout, out duration);
mediaTest.CanReadATIP = !dev.ReadAtip(out buffer, out senseBuffer, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadATIP);
if(debug)
DataFile.WriteTo("SCSI Report", "atip",
"_debug_" + report.SCSI.Inquiry.ProductIdentification + "_" +
mediaType + ".bin", "read results", buffer);
DicConsole.WriteLine("Querying CD PMA...");
mediaTest.CanReadPMA = !dev.ReadPma(out buffer, out senseBuffer, timeout, out duration);
mediaTest.CanReadPMA = !dev.ReadPma(out buffer, out senseBuffer, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPMA);
if(debug)
DataFile.WriteTo("SCSI Report", "pma",
@@ -929,8 +921,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD PFI...");
mediaTest.CanReadPFI =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PhysicalInformation, 0, timeout,
out duration);
MmcDiscStructureFormat.PhysicalInformation, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPFI);
if(debug)
DataFile.WriteTo("SCSI Report", "pfi",
@@ -939,8 +931,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD DMI...");
mediaTest.CanReadDMI =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DiscManufacturingInformation, 0, timeout,
out duration);
MmcDiscStructureFormat.DiscManufacturingInformation, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDMI);
if(debug)
DataFile.WriteTo("SCSI Report", "dmi",
@@ -954,8 +946,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD CMI...");
mediaTest.CanReadCMI =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.CopyrightInformation, 0, timeout,
out duration);
MmcDiscStructureFormat.CopyrightInformation, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCMI);
if(debug)
DataFile.WriteTo("SCSI Report", "cmi",
@@ -970,8 +962,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD BCA...");
mediaTest.CanReadBCA =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.BurstCuttingArea, 0, timeout,
out duration);
MmcDiscStructureFormat.BurstCuttingArea, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
if(debug)
DataFile.WriteTo("SCSI Report", "bca",
@@ -981,7 +973,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD AACS...");
mediaTest.CanReadAACS =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdAacs, 0, timeout, out duration);
MmcDiscStructureFormat.DvdAacs, 0, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadAACS);
if(debug)
DataFile.WriteTo("SCSI Report", "aacs",
@@ -993,8 +985,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying BD BCA...");
mediaTest.CanReadBCA =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdBurstCuttingArea, 0, timeout,
out duration);
MmcDiscStructureFormat.BdBurstCuttingArea, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
if(debug)
DataFile.WriteTo("SCSI Report", "bdbca",
@@ -1007,7 +999,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.CanReadSpareAreaInformationSpecified = true;
mediaTest.CanReadDDS =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdramDds, 0, timeout, out duration);
MmcDiscStructureFormat.DvdramDds, 0, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDDS);
if(debug)
DataFile.WriteTo("SCSI Report", "dds",
@@ -1015,8 +1007,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaType + ".bin", "read results", buffer);
mediaTest.CanReadSpareAreaInformation =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdramSpareAreaInformation, 0, timeout,
out duration);
MmcDiscStructureFormat.DvdramSpareAreaInformation, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadSpareAreaInformation);
if(debug)
@@ -1033,7 +1025,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying BD DDS...");
mediaTest.CanReadDDS =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdDds, 0, timeout, out duration);
MmcDiscStructureFormat.BdDds, 0, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDDS);
if(debug)
DataFile.WriteTo("SCSI Report", "bddds",
@@ -1042,8 +1034,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying BD SAI...");
mediaTest.CanReadSpareAreaInformation =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdSpareAreaInformation, 0, timeout,
out duration);
MmcDiscStructureFormat.BdSpareAreaInformation, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadSpareAreaInformation);
if(debug)
@@ -1058,8 +1050,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD PRI...");
mediaTest.CanReadPRI =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.PreRecordedInfo, 0, timeout,
out duration);
MmcDiscStructureFormat.PreRecordedInfo, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPRI);
if(debug)
DataFile.WriteTo("SCSI Report", "pri",
@@ -1074,8 +1066,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD Media ID...");
mediaTest.CanReadMediaID =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdrMediaIdentifier, 0, timeout,
out duration);
MmcDiscStructureFormat.DvdrMediaIdentifier, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadMediaID);
if(debug)
DataFile.WriteTo("SCSI Report", "mediaid",
@@ -1084,8 +1076,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD Embossed PFI...");
mediaTest.CanReadRecordablePFI =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdrPhysicalInformation, 0, timeout,
out duration);
MmcDiscStructureFormat.DvdrPhysicalInformation, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRecordablePFI);
if(debug)
DataFile.WriteTo("SCSI Report", "epfi",
@@ -1100,7 +1092,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD ADIP...");
mediaTest.CanReadADIP =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.Adip, 0, timeout, out duration);
MmcDiscStructureFormat.Adip, 0, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadADIP);
if(debug)
DataFile.WriteTo("SCSI Report", "adip",
@@ -1109,7 +1101,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD DCB...");
mediaTest.CanReadDCB =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.Dcb, 0, timeout, out duration);
MmcDiscStructureFormat.Dcb, 0, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDCB);
if(debug)
DataFile.WriteTo("SCSI Report", "dcb",
@@ -1123,8 +1115,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying HD DVD CMI...");
mediaTest.CanReadHDCMI =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.HddvdCopyrightInformation, 0, timeout,
out duration);
MmcDiscStructureFormat.HddvdCopyrightInformation, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadHDCMI);
if(debug)
DataFile.WriteTo("SCSI Report", "hdcmi",
@@ -1138,8 +1130,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying DVD Layer Capacity...");
mediaTest.CanReadLayerCapacity =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Dvd, 0, 0,
MmcDiscStructureFormat.DvdrLayerCapacity, 0, timeout,
out duration);
MmcDiscStructureFormat.DvdrLayerCapacity, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadLayerCapacity);
if(debug)
DataFile.WriteTo("SCSI Report", "layer",
@@ -1154,8 +1146,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying BD Disc Information...");
mediaTest.CanReadDiscInformation =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.DiscInformation, 0, timeout,
out duration);
MmcDiscStructureFormat.DiscInformation, 0, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDiscInformation);
if(debug)
DataFile.WriteTo("SCSI Report", "di",
@@ -1164,7 +1156,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Querying BD PAC...");
mediaTest.CanReadPAC =
!dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.Pac, 0, timeout, out duration);
MmcDiscStructureFormat.Pac, 0, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPAC);
if(debug)
DataFile.WriteTo("SCSI Report", "pac",
@@ -1179,7 +1171,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying SCSI READ (6)...");
mediaTest.SupportsRead =
!dev.Read6(out buffer, out senseBuffer, 0, 2048, timeout, out duration);
!dev.Read6(out buffer, out senseBuffer, 0, 2048, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead);
if(debug)
DataFile.WriteTo("SCSI Report", "read6",
@@ -1187,7 +1179,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
".bin", "read results", buffer);
DicConsole.WriteLine("Trying SCSI READ (10)...");
mediaTest.SupportsRead10 = !dev.Read10(out buffer, out senseBuffer, 0, false, true, false,
false, 0, 2048, 0, 1, timeout, out duration);
false, 0, 2048, 0, 1, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
if(debug)
DataFile.WriteTo("SCSI Report", "read10",
@@ -1195,7 +1187,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
".bin", "read results", buffer);
DicConsole.WriteLine("Trying SCSI READ (12)...");
mediaTest.SupportsRead12 = !dev.Read12(out buffer, out senseBuffer, 0, false, true, false,
false, 0, 2048, 0, 1, false, timeout, out duration);
false, 0, 2048, 0, 1, false, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
if(debug)
DataFile.WriteTo("SCSI Report", "read12",
@@ -1203,7 +1195,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
".bin", "read results", buffer);
DicConsole.WriteLine("Trying SCSI READ (16)...");
mediaTest.SupportsRead16 = !dev.Read16(out buffer, out senseBuffer, 0, false, true, false, 0,
2048, 0, 1, false, timeout, out duration);
2048, 0, 1, false, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
if(debug)
DataFile.WriteTo("SCSI Report", "read16",
@@ -1248,8 +1240,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.SupportsReadCd = !dev.ReadCd(out buffer, out senseBuffer, 0, 2352, 1,
MmcSectorTypes.Cdda, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.None, MmcSubchannel.None, timeout,
out duration);
MmcErrorField.None, MmcSubchannel.None, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCd);
if(debug)
DataFile.WriteTo("SCSI Report", "readcd",
@@ -1260,7 +1252,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
0x00000201, 2352, MmcSectorTypes.Cdda,
false, false, MmcHeaderCodes.None, true,
false, MmcErrorField.None,
MmcSubchannel.None, timeout, out duration);
MmcSubchannel.None, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsf);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdmsf",
@@ -1273,8 +1265,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.SupportsReadCd = !dev.ReadCd(out buffer, out senseBuffer, 0, 2048, 1,
MmcSectorTypes.AllTypes, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.None, MmcSubchannel.None, timeout,
out duration);
MmcErrorField.None, MmcSubchannel.None, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCd);
if(debug)
DataFile.WriteTo("SCSI Report", "readcd",
@@ -1285,7 +1277,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
0x00000201, 2048, MmcSectorTypes.AllTypes,
false, false, MmcHeaderCodes.None, true,
false, MmcErrorField.None,
MmcSubchannel.None, timeout, out duration);
MmcSubchannel.None, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsf);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdmsf",
@@ -1296,7 +1288,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.None,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdRaw);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdraw",
@@ -1308,7 +1300,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.AllTypes, false, false,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.None,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.SupportsReadCdMsfRaw);
if(debug)
@@ -1326,12 +1318,12 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
sense = dev.ReadCd(out buffer, out senseBuffer, (uint)i, 2352, 1,
MmcSectorTypes.Cdda, false, false, false,
MmcHeaderCodes.None, true, false, MmcErrorField.None,
MmcSubchannel.None, timeout, out duration);
MmcSubchannel.None, TIMEOUT, out _);
else
sense = dev.ReadCd(out buffer, out senseBuffer, (uint)i, 2352, 1,
MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
MmcSubchannel.None, timeout, out duration);
MmcSubchannel.None, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", sense);
if(debug)
DataFile.WriteTo("SCSI Report", "leadin",
@@ -1350,14 +1342,14 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.Cdda, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.None, MmcSubchannel.None,
timeout, out duration);
TIMEOUT, out _);
else
mediaTest.CanReadLeadOut = !dev.ReadCd(out buffer, out senseBuffer,
(uint)(mediaTest.Blocks + 1), 2352, 1,
MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.None,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadLeadOut);
if(debug)
DataFile.WriteTo("SCSI Report", "leadout",
@@ -1372,14 +1364,14 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.Cdda, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.C2Pointers, MmcSubchannel.None,
timeout, out duration);
TIMEOUT, out _);
if(!mediaTest.CanReadC2Pointers)
mediaTest.CanReadC2Pointers = !dev.ReadCd(out buffer, out senseBuffer, 0, 2648, 1,
MmcSectorTypes.Cdda, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.None, timeout,
out duration);
MmcSubchannel.None, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadC2Pointers);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdc2",
@@ -1391,7 +1383,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.Cdda, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.None, MmcSubchannel.Q16,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdpq",
@@ -1401,7 +1393,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.Cdda, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.None, MmcSubchannel.Raw,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannel);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdrw",
@@ -1411,8 +1403,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
1, MmcSectorTypes.Cdda, false, false,
false, MmcHeaderCodes.None, true,
false, MmcErrorField.None,
MmcSubchannel.Rw, timeout,
out duration);
MmcSubchannel.Rw, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadCorrectedSubchannel);
if(debug)
@@ -1425,16 +1417,16 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
1, MmcSectorTypes.Cdda, false, false,
false, MmcHeaderCodes.None, true,
false, MmcErrorField.C2Pointers,
MmcSubchannel.Q16, timeout,
out duration);
MmcSubchannel.Q16, TIMEOUT,
out _);
if(!mediaTest.CanReadPQSubchannelWithC2)
mediaTest.CanReadPQSubchannelWithC2 = !dev.ReadCd(out buffer, out senseBuffer, 0,
2664, 1, MmcSectorTypes.Cdda,
false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.Q16, timeout,
out duration);
MmcSubchannel.Q16, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadPQSubchannelWithC2);
if(debug)
@@ -1446,16 +1438,16 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
1, MmcSectorTypes.Cdda, false, false,
false, MmcHeaderCodes.None, true,
false, MmcErrorField.C2Pointers,
MmcSubchannel.Raw, timeout,
out duration);
MmcSubchannel.Raw, TIMEOUT,
out _);
if(!mediaTest.CanReadRWSubchannelWithC2)
mediaTest.CanReadRWSubchannelWithC2 = !dev.ReadCd(out buffer, out senseBuffer, 0,
2714, 1, MmcSectorTypes.Cdda,
false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.Raw, timeout,
out duration);
MmcSubchannel.Raw, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadRWSubchannelWithC2);
if(debug)
@@ -1469,14 +1461,14 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcHeaderCodes.None, true,
false,
MmcErrorField.C2Pointers,
MmcSubchannel.Rw, timeout,
out duration);
MmcSubchannel.Rw, TIMEOUT,
out _);
if(!mediaTest.CanReadCorrectedSubchannelWithC2)
mediaTest.CanReadCorrectedSubchannelWithC2 =
!dev.ReadCd(out buffer, out senseBuffer, 0, 2714, 1, MmcSectorTypes.Cdda, false,
false, false, MmcHeaderCodes.None, true, false,
MmcErrorField.C2PointersAndBlock, MmcSubchannel.Rw, timeout,
out duration);
MmcErrorField.C2PointersAndBlock, MmcSubchannel.Rw, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadCorrectedSubchannelWithC2);
if(debug)
@@ -1491,14 +1483,14 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.C2Pointers, MmcSubchannel.None,
timeout, out duration);
TIMEOUT, out _);
if(!mediaTest.CanReadC2Pointers)
mediaTest.CanReadC2Pointers = !dev.ReadCd(out buffer, out senseBuffer, 0, 2648, 1,
MmcSectorTypes.AllTypes, false, false,
true, MmcHeaderCodes.AllHeaders, true,
true, MmcErrorField.C2PointersAndBlock,
MmcSubchannel.None, timeout,
out duration);
MmcSubchannel.None, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadC2Pointers);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdc2",
@@ -1510,7 +1502,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.Q16,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdpq",
@@ -1520,7 +1512,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.Raw,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannel);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdrw",
@@ -1531,8 +1523,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
false, true,
MmcHeaderCodes.AllHeaders, true,
true, MmcErrorField.None,
MmcSubchannel.Rw, timeout,
out duration);
MmcSubchannel.Rw, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadCorrectedSubchannel);
if(debug)
@@ -1546,8 +1538,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
false, true,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.C2Pointers,
MmcSubchannel.Q16, timeout,
out duration);
MmcSubchannel.Q16, TIMEOUT,
out _);
if(!mediaTest.CanReadPQSubchannelWithC2)
mediaTest.CanReadPQSubchannelWithC2 = !dev.ReadCd(out buffer, out senseBuffer, 0,
2664, 1, MmcSectorTypes.AllTypes,
@@ -1555,8 +1547,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcHeaderCodes.AllHeaders, true,
true,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.Q16, timeout,
out duration);
MmcSubchannel.Q16, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadPQSubchannelWithC2);
if(debug)
@@ -1569,8 +1561,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
false, true,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.C2Pointers,
MmcSubchannel.Raw, timeout,
out duration);
MmcSubchannel.Raw, TIMEOUT,
out _);
if(!mediaTest.CanReadRWSubchannelWithC2)
mediaTest.CanReadRWSubchannelWithC2 = !dev.ReadCd(out buffer, out senseBuffer, 0,
2714, 1, MmcSectorTypes.AllTypes,
@@ -1578,8 +1570,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcHeaderCodes.AllHeaders, true,
true,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.Raw, timeout,
out duration);
MmcSubchannel.Raw, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadRWSubchannelWithC2);
if(debug)
@@ -1594,14 +1586,14 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcHeaderCodes.AllHeaders,
true, true,
MmcErrorField.C2Pointers,
MmcSubchannel.Rw, timeout,
out duration);
MmcSubchannel.Rw, TIMEOUT,
out _);
if(!mediaTest.CanReadCorrectedSubchannelWithC2)
mediaTest.CanReadCorrectedSubchannelWithC2 =
!dev.ReadCd(out buffer, out senseBuffer, 0, 2714, 1, MmcSectorTypes.AllTypes,
false, false, true, MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.C2PointersAndBlock, MmcSubchannel.Rw, timeout,
out duration);
MmcErrorField.C2PointersAndBlock, MmcSubchannel.Rw, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadCorrectedSubchannelWithC2);
if(debug)
@@ -1616,14 +1608,14 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.AllTypes, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.C2Pointers, MmcSubchannel.None,
timeout, out duration);
TIMEOUT, out _);
if(!mediaTest.CanReadC2Pointers)
mediaTest.CanReadC2Pointers = !dev.ReadCd(out buffer, out senseBuffer, 0, 2344, 1,
MmcSectorTypes.AllTypes, false, false,
false, MmcHeaderCodes.None, true, false,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.None, timeout,
out duration);
MmcSubchannel.None, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadC2Pointers);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdc2",
@@ -1635,7 +1627,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.AllTypes, false, false,
false, MmcHeaderCodes.None, true, false,
MmcErrorField.None, MmcSubchannel.Q16,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdpq",
@@ -1645,7 +1637,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcSectorTypes.AllTypes, false, false,
false, MmcHeaderCodes.None, true, false,
MmcErrorField.None, MmcSubchannel.Raw,
timeout, out duration);
TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannel);
if(debug)
DataFile.WriteTo("SCSI Report", "readcdrw",
@@ -1655,8 +1647,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
1, MmcSectorTypes.AllTypes, false,
false, false, MmcHeaderCodes.None,
true, false, MmcErrorField.None,
MmcSubchannel.Rw, timeout,
out duration);
MmcSubchannel.Rw, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadCorrectedSubchannel);
if(debug)
@@ -1669,16 +1661,16 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
1, MmcSectorTypes.AllTypes, false,
false, false, MmcHeaderCodes.None,
true, false, MmcErrorField.C2Pointers,
MmcSubchannel.Q16, timeout,
out duration);
MmcSubchannel.Q16, TIMEOUT,
out _);
if(!mediaTest.CanReadPQSubchannelWithC2)
mediaTest.CanReadPQSubchannelWithC2 = !dev.ReadCd(out buffer, out senseBuffer, 0,
2360, 1, MmcSectorTypes.AllTypes,
false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.Q16, timeout,
out duration);
MmcSubchannel.Q16, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadPQSubchannelWithC2);
if(debug)
@@ -1690,16 +1682,16 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
1, MmcSectorTypes.AllTypes, false,
false, false, MmcHeaderCodes.None,
true, false, MmcErrorField.C2Pointers,
MmcSubchannel.Raw, timeout,
out duration);
MmcSubchannel.Raw, TIMEOUT,
out _);
if(!mediaTest.CanReadRWSubchannelWithC2)
mediaTest.CanReadRWSubchannelWithC2 = !dev.ReadCd(out buffer, out senseBuffer, 0,
2440, 1, MmcSectorTypes.AllTypes,
false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.Raw, timeout,
out duration);
MmcSubchannel.Raw, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadRWSubchannelWithC2);
if(debug)
@@ -1714,14 +1706,14 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
MmcHeaderCodes.None, true,
false,
MmcErrorField.C2Pointers,
MmcSubchannel.Rw, timeout,
out duration);
MmcSubchannel.Rw, TIMEOUT,
out _);
if(!mediaTest.CanReadCorrectedSubchannelWithC2)
mediaTest.CanReadCorrectedSubchannelWithC2 =
!dev.ReadCd(out buffer, out senseBuffer, 0, 2440, 1, MmcSectorTypes.AllTypes,
false, false, false, MmcHeaderCodes.None, true, false,
MmcErrorField.C2PointersAndBlock, MmcSubchannel.Rw, timeout,
out duration);
MmcErrorField.C2PointersAndBlock, MmcSubchannel.Rw, TIMEOUT,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadCorrectedSubchannelWithC2);
if(debug)
@@ -1767,7 +1759,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying Plextor READ CD-DA...");
mediaTest.SupportsPlextorReadCDDA =
!dev.PlextorReadCdDa(out buffer, out senseBuffer, 0, 2352, 1,
PlextorSubchannel.None, timeout, out duration);
PlextorSubchannel.None, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.SupportsPlextorReadCDDA);
if(debug)
@@ -1783,7 +1775,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying Pioneer READ CD-DA...");
mediaTest.SupportsPioneerReadCDDA =
!dev.PioneerReadCdDa(out buffer, out senseBuffer, 0, 2352, 1,
PioneerSubchannel.None, timeout, out duration);
PioneerSubchannel.None, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.SupportsPioneerReadCDDA);
if(debug)
@@ -1793,7 +1785,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
DicConsole.WriteLine("Trying Pioneer READ CD-DA MSF...");
mediaTest.SupportsPioneerReadCDDAMSF =
!dev.PioneerReadCdDaMsf(out buffer, out senseBuffer, 0x00000200, 0x00000201, 2352,
PioneerSubchannel.None, timeout, out duration);
PioneerSubchannel.None, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.SupportsPioneerReadCDDAMSF);
if(debug)
@@ -1807,7 +1799,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.SupportsNECReadCDDASpecified = true;
DicConsole.WriteLine("Trying NEC READ CD-DA...");
mediaTest.SupportsNECReadCDDA =
!dev.NecReadCdDa(out buffer, out senseBuffer, 0, 1, timeout, out duration);
!dev.NecReadCdDa(out buffer, out senseBuffer, 0, 1, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsNECReadCDDA);
if(debug)
DataFile.WriteTo("SCSI Report", "necreadcdda",
@@ -1818,8 +1810,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.LongBlockSize = mediaTest.BlockSize;
DicConsole.WriteLine("Trying SCSI READ LONG (10)...");
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, timeout,
out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, TIMEOUT,
out _);
if(sense && !dev.Error)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
@@ -1854,8 +1846,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(mediaTest.SupportsReadLong && mediaTest.LongBlockSize == mediaTest.BlockSize)
{
// DVDs
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 37856, timeout,
out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 37856, TIMEOUT,
out _);
if(!sense && !dev.Error)
{
mediaTest.SupportsReadLong = true;
@@ -1869,7 +1861,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.SupportsPlextorReadRawDVDSpecified = true;
DicConsole.WriteLine("Trying Plextor trick to raw read DVDs...");
mediaTest.SupportsPlextorReadRawDVD =
!dev.PlextorReadRawDvd(out buffer, out senseBuffer, 0, 1, timeout, out duration);
!dev.PlextorReadRawDvd(out buffer, out senseBuffer, 0, 1, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.SupportsPlextorReadRawDVD);
if(debug)
@@ -1885,7 +1877,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.SupportsHLDTSTReadRawDVDSpecified = true;
DicConsole.WriteLine("Trying HL-DT-ST (aka LG) trick to raw read DVDs...");
mediaTest.SupportsHLDTSTReadRawDVD =
!dev.HlDtStReadRawDvd(out buffer, out senseBuffer, 0, 1, timeout, out duration);
!dev.HlDtStReadRawDvd(out buffer, out senseBuffer, 0, 1, TIMEOUT, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.SupportsHLDTSTReadRawDVD);
if(debug)
@@ -1907,11 +1899,11 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(pressedKey.Key == ConsoleKey.Y)
{
for(ushort i = (ushort)mediaTest.BlockSize; true; i++)
for(ushort i = (ushort)mediaTest.BlockSize; ; i++)
{
DicConsole.Write("\rTrying to READ LONG with a size of {0} bytes...", i);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, i, timeout,
out duration);
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, i, TIMEOUT,
out _);
if(!sense)
{
if(debug)
@@ -1938,7 +1930,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
mediaTest.LongBlockSize != mediaTest.BlockSize)
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0,
(ushort)mediaTest.LongBlockSize, timeout, out duration);
(ushort)mediaTest.LongBlockSize, TIMEOUT, out _);
if(!sense)
DataFile.WriteTo("SCSI Report", "readlong10",
"_debug_" + report.SCSI.Inquiry.ProductIdentification + "_" +

View File

@@ -47,17 +47,13 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
if(report == null) return;
byte[] senseBuffer;
byte[] buffer;
double duration;
bool sense;
uint timeout = 5;
const uint TIMEOUT = 5;
ConsoleKeyInfo pressedKey;
Modes.DecodedMode? decMode;
report.SCSI.SequentialDevice = new sscType();
DicConsole.WriteLine("Querying SCSI READ BLOCK LIMITS...");
sense = dev.ReadBlockLimits(out buffer, out senseBuffer, timeout, out duration);
sense = dev.ReadBlockLimits(out byte[] buffer, out byte[] senseBuffer, TIMEOUT, out _);
if(!sense)
{
BlockLimits.BlockLimitsData? decBl = BlockLimits.Decode(buffer);
@@ -82,7 +78,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT...");
sense = dev.ReportDensitySupport(out buffer, out senseBuffer, false, false, timeout, out duration);
sense = dev.ReportDensitySupport(out buffer, out senseBuffer, false, false, TIMEOUT, out _);
if(!sense)
{
DensitySupport.DensitySupportHeader? dsh =
@@ -116,7 +112,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for medium types...");
sense = dev.ReportDensitySupport(out buffer, out senseBuffer, true, false, timeout, out duration);
sense = dev.ReportDensitySupport(out buffer, out senseBuffer, true, false, TIMEOUT, out _);
if(!sense)
{
DensitySupport.MediaTypeSupportHeader? mtsh =
@@ -175,8 +171,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
seqTest.MediaIsRecognized = true;
dev.Load(out senseBuffer, timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration);
dev.Load(out senseBuffer, TIMEOUT, out _);
sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _);
if(sense)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
@@ -188,7 +184,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
DicConsole.Write("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _);
if(!sense) break;
leftRetries--;
@@ -203,7 +199,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
{
DicConsole.Write("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _);
if(!sense) break;
leftRetries--;
@@ -217,11 +213,11 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(seqTest.MediaIsRecognized)
{
decMode = null;
Modes.DecodedMode? decMode = null;
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
sense = dev.ModeSense10(out buffer, out senseBuffer, false, true,
ScsiModeSensePageControl.Current, 0x3F, 0x00, timeout, out duration);
ScsiModeSensePageControl.Current, 0x3F, 0x00, TIMEOUT, out _);
if(!sense && !dev.Error)
{
report.SCSI.SupportsModeSense10 = true;
@@ -230,7 +226,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
sense = dev.ModeSense(out buffer, out senseBuffer, timeout, out duration);
sense = dev.ModeSense(out buffer, out senseBuffer, TIMEOUT, out _);
if(!sense && !dev.Error)
{
report.SCSI.SupportsModeSense6 = true;
@@ -252,7 +248,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for current media...");
sense = dev.ReportDensitySupport(out buffer, out senseBuffer, false, true, timeout, out duration);
sense = dev.ReportDensitySupport(out buffer, out senseBuffer, false, true, TIMEOUT, out _);
if(!sense)
{
DensitySupport.DensitySupportHeader? dsh =
@@ -279,7 +275,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
}
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for medium types for current media...");
sense = dev.ReportDensitySupport(out buffer, out senseBuffer, true, true, timeout, out duration);
sense = dev.ReportDensitySupport(out buffer, out senseBuffer, true, true, TIMEOUT, out _);
if(!sense)
{
DensitySupport.MediaTypeSupportHeader? mtsh =
@@ -309,7 +305,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
seqTest.CanReadMediaSerialSpecified = true;
DicConsole.WriteLine("Trying SCSI READ MEDIA SERIAL NUMBER...");
seqTest.CanReadMediaSerial =
!dev.ReadMediaSerialNumber(out buffer, out senseBuffer, timeout, out duration);
!dev.ReadMediaSerialNumber(out buffer, out senseBuffer, TIMEOUT, out _);
seqTests.Add(seqTest);
}

View File

@@ -38,7 +38,7 @@ namespace DiscImageChef.Core.Devices.Report
{
public static class SecureDigital
{
public static void Report(Device dev, ref DeviceReport report, bool debug, ref bool removable)
public static void Report(Device dev, ref DeviceReport report)
{
if(report == null) return;
@@ -50,7 +50,7 @@ namespace DiscImageChef.Core.Devices.Report
}
DicConsole.WriteLine("Trying to get CID...");
bool sense = dev.ReadCid(out byte[] cid, out uint[] response, dev.Timeout, out double duration);
bool sense = dev.ReadCid(out byte[] cid, out _, dev.Timeout, out _);
if(!sense)
{
@@ -81,7 +81,7 @@ namespace DiscImageChef.Core.Devices.Report
else DicConsole.WriteLine("Could not read CID...");
DicConsole.WriteLine("Trying to get CSD...");
sense = dev.ReadCsd(out byte[] csd, out response, dev.Timeout, out duration);
sense = dev.ReadCsd(out byte[] csd, out _, dev.Timeout, out _);
if(!sense)
{
@@ -100,7 +100,7 @@ namespace DiscImageChef.Core.Devices.Report
case DeviceType.MMC:
{
DicConsole.WriteLine("Trying to get OCR...");
sense = dev.ReadOcr(out byte[] ocr, out response, dev.Timeout, out duration);
sense = dev.ReadOcr(out byte[] ocr, out _, dev.Timeout, out _);
if(!sense)
{
@@ -110,7 +110,7 @@ namespace DiscImageChef.Core.Devices.Report
else DicConsole.WriteLine("Could not read OCR...");
DicConsole.WriteLine("Trying to get Extended CSD...");
sense = dev.ReadExtendedCsd(out byte[] ecsd, out response, dev.Timeout, out duration);
sense = dev.ReadExtendedCsd(out byte[] ecsd, out _, dev.Timeout, out _);
if(!sense)
{
@@ -123,7 +123,7 @@ namespace DiscImageChef.Core.Devices.Report
case DeviceType.SecureDigital:
{
DicConsole.WriteLine("Trying to get OCR...");
sense = dev.ReadSdocr(out byte[] ocr, out response, dev.Timeout, out duration);
sense = dev.ReadSdocr(out byte[] ocr, out _, dev.Timeout, out _);
if(!sense)
{
@@ -133,7 +133,7 @@ namespace DiscImageChef.Core.Devices.Report
else DicConsole.WriteLine("Could not read OCR...");
DicConsole.WriteLine("Trying to get SCR...");
sense = dev.ReadScr(out byte[] scr, out response, dev.Timeout, out duration);
sense = dev.ReadScr(out byte[] scr, out _, dev.Timeout, out _);
if(!sense)
{

View File

@@ -53,11 +53,13 @@ namespace DiscImageChef.Core.Devices.Report
if(pressedKey.Key != ConsoleKey.Y) return;
report.USB = new usbType();
report.USB.Manufacturer = dev.UsbManufacturerString;
report.USB.Product = dev.UsbProductString;
report.USB.ProductID = dev.UsbProductId;
report.USB.VendorID = dev.UsbVendorId;
report.USB = new usbType
{
Manufacturer = dev.UsbManufacturerString,
Product = dev.UsbProductString,
ProductID = dev.UsbProductId,
VendorID = dev.UsbVendorId
};
pressedKey = new ConsoleKeyInfo();
while(pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N)

View File

@@ -45,21 +45,16 @@ namespace DiscImageChef.Core.Devices.Scanning
{
ScanResults results = new ScanResults();
bool aborted;
MhddLog mhddLog;
IbgLog ibgLog;
byte[] cmdBuf;
bool sense;
results.Blocks = 0;
ushort currentProfile = 0x0001;
AtaErrorRegistersCHS errorChs;
uint timeout = 5;
double duration;
const ushort ATA_PROFILE = 0x0001;
const uint TIMEOUT = 5;
sense = dev.AtaIdentify(out cmdBuf, out errorChs);
sense = dev.AtaIdentify(out byte[] cmdBuf, out _);
if(!sense && Identify.Decode(cmdBuf).HasValue)
{
// Initializate reader
Reader ataReader = new Reader(dev, timeout, cmdBuf);
Reader ataReader = new Reader(dev, TIMEOUT, cmdBuf);
// Fill reader blocks
results.Blocks = ataReader.GetDeviceBlocks();
if(ataReader.FindReadCommand())
@@ -76,7 +71,7 @@ namespace DiscImageChef.Core.Devices.Scanning
uint blockSize = ataReader.LogicalBlockSize;
// Check how many blocks to read, if error show and return
if(ataReader.GetBlocksToRead(64))
if(ataReader.GetBlocksToRead())
{
DicConsole.ErrorWriteLine(ataReader.ErrorMessage);
return results;
@@ -110,20 +105,18 @@ namespace DiscImageChef.Core.Devices.Scanning
Random rnd = new Random();
uint seekPos;
ushort seekCy;
byte seekHd;
byte seekSc;
aborted = false;
System.Console.CancelKeyPress += (sender, e) => e.Cancel = aborted = true;
MhddLog mhddLog;
IbgLog ibgLog;
double duration;
if(ataReader.IsLba)
{
DicConsole.WriteLine("Reading {0} sectors at a time.", blocksToRead);
mhddLog = new MhddLog(mhddLogPath, dev, results.Blocks, blockSize, blocksToRead);
ibgLog = new IbgLog(ibgLogPath, currentProfile);
ibgLog = new IbgLog(ibgLogPath, ATA_PROFILE);
start = DateTime.UtcNow;
for(ulong i = 0; i < results.Blocks; i += blocksToRead)
@@ -159,8 +152,7 @@ namespace DiscImageChef.Core.Devices.Scanning
results.Errored += blocksToRead;
for(ulong b = i; b < i + blocksToRead; b++) results.UnreadableSectors.Add(b);
if(duration < 500) mhddLog.Write(i, 65535);
else mhddLog.Write(i, duration);
mhddLog.Write(i, duration < 500 ? 65535 : duration);
ibgLog.Write(i, 0);
}
@@ -181,7 +173,7 @@ namespace DiscImageChef.Core.Devices.Scanning
{
if(aborted) break;
seekPos = (uint)rnd.Next((int)results.Blocks);
uint seekPos = (uint)rnd.Next((int)results.Blocks);
DicConsole.Write("\rSeeking to sector {0}...\t\t", seekPos);
@@ -199,7 +191,7 @@ namespace DiscImageChef.Core.Devices.Scanning
else
{
mhddLog = new MhddLog(mhddLogPath, dev, results.Blocks, blockSize, blocksToRead);
ibgLog = new IbgLog(ibgLogPath, currentProfile);
ibgLog = new IbgLog(ibgLogPath, ATA_PROFILE);
ulong currentBlock = 0;
results.Blocks = (ulong)(cylinders * heads * sectors);
@@ -240,8 +232,7 @@ namespace DiscImageChef.Core.Devices.Scanning
{
results.Errored += blocksToRead;
results.UnreadableSectors.Add(currentBlock);
if(duration < 500) mhddLog.Write(currentBlock, 65535);
else mhddLog.Write(currentBlock, duration);
mhddLog.Write(currentBlock, duration < 500 ? 65535 : duration);
ibgLog.Write(currentBlock, 0);
}
@@ -266,9 +257,9 @@ namespace DiscImageChef.Core.Devices.Scanning
{
if(aborted) break;
seekCy = (ushort)rnd.Next(cylinders);
seekHd = (byte)rnd.Next(heads);
seekSc = (byte)rnd.Next(sectors);
ushort seekCy = (ushort)rnd.Next(cylinders);
byte seekHd = (byte)rnd.Next(heads);
byte seekSc = (byte)rnd.Next(sectors);
DicConsole.Write("\rSeeking to cylinder {0}, head {1}, sector {2}...\t\t", seekCy, seekHd,
seekSc);

View File

@@ -50,17 +50,15 @@ namespace DiscImageChef.Core.Devices.Scanning
bool aborted;
MhddLog mhddLog;
IbgLog ibgLog;
byte[] cmdBuf;
byte[] senseBuf;
bool sense = false;
double duration;
results.Blocks = 0;
uint blockSize = 0;
ushort currentProfile = 0x0001;
if(dev.IsRemovable)
{
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
if(sense)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuf);
@@ -72,7 +70,7 @@ namespace DiscImageChef.Core.Devices.Scanning
{
DicConsole.WriteLine("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
if(!sense) break;
leftRetries--;
@@ -91,7 +89,7 @@ namespace DiscImageChef.Core.Devices.Scanning
{
DicConsole.WriteLine("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
if(!sense) break;
leftRetries--;
@@ -112,7 +110,7 @@ namespace DiscImageChef.Core.Devices.Scanning
{
DicConsole.WriteLine("\rWaiting for drive to become ready");
Thread.Sleep(2000);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration);
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _);
if(!sense) break;
leftRetries--;
@@ -148,7 +146,7 @@ namespace DiscImageChef.Core.Devices.Scanning
case PeripheralDeviceTypes.OpticalDevice:
case PeripheralDeviceTypes.SimplifiedDevice:
case PeripheralDeviceTypes.WriteOnceDevice:
scsiReader = new Reader(dev, dev.Timeout, null, false);
scsiReader = new Reader(dev, dev.Timeout, null);
results.Blocks = scsiReader.GetDeviceBlocks();
if(scsiReader.FindReadCommand())
{
@@ -182,8 +180,8 @@ namespace DiscImageChef.Core.Devices.Scanning
if(dev.ScsiType == PeripheralDeviceTypes.MultiMediaDevice)
{
sense = dev.GetConfiguration(out cmdBuf, out senseBuf, 0, MmcGetConfigurationRt.Current, dev.Timeout,
out duration);
sense = dev.GetConfiguration(out byte[] cmdBuf, out senseBuf, 0, MmcGetConfigurationRt.Current, dev.Timeout,
out _);
if(!sense)
{
Features.SeparatedFeatures ftr = Features.Separate(cmdBuf);
@@ -210,13 +208,12 @@ namespace DiscImageChef.Core.Devices.Scanning
currentProfile = 0x0008;
// We discarded all discs that falsify a TOC before requesting a real TOC
// No TOC, no CD (or an empty one)
bool tocSense = dev.ReadRawToc(out cmdBuf, out senseBuf, 1, dev.Timeout, out duration);
bool tocSense = dev.ReadRawToc(out cmdBuf, out senseBuf, 1, dev.Timeout, out _);
if(!tocSense) toc = FullTOC.Decode(cmdBuf);
}
}
else compactDisc = false;
byte[] readBuffer;
uint blocksToRead = 64;
results.A = 0; // <3ms
@@ -238,8 +235,6 @@ namespace DiscImageChef.Core.Devices.Scanning
aborted = false;
System.Console.CancelKeyPress += (sender, e) => e.Cancel = aborted = true;
bool readcd = false;
if(compactDisc)
{
if(toc == null)
@@ -248,9 +243,9 @@ namespace DiscImageChef.Core.Devices.Scanning
return results;
}
readcd = !dev.ReadCd(out readBuffer, out senseBuf, 0, 2352, 1, MmcSectorTypes.AllTypes, false, false,
true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
MmcSubchannel.None, dev.Timeout, out duration);
bool readcd = !dev.ReadCd(out _, out senseBuf, 0, 2352, 1, MmcSectorTypes.AllTypes, false, false,
true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
MmcSubchannel.None, dev.Timeout, out _);
if(readcd) DicConsole.WriteLine("Using MMC READ CD command.");
@@ -260,9 +255,9 @@ namespace DiscImageChef.Core.Devices.Scanning
{
if(readcd)
{
sense = dev.ReadCd(out readBuffer, out senseBuf, 0, 2352, blocksToRead, MmcSectorTypes.AllTypes,
sense = dev.ReadCd(out _, out senseBuf, 0, 2352, blocksToRead, MmcSectorTypes.AllTypes,
false, false, true, MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out duration);
MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out _);
if(dev.Error) blocksToRead /= 2;
}
@@ -297,7 +292,7 @@ namespace DiscImageChef.Core.Devices.Scanning
if(readcd)
{
sense = dev.ReadCd(out readBuffer, out senseBuf, (uint)i, 2352, blocksToRead,
sense = dev.ReadCd(out _, out senseBuf, (uint)i, 2352, blocksToRead,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true,
true, MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out cmdDuration);
results.ProcessingTime += cmdDuration;
@@ -333,8 +328,7 @@ namespace DiscImageChef.Core.Devices.Scanning
results.Errored += blocksToRead;
for(ulong b = i; b < i + blocksToRead; b++) results.UnreadableSectors.Add(b);
if(cmdDuration < 500) mhddLog.Write(i, 65535);
else mhddLog.Write(i, cmdDuration);
mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration);
ibgLog.Write(i, 0);
}
@@ -344,8 +338,7 @@ namespace DiscImageChef.Core.Devices.Scanning
results.Errored += blocksToRead;
for(ulong b = i; b < i + blocksToRead; b++) results.UnreadableSectors.Add(b);
if(cmdDuration < 500) mhddLog.Write(i, 65535);
else mhddLog.Write(i, cmdDuration);
mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration);
ibgLog.Write(i, 0);
}
@@ -375,8 +368,6 @@ namespace DiscImageChef.Core.Devices.Scanning
{
if(aborted) break;
double cmdDuration = 0;
if(results.Blocks - i < blocksToRead) blocksToRead = (uint)(results.Blocks - i);
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
@@ -386,7 +377,7 @@ namespace DiscImageChef.Core.Devices.Scanning
DicConsole.Write("\rReading sector {0} of {1} ({2:F3} MiB/sec.)", i, results.Blocks, currentSpeed);
sense = scsiReader.ReadBlocks(out readBuffer, i, blocksToRead, out cmdDuration);
sense = scsiReader.ReadBlocks(out _, i, blocksToRead, out double cmdDuration);
results.ProcessingTime += cmdDuration;
if(!sense && !dev.Error)
@@ -407,8 +398,7 @@ namespace DiscImageChef.Core.Devices.Scanning
results.Errored += blocksToRead;
for(ulong b = i; b < i + blocksToRead; b++) results.UnreadableSectors.Add(b);
if(cmdDuration < 500) mhddLog.Write(i, 65535);
else mhddLog.Write(i, cmdDuration);
mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration);
ibgLog.Write(i, 0);
}
@@ -428,22 +418,19 @@ namespace DiscImageChef.Core.Devices.Scanning
results.SeekTotal = 0;
const int SEEK_TIMES = 1000;
double seekCur = 0;
Random rnd = new Random();
uint seekPos = (uint)rnd.Next((int)results.Blocks);
for(int i = 0; i < SEEK_TIMES; i++)
{
if(aborted) break;
seekPos = (uint)rnd.Next((int)results.Blocks);
uint seekPos = (uint)rnd.Next((int)results.Blocks);
DicConsole.Write("\rSeeking to sector {0}...\t\t", seekPos);
double seekCur;
if(scsiReader.CanSeek) scsiReader.Seek(seekPos, out seekCur);
else scsiReader.ReadBlock(out readBuffer, seekPos, out seekCur);
else scsiReader.ReadBlock(out _, seekPos, out seekCur);
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
if(seekCur > results.SeekMax && seekCur != 0) results.SeekMax = seekCur;

View File

@@ -45,15 +45,12 @@ namespace DiscImageChef.Core.Devices.Scanning
{
ScanResults results = new ScanResults();
bool aborted;
MhddLog mhddLog;
IbgLog ibgLog;
byte[] cmdBuf;
bool sense;
results.Blocks = 0;
uint[] response;
uint timeout = 5;
double duration = 0;
ushort currentProfile = 0x0001;
const uint TIMEOUT = 5;
double duration;
const ushort SD_PROFILE = 0x0001;
uint blocksToRead = 128;
uint blockSize = 512;
bool byteAddressed = true;
@@ -61,13 +58,10 @@ namespace DiscImageChef.Core.Devices.Scanning
switch(dev.Type) {
case DeviceType.MMC:
{
ExtendedCSD ecsd = new ExtendedCSD();
CSD csd = new CSD();
sense = dev.ReadExtendedCsd(out cmdBuf, out response, timeout, out duration);
sense = dev.ReadExtendedCsd(out cmdBuf, out _, TIMEOUT, out _);
if(!sense)
{
ecsd = Decoders.MMC.Decoders.DecodeExtendedCSD(cmdBuf);
ExtendedCSD ecsd = Decoders.MMC.Decoders.DecodeExtendedCSD(cmdBuf);
blocksToRead = ecsd.OptimalReadSize;
results.Blocks = ecsd.SectorCount;
blockSize = (uint)(ecsd.SectorSize == 1 ? 4096 : 512);
@@ -77,10 +71,10 @@ namespace DiscImageChef.Core.Devices.Scanning
if(sense || results.Blocks == 0)
{
sense = dev.ReadCsd(out cmdBuf, out response, timeout, out duration);
sense = dev.ReadCsd(out cmdBuf, out _, TIMEOUT, out _);
if(!sense)
{
csd = Decoders.MMC.Decoders.DecodeCSD(cmdBuf);
CSD csd = Decoders.MMC.Decoders.DecodeCSD(cmdBuf);
results.Blocks = (ulong)((csd.Size + 1) * Math.Pow(2, csd.SizeMultiplier + 2));
blockSize = (uint)Math.Pow(2, csd.ReadBlockLength);
}
@@ -89,12 +83,10 @@ namespace DiscImageChef.Core.Devices.Scanning
}
case DeviceType.SecureDigital:
{
Decoders.SecureDigital.CSD csd = new Decoders.SecureDigital.CSD();
sense = dev.ReadCsd(out cmdBuf, out response, timeout, out duration);
sense = dev.ReadCsd(out cmdBuf, out _, TIMEOUT, out _);
if(!sense)
{
csd = Decoders.SecureDigital.Decoders.DecodeCSD(cmdBuf);
Decoders.SecureDigital.CSD csd = Decoders.SecureDigital.Decoders.DecodeCSD(cmdBuf);
results.Blocks = (ulong)(csd.Structure == 0
? (csd.Size + 1) * Math.Pow(2, csd.SizeMultiplier + 2)
: (csd.Size + 1) * 1024);
@@ -112,11 +104,9 @@ namespace DiscImageChef.Core.Devices.Scanning
return results;
}
sense = true;
while(true)
{
sense = dev.Read(out cmdBuf, out response, 0, blockSize, blocksToRead, byteAddressed, timeout,
sense = dev.Read(out cmdBuf, out _, 0, blockSize, blocksToRead, byteAddressed, TIMEOUT,
out duration);
if(sense) blocksToRead /= 2;
@@ -126,7 +116,6 @@ namespace DiscImageChef.Core.Devices.Scanning
if(sense)
{
blocksToRead = 1;
DicConsole.ErrorWriteLine("Device error {0} trying to guess ideal transfer length.", dev.LastError);
return results;
}
@@ -150,19 +139,15 @@ namespace DiscImageChef.Core.Devices.Scanning
results.SeekTotal = 0;
const int SEEK_TIMES = 1000;
double seekCur = 0;
Random rnd = new Random();
uint seekPos = (uint)rnd.Next((int)results.Blocks);
aborted = false;
System.Console.CancelKeyPress += (sender, e) => e.Cancel = aborted = true;
DicConsole.WriteLine("Reading {0} sectors at a time.", blocksToRead);
mhddLog = new MhddLog(mhddLogPath, dev, results.Blocks, blockSize, blocksToRead);
ibgLog = new IbgLog(ibgLogPath, currentProfile);
MhddLog mhddLog = new MhddLog(mhddLogPath, dev, results.Blocks, blockSize, blocksToRead);
IbgLog ibgLog = new IbgLog(ibgLogPath, SD_PROFILE);
start = DateTime.UtcNow;
for(ulong i = 0; i < results.Blocks; i += blocksToRead)
@@ -178,8 +163,8 @@ namespace DiscImageChef.Core.Devices.Scanning
DicConsole.Write("\rReading sector {0} of {1} ({2:F3} MiB/sec.)", i, results.Blocks, currentSpeed);
bool error = dev.Read(out cmdBuf, out response, (uint)i, blockSize, blocksToRead, byteAddressed,
timeout, out duration);
bool error = dev.Read(out cmdBuf, out _, (uint)i, blockSize, blocksToRead, byteAddressed,
TIMEOUT, out duration);
if(!error)
{
@@ -198,8 +183,7 @@ namespace DiscImageChef.Core.Devices.Scanning
results.Errored += blocksToRead;
for(ulong b = i; b < i + blocksToRead; b++) results.UnreadableSectors.Add(b);
if(duration < 500) mhddLog.Write(i, 65535);
else mhddLog.Write(i, duration);
mhddLog.Write(i, duration < 500 ? 65535 : duration);
ibgLog.Write(i, 0);
}
@@ -219,12 +203,12 @@ namespace DiscImageChef.Core.Devices.Scanning
{
if(aborted) break;
seekPos = (uint)rnd.Next((int)results.Blocks);
uint seekPos = (uint)rnd.Next((int)results.Blocks);
DicConsole.Write("\rSeeking to sector {0}...\t\t", seekPos);
dev.Read(out cmdBuf, out response, seekPos, blockSize, blocksToRead, byteAddressed, timeout,
out seekCur);
dev.Read(out cmdBuf, out _, seekPos, blockSize, blocksToRead, byteAddressed, TIMEOUT,
out double seekCur);
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
if(seekCur > results.SeekMax && seekCur != 0) results.SeekMax = seekCur;

View File

@@ -44,11 +44,10 @@ namespace DiscImageChef.Core
{
try
{
ImagePlugin imageFormat;
PluginBase plugins = new PluginBase();
plugins.RegisterAllPlugins();
imageFormat = null;
ImagePlugin imageFormat = null;
// Check all but RAW plugin
foreach(ImagePlugin imageplugin in plugins.ImagePluginsList.Values.Where(imageplugin => imageplugin.PluginUuid != new Guid("12345678-AAAA-BBBB-CCCC-123456789000"))) try
@@ -60,10 +59,12 @@ namespace DiscImageChef.Core
break;
}
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
catch { }
catch { // ignored
}
if(imageFormat != null) return imageFormat;
// Check only RAW plugin
if(imageFormat == null)
foreach(ImagePlugin imageplugin in plugins.ImagePluginsList.Values.Where(imageplugin => imageplugin.PluginUuid == new Guid("12345678-AAAA-BBBB-CCCC-123456789000"))) try
{
DicConsole.DebugWriteLine("Format detection", "Trying plugin {0}", imageplugin.Name);
@@ -73,11 +74,10 @@ namespace DiscImageChef.Core
break;
}
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
catch { }
catch { // ignored
}
// Still not recognized
if(imageFormat == null) return null;
return imageFormat;
}
catch { return null; }

View File

@@ -48,14 +48,7 @@ namespace DiscImageChef.Core.Logging
mhddFs = new FileStream(outputFile, FileMode.Create);
string device;
string mode;
string fw;
string sn;
string sectors;
string sectorsize;
string scanblocksize;
string ver;
switch(dev.Type)
{
@@ -80,15 +73,15 @@ namespace DiscImageChef.Core.Logging
break;
}
device = $"DEVICE: {dev.Manufacturer} {dev.Model}";
fw = $"F/W: {dev.Revision}";
sn = $"S/N: {dev.Serial}";
sectors = string.Format(new CultureInfo("en-US"), "SECTORS: {0:n0}", blocks);
sectorsize = string.Format(new CultureInfo("en-US"), "SECTOR SIZE: {0:n0} bytes",
blockSize);
scanblocksize = string.Format(new CultureInfo("en-US"),
"SCAN BLOCK SIZE: {0:n0} sectors", blocksToRead);
ver = "VER:2 ";
string device = $"DEVICE: {dev.Manufacturer} {dev.Model}";
string fw = $"F/W: {dev.Revision}";
string sn = $"S/N: {dev.Serial}";
string sectors = string.Format(new CultureInfo("en-US"), "SECTORS: {0:n0}", blocks);
string sectorsize = string.Format(new CultureInfo("en-US"), "SECTOR SIZE: {0:n0} bytes",
blockSize);
string scanblocksize = string.Format(new CultureInfo("en-US"),
"SCAN BLOCK SIZE: {0:n0} sectors", blocksToRead);
const string MHDD_VER = "VER:2 ";
byte[] deviceBytes = Encoding.ASCII.GetBytes(device);
byte[] modeBytes = Encoding.ASCII.GetBytes(mode);
@@ -97,7 +90,7 @@ namespace DiscImageChef.Core.Logging
byte[] sectorsBytes = Encoding.ASCII.GetBytes(sectors);
byte[] sectorsizeBytes = Encoding.ASCII.GetBytes(sectorsize);
byte[] scanblocksizeBytes = Encoding.ASCII.GetBytes(scanblocksize);
byte[] verBytes = Encoding.ASCII.GetBytes(ver);
byte[] verBytes = Encoding.ASCII.GetBytes(MHDD_VER);
uint pointer = (uint)(deviceBytes.Length + modeBytes.Length + fwBytes.Length + snBytes.Length +
sectorsBytes.Length + sectorsizeBytes.Length + scanblocksizeBytes.Length +

View File

@@ -45,7 +45,7 @@ namespace DiscImageChef.Core
{
PluginBase plugins = new PluginBase();
plugins.RegisterAllPlugins();
List<Partition> partitions = new List<Partition>();
List<Partition> foundPartitions = new List<Partition>();
List<Partition> childPartitions = new List<Partition>();
List<ulong> checkedLocations = new List<ulong>();
@@ -53,11 +53,11 @@ namespace DiscImageChef.Core
if(image.ImageInfo.ImageHasPartitions)
foreach(Partition imagePartition in image.GetPartitions())
{
foreach(PartitionPlugin _partplugin in plugins.PartPluginsList.Values)
if(_partplugin.GetInformation(image, out List<Partition> _partitions, imagePartition.Start))
foreach(PartitionPlugin partitionPlugin in plugins.PartPluginsList.Values)
if(partitionPlugin.GetInformation(image, out List<Partition> partitions, imagePartition.Start))
{
partitions.AddRange(_partitions);
DicConsole.DebugWriteLine("Partitions", "Found {0} @ {1}", _partplugin.Name,
foundPartitions.AddRange(partitions);
DicConsole.DebugWriteLine("Partitions", "Found {0} @ {1}", partitionPlugin.Name,
imagePartition.Start);
}
@@ -66,57 +66,57 @@ namespace DiscImageChef.Core
// Getting all partitions at start of device
else
{
foreach(PartitionPlugin _partplugin in plugins.PartPluginsList.Values)
if(_partplugin.GetInformation(image, out List<Partition> _partitions, 0))
foreach(PartitionPlugin partitionPlugin in plugins.PartPluginsList.Values)
if(partitionPlugin.GetInformation(image, out List<Partition> partitions, 0))
{
partitions.AddRange(_partitions);
DicConsole.DebugWriteLine("Partitions", "Found {0} @ 0", _partplugin.Name);
foundPartitions.AddRange(partitions);
DicConsole.DebugWriteLine("Partitions", "Found {0} @ 0", partitionPlugin.Name);
}
checkedLocations.Add(0);
}
while(partitions.Count > 0)
while(foundPartitions.Count > 0)
{
if(checkedLocations.Contains(partitions[0].Start))
if(checkedLocations.Contains(foundPartitions[0].Start))
{
childPartitions.Add(partitions[0]);
partitions.RemoveAt(0);
childPartitions.Add(foundPartitions[0]);
foundPartitions.RemoveAt(0);
continue;
}
List<Partition> childs = new List<Partition>();
foreach(PartitionPlugin _partplugin in plugins.PartPluginsList.Values)
foreach(PartitionPlugin partitionPlugin in plugins.PartPluginsList.Values)
{
DicConsole.DebugWriteLine("Partitions", "Trying {0} @ {1}", _partplugin.Name, partitions[0].Start);
if(!_partplugin.GetInformation(image, out List<Partition> _partitions, partitions[0].Start))
DicConsole.DebugWriteLine("Partitions", "Trying {0} @ {1}", partitionPlugin.Name, foundPartitions[0].Start);
if(!partitionPlugin.GetInformation(image, out List<Partition> partitions, foundPartitions[0].Start))
continue;
DicConsole.DebugWriteLine("Partitions", "Found {0} @ {1}", _partplugin.Name,
partitions[0].Start);
childs.AddRange(_partitions);
DicConsole.DebugWriteLine("Partitions", "Found {0} @ {1}", partitionPlugin.Name,
foundPartitions[0].Start);
childs.AddRange(partitions);
}
checkedLocations.Add(partitions[0].Start);
checkedLocations.Add(foundPartitions[0].Start);
DicConsole.DebugWriteLine("Partitions", "Got {0} childs", childs.Count);
if(childs.Count > 0)
{
partitions.RemoveAt(0);
foundPartitions.RemoveAt(0);
foreach(Partition child in childs)
if(checkedLocations.Contains(child.Start)) childPartitions.Add(child);
else partitions.Add(child);
else foundPartitions.Add(child);
}
else
{
childPartitions.Add(partitions[0]);
partitions.RemoveAt(0);
childPartitions.Add(foundPartitions[0]);
foundPartitions.RemoveAt(0);
}
DicConsole.DebugWriteLine("Partitions", "Got {0} parents", partitions.Count);
DicConsole.DebugWriteLine("Partitions", "Got {0} parents", foundPartitions.Count);
DicConsole.DebugWriteLine("Partitions", "Got {0} partitions", childPartitions.Count);
}

View File

@@ -56,9 +56,7 @@ namespace DiscImageChef.Core
public void RegisterAllPlugins(Encoding encoding = null)
{
Assembly assembly;
assembly = Assembly.GetAssembly(typeof(ImagePlugin));
Assembly assembly = Assembly.GetAssembly(typeof(ImagePlugin));
foreach(Type type in assembly.GetTypes())
try

View File

@@ -73,7 +73,7 @@ namespace DiscImageChef.Core
Stream data = response.GetResponseStream();
StreamReader reader = new StreamReader(data ?? throw new InvalidOperationException());
string responseFromServer = reader.ReadToEnd();
reader.ReadToEnd();
data.Close();
response.Close();
xmlStream.Close();

View File

@@ -313,7 +313,7 @@ namespace DiscImageChef.Core
{
if(!plugin.Identify(image, partitions[i])) continue;
plugin.GetInformation(image, partitions[i], out string foo);
plugin.GetInformation(image, partitions[i], out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
}
@@ -346,7 +346,7 @@ namespace DiscImageChef.Core
{
if(!plugin.Identify(image, wholePart)) continue;
plugin.GetInformation(image, wholePart, out string foo);
plugin.GetInformation(image, wholePart, out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
}
@@ -541,13 +541,17 @@ namespace DiscImageChef.Core
for(byte t = scpImage.Header.start; t <= scpImage.Header.end; t++)
{
BlockTrackType scpBlockTrackType = new BlockTrackType();
scpBlockTrackType.Cylinder = t / image.ImageInfo.Heads;
scpBlockTrackType.Head = t % image.ImageInfo.Heads;
scpBlockTrackType.Image = new ImageType();
scpBlockTrackType.Image.format = scpImage.GetImageFormat();
scpBlockTrackType.Image.Value = Path.GetFileName(scpFilePath);
scpBlockTrackType.Image.offset = scpImage.Header.offsets[t];
BlockTrackType scpBlockTrackType = new BlockTrackType
{
Cylinder = t / image.ImageInfo.Heads,
Head = t % image.ImageInfo.Heads,
Image = new ImageType
{
format = scpImage.GetImageFormat(),
Value = Path.GetFileName(scpFilePath),
offset = scpImage.Header.offsets[t]
}
};
if(scpBlockTrackType.Cylinder < image.ImageInfo.Cylinders)
{
@@ -626,17 +630,21 @@ namespace DiscImageChef.Core
foreach(KeyValuePair<byte, Filter> kvp in kfImage.tracks)
{
BlockTrackType kfBlockTrackType = new BlockTrackType();
kfBlockTrackType.Cylinder = kvp.Key / image.ImageInfo.Heads;
kfBlockTrackType.Head = kvp.Key % image.ImageInfo.Heads;
kfBlockTrackType.Image = new ImageType();
kfBlockTrackType.Image.format = kfImage.GetImageFormat();
kfBlockTrackType.Image.Value =
kfDir
? Path.Combine(Path.GetFileName(Path.GetDirectoryName(kvp.Value.GetBasePath())),
kvp.Value.GetFilename())
: kvp.Value.GetFilename();
kfBlockTrackType.Image.offset = 0;
BlockTrackType kfBlockTrackType = new BlockTrackType
{
Cylinder = kvp.Key / image.ImageInfo.Heads,
Head = kvp.Key % image.ImageInfo.Heads,
Image = new ImageType
{
format = kfImage.GetImageFormat(),
Value = kfDir
? Path
.Combine(Path.GetFileName(Path.GetDirectoryName(kvp.Value.GetBasePath())),
kvp.Value.GetFilename())
: kvp.Value.GetFilename(),
offset = 0
}
};
if(kfBlockTrackType.Cylinder < image.ImageInfo.Cylinders)
{
@@ -697,12 +705,16 @@ namespace DiscImageChef.Core
foreach(int t in dfiImage.TrackOffsets.Keys)
{
BlockTrackType dfiBlockTrackType = new BlockTrackType();
dfiBlockTrackType.Cylinder = t / image.ImageInfo.Heads;
dfiBlockTrackType.Head = t % image.ImageInfo.Heads;
dfiBlockTrackType.Image = new ImageType();
dfiBlockTrackType.Image.format = dfiImage.GetImageFormat();
dfiBlockTrackType.Image.Value = Path.GetFileName(dfiFilePath);
BlockTrackType dfiBlockTrackType = new BlockTrackType
{
Cylinder = t / image.ImageInfo.Heads,
Head = t % image.ImageInfo.Heads,
Image = new ImageType
{
format = dfiImage.GetImageFormat(),
Value = Path.GetFileName(dfiFilePath)
}
};
if(dfiBlockTrackType.Cylinder < image.ImageInfo.Cylinders)
{

View File

@@ -89,7 +89,7 @@ namespace DiscImageChef.Core
Sequence = i
};
uint sectorsToRead = 512;
const uint SECTORS_TO_READ = 512;
long sectors = fs.Length / blockSize;
long doneSectors = 0;
@@ -98,13 +98,13 @@ namespace DiscImageChef.Core
{
byte[] sector;
if(sectors - doneSectors >= sectorsToRead)
if(sectors - doneSectors >= SECTORS_TO_READ)
{
sector = new byte[sectorsToRead * blockSize];
sector = new byte[SECTORS_TO_READ * blockSize];
fs.Read(sector, 0, sector.Length);
UpdateProgress2($"Hashing block {doneSectors} of {sectors} on file {i + 1} of {files.Count}",
doneSectors, sectors);
doneSectors += sectorsToRead;
doneSectors += SECTORS_TO_READ;
}
else
{

View File

@@ -44,39 +44,37 @@ namespace DiscImageChef.Core
public static void InitProgress()
{
if(InitProgressEvent != null) InitProgressEvent();
InitProgressEvent?.Invoke();
}
public static void UpdateProgress(string text, long current, long maximum)
{
if(UpdateProgressEvent != null)
UpdateProgressEvent(string.Format(text, current, maximum), current, maximum);
UpdateProgressEvent?.Invoke(string.Format(text, current, maximum), current, maximum);
}
public static void EndProgress()
{
if(EndProgressEvent != null) EndProgressEvent();
EndProgressEvent?.Invoke();
}
public static void InitProgress2()
{
if(InitProgressEvent2 != null) InitProgressEvent2();
InitProgressEvent2?.Invoke();
}
public static void UpdateProgress2(string text, long current, long maximum)
{
if(UpdateProgressEvent2 != null)
UpdateProgressEvent2(string.Format(text, current, maximum), current, maximum);
UpdateProgressEvent2?.Invoke(string.Format(text, current, maximum), current, maximum);
}
public static void EndProgress2()
{
if(EndProgressEvent2 != null) EndProgressEvent2();
EndProgressEvent2?.Invoke();
}
public static void UpdateStatus(string text, params object[] args)
{
if(UpdateStatusEvent != null) UpdateStatusEvent(string.Format(text, args));
UpdateStatusEvent?.Invoke(string.Format(text, args));
}
}
}

View File

@@ -235,7 +235,7 @@ namespace DiscImageChef.Core
try
{
List<Session> sessions = image.GetSessions();
sidecar.OpticalDisc[0].Sessions = sessions != null ? sessions.Count : 1;
sidecar.OpticalDisc[0].Sessions = sessions?.Count ?? 1;
}
catch { sidecar.OpticalDisc[0].Sessions = 1; }
@@ -473,7 +473,7 @@ namespace DiscImageChef.Core
{
if(!plugin.Identify(image, partitions[i])) continue;
plugin.GetInformation(image, partitions[i], out string foo);
plugin.GetInformation(image, partitions[i], out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);
@@ -520,7 +520,7 @@ namespace DiscImageChef.Core
{
if(!plugin.Identify(image, xmlPart)) continue;
plugin.GetInformation(image, xmlPart, out string foo);
plugin.GetInformation(image, xmlPart, out _);
lstFs.Add(plugin.XmlFSType);
Statistics.AddFilesystem(plugin.XmlFSType.Type);

View File

@@ -173,7 +173,7 @@ namespace DiscImageChef.Core
submitStatsLock = true;
var statsFiles = Directory.EnumerateFiles(Settings.Settings.StatsPath, "PartialStats_*.xml",
IEnumerable<string> statsFiles = Directory.EnumerateFiles(Settings.Settings.StatsPath, "PartialStats_*.xml",
SearchOption.TopDirectoryOnly);
foreach(string statsFile in statsFiles)
@@ -366,7 +366,7 @@ namespace DiscImageChef.Core
CurrentStats.Filesystems.Add(nw);
}
public static void AddPartition(string partition)
internal static void AddPartition(string partition)
{
if(Settings.Settings.Current.Stats == null || !Settings.Settings.Current.Stats.PartitionStats) return;
@@ -502,24 +502,28 @@ namespace DiscImageChef.Core
if(old != null) AllStats.Devices.Remove(old);
DeviceStats nw = new DeviceStats();
nw.Model = dev.Model;
nw.Manufacturer = dev.Manufacturer;
nw.Revision = dev.Revision;
nw.Bus = deviceBus;
nw.ManufacturerSpecified = true;
DeviceStats nw = new DeviceStats
{
Model = dev.Model,
Manufacturer = dev.Manufacturer,
Revision = dev.Revision,
Bus = deviceBus,
ManufacturerSpecified = true
};
AllStats.Devices.Add(nw);
old = CurrentStats.Devices.FirstOrDefault(ds => ds.Manufacturer == dev.Manufacturer && ds.Model == dev.Model && ds.Revision == dev.Revision && ds.Bus == deviceBus);
if(old != null) CurrentStats.Devices.Remove(old);
nw = new DeviceStats();
nw.Model = dev.Model;
nw.Manufacturer = dev.Manufacturer;
nw.Revision = dev.Revision;
nw.Bus = deviceBus;
nw.ManufacturerSpecified = true;
nw = new DeviceStats
{
Model = dev.Model,
Manufacturer = dev.Manufacturer,
Revision = dev.Revision,
Bus = deviceBus,
ManufacturerSpecified = true
};
CurrentStats.Devices.Add(nw);
}
@@ -572,16 +576,10 @@ namespace DiscImageChef.Core
{
if(Settings.Settings.Current.Stats == null || !Settings.Settings.Current.Stats.BenchmarkStats) return;
CurrentStats.Benchmark = new BenchmarkStats();
CurrentStats.Benchmark.Checksum = new List<ChecksumStats>();
AllStats.Benchmark = new BenchmarkStats();
AllStats.Benchmark.Checksum = new List<ChecksumStats>();
CurrentStats.Benchmark = new BenchmarkStats {Checksum = new List<ChecksumStats>()};
AllStats.Benchmark = new BenchmarkStats {Checksum = new List<ChecksumStats>()};
foreach(KeyValuePair<string, double> kvp in checksums)
{
ChecksumStats st = new ChecksumStats();
st.algorithm = kvp.Key;
st.Value = kvp.Value;
foreach(ChecksumStats st in checksums.Select(kvp => new ChecksumStats {algorithm = kvp.Key, Value = kvp.Value})) {
CurrentStats.Benchmark.Checksum.Add(st);
AllStats.Benchmark.Checksum.Add(st);
}
@@ -605,17 +603,12 @@ namespace DiscImageChef.Core
if(CurrentStats.Verify == null)
{
CurrentStats.Verify = new VerifyStats();
CurrentStats.Verify.MediaImages = new VerifiedItems();
CurrentStats.Verify.Sectors = new ScannedSectors();
CurrentStats.Verify =
new VerifyStats {MediaImages = new VerifiedItems(), Sectors = new ScannedSectors()};
}
if(AllStats.Verify == null)
{
AllStats.Verify = new VerifyStats();
AllStats.Verify.MediaImages = new VerifiedItems();
AllStats.Verify.Sectors = new ScannedSectors();
}
{ AllStats.Verify = new VerifyStats {MediaImages = new VerifiedItems(), Sectors = new ScannedSectors()}; }
if(mediaVerified.HasValue)
if(mediaVerified.Value)
@@ -646,18 +639,10 @@ namespace DiscImageChef.Core
if(Settings.Settings.Current.Stats == null || !Settings.Settings.Current.Stats.MediaScanStats) return;
if(CurrentStats.MediaScan == null)
{
CurrentStats.MediaScan = new MediaScanStats();
CurrentStats.MediaScan.Sectors = new ScannedSectors();
CurrentStats.MediaScan.Times = new TimeStats();
}
{ CurrentStats.MediaScan = new MediaScanStats {Sectors = new ScannedSectors(), Times = new TimeStats()}; }
if(AllStats.MediaScan == null)
{
AllStats.MediaScan = new MediaScanStats();
AllStats.MediaScan.Sectors = new ScannedSectors();
AllStats.MediaScan.Times = new TimeStats();
}
{ AllStats.MediaScan = new MediaScanStats {Sectors = new ScannedSectors(), Times = new TimeStats()}; }
CurrentStats.MediaScan.Sectors.Correct += correct;
CurrentStats.MediaScan.Sectors.Error += error;

View File

@@ -80,7 +80,7 @@ namespace DiscImageChef.Commands
break;
case DeviceType.MMC:
case DeviceType.SecureDigital:
SecureDigital.Report(dev, ref report, options.Debug, ref removable);
SecureDigital.Report(dev, ref report);
break;
case DeviceType.NVMe:
Nvme.Report(dev, ref report, options.Debug, ref removable);