General refactor.

This commit is contained in:
2018-06-20 22:22:21 +01:00
parent dc1884f5d8
commit ec8b309670
93 changed files with 850 additions and 1015 deletions

View File

@@ -97,7 +97,6 @@ namespace DiscImageChef.Core
Random rnd = new Random();
DateTime start;
DateTime end;
long mem;
start = DateTime.Now;
InitProgress();
@@ -116,7 +115,7 @@ namespace DiscImageChef.Core
results.FillSpeed = bufferSize / 1048576.0 / (end - start).TotalSeconds;
ms.Seek(0, SeekOrigin.Begin);
mem = GC.GetTotalMemory(false);
long mem = GC.GetTotalMemory(false);
if(mem > results.MaxMemory) results.MaxMemory = mem;
if(mem < results.MinMemory) results.MinMemory = mem;
start = DateTime.Now;

View File

@@ -398,8 +398,8 @@ namespace DiscImageChef.Core
IChecksum sha384CtxData = null;
IChecksum sha512CtxData = null;
IChecksum ssctxData = null;
IChecksum f16ctxData = null;
IChecksum f32ctxData = null;
IChecksum f16CtxData = null;
IChecksum f32CtxData = null;
Thread adlerThreadData = new Thread(UpdateHash);
Thread crc16ThreadData = new Thread(UpdateHash);
@@ -494,15 +494,15 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.Fletcher16))
{
f16ctxData = new Fletcher16Context();
HashPacket f16PktData = new HashPacket {Context = f16ctxData, Data = data};
f16CtxData = new Fletcher16Context();
HashPacket f16PktData = new HashPacket {Context = f16CtxData, Data = data};
f16ThreadData.Start(f16PktData);
}
if(enabled.HasFlag(EnableChecksum.Fletcher32))
{
f32ctxData = new Fletcher32Context();
HashPacket f32PktData = new HashPacket {Context = f32ctxData, Data = data};
f32CtxData = new Fletcher32Context();
HashPacket f32PktData = new HashPacket {Context = f32CtxData, Data = data};
f32ThreadData.Start(f32PktData);
}
@@ -582,13 +582,13 @@ namespace DiscImageChef.Core
if(enabled.HasFlag(EnableChecksum.Fletcher16))
{
chk = new ChecksumType {type = ChecksumTypeType.fletcher16, Value = f16ctxData.End()};
chk = new ChecksumType {type = ChecksumTypeType.fletcher16, Value = f16CtxData.End()};
dataChecksums.Add(chk);
}
if(enabled.HasFlag(EnableChecksum.Fletcher32))
{
chk = new ChecksumType {type = ChecksumTypeType.fletcher32, Value = f32ctxData.End()};
chk = new ChecksumType {type = ChecksumTypeType.fletcher32, Value = f32CtxData.End()};
dataChecksums.Add(chk);
}

View File

@@ -54,7 +54,7 @@ namespace DiscImageChef.Core.Devices.Dumping
/// <summary>
/// Implements dumping ATA devices
/// </summary>
public class Ata
public static class Ata
{
/// <summary>
/// Dumps an ATA device

View File

@@ -97,7 +97,7 @@ namespace DiscImageChef.Core.Devices.Dumping
DateTime start;
DateTime end;
bool readcd;
bool read6 = false, read10 = false, read12 = false, read16 = false;
bool read6 = false, read10 = false, read12 = false, read16 = false;
bool sense = false;
const uint SECTOR_SIZE = 2352;
FullTOC.CDFullTOC? toc = null;
@@ -289,8 +289,8 @@ namespace DiscImageChef.Core.Devices.Dumping
dev.Timeout, out _);
dumpLog.WriteLine("Checking if drive supports READ(12)...");
DicConsole.WriteLine("Checking if drive supports READ(12)...");
read12 = !dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, 2048, 0,
1, false, dev.Timeout, out _);
read12 = !dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, 2048, 0, 1,
false, dev.Timeout, out _);
dumpLog.WriteLine("Checking if drive supports READ(16)...");
DicConsole.WriteLine("Checking if drive supports READ(16)...");
read16 = !dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, 0, 2048, 0, 1, false,
@@ -308,16 +308,19 @@ namespace DiscImageChef.Core.Devices.Dumping
dumpLog.WriteLine("Drive supports READ(6)...");
DicConsole.WriteLine("Drive supports READ(6)...");
}
if(read10)
{
dumpLog.WriteLine("Drive supports READ(10)...");
DicConsole.WriteLine("Drive supports READ(10)...");
}
if(read12)
{
dumpLog.WriteLine("Drive supports READ(12)...");
DicConsole.WriteLine("Drive supports READ(12)...");
}
if(read16)
{
dumpLog.WriteLine("Drive supports READ(16)...");
@@ -535,15 +538,15 @@ namespace DiscImageChef.Core.Devices.Dumping
Array.Copy(cmdBuf, 0, temp, 0, 8);
Array.Reverse(temp);
lastSector = (long)BitConverter.ToUInt64(temp, 0);
blockSize = (uint)((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + cmdBuf[7]);
blockSize = (uint)((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + cmdBuf[7]);
}
else
{
sense = dev.ReadCapacity(out cmdBuf, out senseBuf, dev.Timeout, out _);
if(!sense)
{
lastSector = (long)((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3]);
blockSize = (uint)((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + cmdBuf[7]);
lastSector = (cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + cmdBuf[3];
blockSize = (uint)((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + cmdBuf[7]);
}
}
@@ -736,25 +739,26 @@ namespace DiscImageChef.Core.Devices.Dumping
}
else if(read16)
{
sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, 0, blockSize, 0, blocksToRead, false,
dev.Timeout, out _);
sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, 0, blockSize, 0,
blocksToRead, false, dev.Timeout, out _);
if(dev.Error || sense) blocksToRead /= 2;
}
else if(read12)
{
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, blocksToRead, false,
dev.Timeout, out _);
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, blockSize, 0,
blocksToRead, false, dev.Timeout, out _);
if(dev.Error || sense) blocksToRead /= 2;
}
else if(read10)
{
sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, (ushort)blocksToRead,
dev.Timeout, out _);
sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, 0, blockSize, 0,
(ushort)blocksToRead, dev.Timeout, out _);
if(dev.Error || sense) blocksToRead /= 2;
}
else if(read6)
{
sense = dev.Read6(out readBuffer, out senseBuf, 0, blockSize, (byte)blocksToRead, dev.Timeout, out _);
sense = dev.Read6(out readBuffer, out senseBuf, 0, blockSize, (byte)blocksToRead, dev.Timeout,
out _);
if(dev.Error || sense) blocksToRead /= 2;
}
@@ -810,7 +814,7 @@ namespace DiscImageChef.Core.Devices.Dumping
// If a subchannel is supported, check if output plugin allows us to write it.
if(supportedSubchannel != MmcSubchannel.None)
{
sense = dev.ReadCd(out readBuffer, out senseBuf, 0, blockSize, 1, MmcSectorTypes.AllTypes, false, false,
dev.ReadCd(out readBuffer, out senseBuf, 0, blockSize, 1, MmcSectorTypes.AllTypes, false, false,
true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, supportedSubchannel,
dev.Timeout, out _);
@@ -871,12 +875,11 @@ namespace DiscImageChef.Core.Devices.Dumping
sense = dev.ReadIsrc((byte)trk.TrackSequence, out string isrc, out _, out _, dev.Timeout, out _);
if(sense || isrc == null || isrc == "000000000000") continue;
if(outputPlugin.WriteSectorTag(Encoding.ASCII.GetBytes(isrc), trk.TrackStartSector,
SectorTagType.CdTrackIsrc))
{
DicConsole.WriteLine("Setting ISRC for track {0} to {1}", trk.TrackSequence, isrc);
dumpLog.WriteLine("Setting ISRC for track {0} to {1}", trk.TrackSequence, isrc);
}
if(!outputPlugin.WriteSectorTag(Encoding.ASCII.GetBytes(isrc), trk.TrackStartSector,
SectorTagType.CdTrackIsrc)) continue;
DicConsole.WriteLine("Setting ISRC for track {0} to {1}", trk.TrackSequence, isrc);
dumpLog.WriteLine("Setting ISRC for track {0} to {1}", trk.TrackSequence, isrc);
}
if(resume.NextBlock > 0) dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock);
@@ -922,24 +925,17 @@ namespace DiscImageChef.Core.Devices.Dumping
totalDuration += cmdDuration;
}
else if(read16)
{
sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, i, blockSize, 0, blocksToRead, false,
dev.Timeout, out cmdDuration);
}
sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, i, blockSize, 0,
blocksToRead, false, dev.Timeout, out cmdDuration);
else if(read12)
{
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)i, blockSize, 0, blocksToRead, false,
dev.Timeout, out cmdDuration);
}
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)i,
blockSize, 0, blocksToRead, false, dev.Timeout, out cmdDuration);
else if(read10)
{
sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)i, blockSize, 0, (ushort)blocksToRead,
dev.Timeout, out cmdDuration);
}
sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)i,
blockSize, 0, (ushort)blocksToRead, dev.Timeout, out cmdDuration);
else if(read6)
{
sense = dev.Read6(out readBuffer, out senseBuf, (uint)i, blockSize, (byte)blocksToRead, dev.Timeout, out cmdDuration);
}
sense = dev.Read6(out readBuffer, out senseBuf, (uint)i, blockSize, (byte)blocksToRead,
dev.Timeout, out cmdDuration);
if(!sense && !dev.Error)
{
@@ -1034,34 +1030,29 @@ namespace DiscImageChef.Core.Devices.Dumping
DicConsole.Write("\rTrimming sector {0}", badSector);
double cmdDuration = 0;
if(readcd)
{
sense = true;
sense = dev.ReadCd(out readBuffer, out senseBuf, (uint)badSector, blockSize, 1,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true,
true, MmcErrorField.None, supportedSubchannel, dev.Timeout,
out double cmdDuration);
totalDuration += cmdDuration;
out cmdDuration);
}
else if(read16)
{
sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, badSector, blockSize, 0, blocksToRead, false,
dev.Timeout, out double cmdDuration);
}
sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, badSector, blockSize, 0,
blocksToRead, false, dev.Timeout, out cmdDuration);
else if(read12)
{
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)badSector, blockSize, 0, blocksToRead, false,
dev.Timeout, out double cmdDuration);
}
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)badSector,
blockSize, 0, blocksToRead, false, dev.Timeout, out cmdDuration);
else if(read10)
{
sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)badSector, blockSize, 0, (ushort)blocksToRead,
dev.Timeout, out double cmdDuration);
}
sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)badSector,
blockSize, 0, (ushort)blocksToRead, dev.Timeout, out cmdDuration);
else if(read6)
{
sense = dev.Read6(out readBuffer, out senseBuf, (uint)badSector, blockSize, (byte)blocksToRead, dev.Timeout, out double cmdDuration);
}
sense = dev.Read6(out readBuffer, out senseBuf, (uint)badSector, blockSize, (byte)blocksToRead,
dev.Timeout, out cmdDuration);
totalDuration += cmdDuration;
if(sense || dev.Error) continue;
@@ -1103,24 +1094,23 @@ namespace DiscImageChef.Core.Devices.Dumping
if(persistent)
{
Modes.ModePage_01_MMC pgMmc;
sense = dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01,
dev.Timeout, out _);
if(sense)
{
sense = dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current,
0x01, dev.Timeout, out _);
sense = dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01,
dev.Timeout, out _);
if(!sense)
{
Modes.DecodedMode? dcMode10 =
Modes.DecodeMode10(readBuffer, PeripheralDeviceTypes.MultiMediaDevice);
if(dcMode10.HasValue)
{
foreach(Modes.ModePage modePage in dcMode10.Value.Pages)
if(modePage.Page == 0x01 && modePage.Subpage == 0x00) currentModePage = modePage;
}
if(modePage.Page == 0x01 && modePage.Subpage == 0x00)
currentModePage = modePage;
}
}
else
@@ -1129,18 +1119,14 @@ namespace DiscImageChef.Core.Devices.Dumping
Modes.DecodeMode6(readBuffer, PeripheralDeviceTypes.MultiMediaDevice);
if(dcMode6.HasValue)
{
foreach(Modes.ModePage modePage in dcMode6.Value.Pages)
if(modePage.Page == 0x01 && modePage.Subpage == 0x00)
currentModePage = modePage;
}
}
if(currentModePage == null)
{
pgMmc =
new Modes.ModePage_01_MMC {PS = false, ReadRetryCount = 32, Parameter = 0x00};
pgMmc = new Modes.ModePage_01_MMC {PS = false, ReadRetryCount = 32, Parameter = 0x00};
currentModePage = new Modes.ModePage
{
Page = 0x01,
@@ -1148,9 +1134,8 @@ namespace DiscImageChef.Core.Devices.Dumping
PageResponse = Modes.EncodeModePage_01_MMC(pgMmc)
};
}
pgMmc =
new Modes.ModePage_01_MMC {PS = false, ReadRetryCount = 255, Parameter = 0x20};
pgMmc = new Modes.ModePage_01_MMC {PS = false, ReadRetryCount = 255, Parameter = 0x20};
Modes.DecodedMode md = new Modes.DecodedMode
{
Header = new Modes.ModeHeader(),
@@ -1199,7 +1184,6 @@ namespace DiscImageChef.Core.Devices.Dumping
if(readcd)
{
sense = true;
sense = dev.ReadCd(out readBuffer, out senseBuf, (uint)badSector, blockSize, 1,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true,
true, MmcErrorField.None, supportedSubchannel, dev.Timeout,
@@ -1278,7 +1262,6 @@ namespace DiscImageChef.Core.Devices.Dumping
runningPersistent = true;
DicConsole.WriteLine();
tmpArray = resume.BadBlocks.ToArray();
foreach(ulong badSector in sectorsNotEvenPartial)
{
if(aborted)
@@ -1299,21 +1282,20 @@ namespace DiscImageChef.Core.Devices.Dumping
totalDuration += cmdDuration;
}
if(!sense && !dev.Error)
{
dumpLog.WriteLine("Got partial data for sector {0} in pass {1}.", badSector, pass);
if(sense || dev.Error) continue;
if(supportedSubchannel != MmcSubchannel.None)
{
byte[] data = new byte[SECTOR_SIZE];
byte[] sub = new byte[subSize];
Array.Copy(readBuffer, 0, data, 0, SECTOR_SIZE);
Array.Copy(readBuffer, SECTOR_SIZE, sub, 0, subSize);
outputPlugin.WriteSectorLong(data, badSector);
outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel);
}
else outputPlugin.WriteSectorLong(readBuffer, badSector);
dumpLog.WriteLine("Got partial data for sector {0} in pass {1}.", badSector, pass);
if(supportedSubchannel != MmcSubchannel.None)
{
byte[] data = new byte[SECTOR_SIZE];
byte[] sub = new byte[subSize];
Array.Copy(readBuffer, 0, data, 0, SECTOR_SIZE);
Array.Copy(readBuffer, SECTOR_SIZE, sub, 0, subSize);
outputPlugin.WriteSectorLong(data, badSector);
outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel);
}
else outputPlugin.WriteSectorLong(readBuffer, badSector);
}
}
}

View File

@@ -87,13 +87,11 @@ namespace DiscImageChef.Core.Devices.Dumping
bool nometadata, bool notrim)
{
bool sense;
ulong blocks;
byte[] tmpBuf;
bool compactDisc = true;
bool isXbox = false;
// TODO: Log not only what is it reading, but if it was read correctly or not.
sense = dev.GetConfiguration(out byte[] cmdBuf, out _, 0, MmcGetConfigurationRt.Current, dev.Timeout,
out _);
if(!sense)
@@ -205,7 +203,7 @@ namespace DiscImageChef.Core.Devices.Dumping
}
Reader scsiReader = new Reader(dev, dev.Timeout, null, dumpRaw);
blocks = scsiReader.GetDeviceBlocks();
ulong blocks = scsiReader.GetDeviceBlocks();
dumpLog.WriteLine("Device reports disc has {0} blocks", blocks);
Dictionary<MediaTagType, byte[]> mediaTags = new Dictionary<MediaTagType, byte[]>();

View File

@@ -90,10 +90,6 @@ namespace DiscImageChef.Core.Devices.Dumping
bool nometadata, bool notrim)
{
bool sense;
ulong blocks;
uint blockSize;
uint logicalBlockSize;
uint physicalBlockSize;
byte scsiMediumType = 0;
byte scsiDensityCode = 0;
bool containsFloppyPage = false;
@@ -105,15 +101,14 @@ namespace DiscImageChef.Core.Devices.Dumping
double maxSpeed = double.MinValue;
double minSpeed = double.MaxValue;
byte[] readBuffer;
uint blocksToRead;
bool aborted = false;
System.Console.CancelKeyPress += (sender, e) => e.Cancel = aborted = true;
Modes.DecodedMode? decMode = null;
dumpLog.WriteLine("Initializing reader.");
Reader scsiReader = new Reader(dev, dev.Timeout, null, dumpRaw);
blocks = scsiReader.GetDeviceBlocks();
blockSize = scsiReader.LogicalBlockSize;
ulong blocks = scsiReader.GetDeviceBlocks();
uint blockSize = scsiReader.LogicalBlockSize;
if(scsiReader.FindReadCommand())
{
dumpLog.WriteLine("ERROR: Cannot find correct read command: {0}.", scsiReader.ErrorMessage);
@@ -136,9 +131,9 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
blocksToRead = scsiReader.BlocksToRead;
logicalBlockSize = blockSize;
physicalBlockSize = scsiReader.PhysicalBlockSize;
uint blocksToRead = scsiReader.BlocksToRead;
uint logicalBlockSize = blockSize;
uint physicalBlockSize = scsiReader.PhysicalBlockSize;
if(blocks == 0)
{
@@ -238,7 +233,6 @@ namespace DiscImageChef.Core.Devices.Dumping
}
DicConsole.ErrorWriteLine("Continuing dumping cooked data.");
dumpRaw = false;
}
else
{

View File

@@ -48,7 +48,7 @@ namespace DiscImageChef.Core.Devices.Dumping
/// <summary>
/// Implements dumping SCSI and ATAPI devices
/// </summary>
public class Scsi
public static class Scsi
{
// TODO: Get cartridge serial number from Certance vendor EVPD
/// <summary>

View File

@@ -93,7 +93,6 @@ namespace DiscImageChef.Core.Devices.Dumping
bool nometadata, bool notrim)
{
bool sense;
ulong blocks;
const uint BLOCK_SIZE = 2048;
uint blocksToRead = 64;
DateTime start;
@@ -130,8 +129,6 @@ namespace DiscImageChef.Core.Devices.Dumping
Array.Copy(ssBuf, 4, tmpBuf, 0, ssBuf.Length - 4);
mediaTags.Add(MediaTagType.Xbox_SecuritySector, tmpBuf);
ulong l0Video, l1Video, middleZone, gameSize, totalSize, layerBreak;
// Get video partition size
DicConsole.DebugWriteLine("Dump-media command", "Getting video partition size");
dumpLog.WriteLine("Locking drive.");
@@ -152,7 +149,7 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
totalSize = (ulong)((readBuffer[0] << 24) + (readBuffer[1] << 16) + (readBuffer[2] << 8) + readBuffer[3]);
ulong 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 _);
@@ -167,8 +164,8 @@ namespace DiscImageChef.Core.Devices.Dumping
Array.Copy(readBuffer, 4, tmpBuf, 0, readBuffer.Length - 4);
mediaTags.Add(MediaTagType.DVD_PFI, tmpBuf);
DicConsole.DebugWriteLine("Dump-media command", "Video partition total size: {0} sectors", totalSize);
l0Video = PFI.Decode(readBuffer).Value.Layer0EndPSN - PFI.Decode(readBuffer).Value.DataAreaStartPSN + 1;
l1Video = totalSize - l0Video + 1;
ulong l0Video = PFI.Decode(readBuffer).Value.Layer0EndPSN - PFI.Decode(readBuffer).Value.DataAreaStartPSN + 1;
ulong 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 _);
@@ -203,8 +200,8 @@ namespace DiscImageChef.Core.Devices.Dumping
return;
}
gameSize = (ulong)((readBuffer[0] << 24) + (readBuffer[1] << 16) + (readBuffer[2] << 8) + readBuffer[3]) +
1;
ulong gameSize = (ulong)((readBuffer[0] << 24) + (readBuffer[1] << 16) + (readBuffer[2] << 8) + readBuffer[3]) +
1;
DicConsole.DebugWriteLine("Dump-media command", "Game partition total size: {0} sectors", gameSize);
// Get middle zone size
@@ -239,11 +236,10 @@ namespace DiscImageChef.Core.Devices.Dumping
}
DicConsole.DebugWriteLine("Dump-media command", "Unlocked total size: {0} sectors", totalSize);
blocks = totalSize + 1;
middleZone =
totalSize - (PFI.Decode(readBuffer).Value.Layer0EndPSN -
PFI.Decode(readBuffer).Value.DataAreaStartPSN +
1) - gameSize + 1;
ulong blocks = totalSize + 1;
ulong middleZone = totalSize - (PFI.Decode(readBuffer).Value.Layer0EndPSN -
PFI.Decode(readBuffer).Value.DataAreaStartPSN +
1) - gameSize + 1;
tmpBuf = new byte[readBuffer.Length - 4];
Array.Copy(readBuffer, 4, tmpBuf, 0, readBuffer.Length - 4);
@@ -264,7 +260,7 @@ namespace DiscImageChef.Core.Devices.Dumping
mediaTags.Add(MediaTagType.Xbox_DMI, tmpBuf);
totalSize = l0Video + l1Video + middleZone * 2 + gameSize;
layerBreak = l0Video + middleZone + gameSize / 2;
ulong layerBreak = l0Video + middleZone + gameSize / 2;
DicConsole.WriteLine("Video layer 0 size: {0} sectors", l0Video);
DicConsole.WriteLine("Video layer 1 size: {0} sectors", l1Video);

View File

@@ -142,7 +142,7 @@ namespace DiscImageChef.Core.Devices
if(CanReadRaw && LongBlockSize == LogicalBlockSize)
if(LogicalBlockSize == 512)
foreach(ushort testSize in new[]
foreach(int i in new[]
{
// Long sector sizes for floppies
514,
@@ -152,6 +152,7 @@ namespace DiscImageChef.Core.Devices
600, 610, 630
})
{
ushort testSize = (ushort)i;
testSense = dev.ReadLong16(out _, out senseBuf, false, 0, testSize, timeout, out _);
if(!testSense && !dev.Error)
{
@@ -171,7 +172,7 @@ namespace DiscImageChef.Core.Devices
break;
}
else if(LogicalBlockSize == 1024)
foreach(ushort testSize in new[]
foreach(int i in new[]
{
// Long sector sizes for floppies
1026,
@@ -179,6 +180,7 @@ namespace DiscImageChef.Core.Devices
1200
})
{
ushort testSize = (ushort)i;
testSense = dev.ReadLong16(out _, out senseBuf, false, 0, testSize, timeout, out _);
if(!testSense && !dev.Error)
{

View File

@@ -534,7 +534,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(mediaTest.SupportsReadLong && mediaTest.LongBlockSize == mediaTest.BlockSize)
if(mediaTest.BlockSize == 512)
foreach(ushort testSize in new[]
foreach(int i in new[]
{
// Long sector sizes for floppies
514,
@@ -544,6 +544,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
600, 610, 630
})
{
ushort testSize = (ushort)i;
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0,
testSize, TIMEOUT, out _);
if(sense || dev.Error) continue;
@@ -554,7 +555,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
break;
}
else if(mediaTest.BlockSize == 1024)
foreach(ushort testSize in new[]
foreach(int i in new[]
{
// Long sector sizes for floppies
1026,
@@ -562,8 +563,9 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
1200
})
{
ushort testSize = (ushort)i;
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0,
testSize, TIMEOUT, out _);
(ushort)i, TIMEOUT, out _);
if(sense || dev.Error) continue;
mediaTest.SupportsReadLong = true;
@@ -803,7 +805,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
if(report.SCSI.ReadCapabilities.SupportsReadLong &&
report.SCSI.ReadCapabilities.LongBlockSize == report.SCSI.ReadCapabilities.BlockSize)
if(report.SCSI.ReadCapabilities.BlockSize == 512)
foreach(ushort testSize in new[]
foreach(int i in new[]
{
// Long sector sizes for floppies
514,
@@ -813,7 +815,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
600, 610, 630
})
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, testSize,
ushort testSize = (ushort)i;
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, (ushort)i,
TIMEOUT, out _);
if(sense || dev.Error) continue;
@@ -823,7 +826,7 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
break;
}
else if(report.SCSI.ReadCapabilities.BlockSize == 1024)
foreach(ushort testSize in new[]
foreach(int i in new[]
{
// Long sector sizes for floppies
1026,
@@ -831,7 +834,8 @@ namespace DiscImageChef.Core.Devices.Report.SCSI
1200
})
{
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, testSize,
ushort testSize = (ushort)i;
sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, (ushort)i,
TIMEOUT, out _);
if(sense || dev.Error) continue;

View File

@@ -45,7 +45,7 @@ namespace DiscImageChef.Core
bool quoted = false;
bool inValue = false;
string name = null;
string value = null;
string value;
StringBuilder sb = new StringBuilder();
if(options == null) return parsed;

View File

@@ -740,19 +740,21 @@ namespace DiscImageChef.Core
/// <summary>
/// Adds a new media scan to statistics
/// </summary>
/// <param name="lessThan3ms">Sectors &lt;3ms</param>
/// <param name="lessThan10ms">Sectors &gt;3ms and &lt;10ms</param>
/// <param name="lessThan50ms">Sectors &gt;10ms and &lt;50ms</param>
/// <param name="lessThan150ms">Sectors &gt;50ms and &lt;150ms</param>
/// <param name="lessThan500ms">Sectors &gt;150ms and &lt;500ms</param>
/// <param name="moreThan500ms">Sectors &gt;500ms</param>
/// <param name="lessThan3Ms">Sectors &lt;3ms</param>
/// <param name="lessThan10Ms">Sectors &gt;3ms and &lt;10ms</param>
/// <param name="lessThan50Ms">Sectors &gt;10ms and &lt;50ms</param>
/// <param name="lessThan150Ms">Sectors &gt;50ms and &lt;150ms</param>
/// <param name="lessThan500Ms">Sectors &gt;150ms and &lt;500ms</param>
/// <param name="moreThan500Ms">Sectors &gt;500ms</param>
/// <param name="total">Total sectors</param>
/// <param name="error">Errored sectors</param>
/// <param name="correct">Correct sectors</param>
public static void AddMediaScan(long lessThan3ms, long lessThan10ms, long lessThan50ms, long lessThan150ms,
long lessThan500ms, long moreThan500ms, long total, long error,
public static void AddMediaScan(long lessThan3Ms, long lessThan10Ms, long lessThan50Ms, long lessThan150Ms,
long lessThan500Ms, long moreThan500Ms, long total, long error,
long correct)
{
if(lessThan500Ms <= 0) throw new ArgumentOutOfRangeException(nameof(lessThan500Ms));
if(Settings.Settings.Current.Stats == null || !Settings.Settings.Current.Stats.MediaScanStats) return;
if(CurrentStats.MediaScan == null)
@@ -764,22 +766,22 @@ namespace DiscImageChef.Core
CurrentStats.MediaScan.Sectors.Correct += correct;
CurrentStats.MediaScan.Sectors.Error += error;
CurrentStats.MediaScan.Sectors.Total += total;
CurrentStats.MediaScan.Times.LessThan3ms += lessThan3ms;
CurrentStats.MediaScan.Times.LessThan10ms += lessThan10ms;
CurrentStats.MediaScan.Times.LessThan50ms += lessThan50ms;
CurrentStats.MediaScan.Times.LessThan150ms += lessThan150ms;
CurrentStats.MediaScan.Times.LessThan500ms += lessThan500ms;
CurrentStats.MediaScan.Times.MoreThan500ms += moreThan500ms;
CurrentStats.MediaScan.Times.LessThan3ms += lessThan3Ms;
CurrentStats.MediaScan.Times.LessThan10ms += lessThan10Ms;
CurrentStats.MediaScan.Times.LessThan50ms += lessThan50Ms;
CurrentStats.MediaScan.Times.LessThan150ms += lessThan150Ms;
CurrentStats.MediaScan.Times.LessThan500ms += lessThan500Ms;
CurrentStats.MediaScan.Times.MoreThan500ms += moreThan500Ms;
AllStats.MediaScan.Sectors.Correct += correct;
AllStats.MediaScan.Sectors.Error += error;
AllStats.MediaScan.Sectors.Total += total;
AllStats.MediaScan.Times.LessThan3ms += lessThan3ms;
AllStats.MediaScan.Times.LessThan10ms += lessThan10ms;
AllStats.MediaScan.Times.LessThan50ms += lessThan50ms;
AllStats.MediaScan.Times.LessThan150ms += lessThan150ms;
AllStats.MediaScan.Times.LessThan500ms += lessThan500ms;
AllStats.MediaScan.Times.MoreThan500ms += moreThan500ms;
AllStats.MediaScan.Times.LessThan3ms += lessThan3Ms;
AllStats.MediaScan.Times.LessThan10ms += lessThan10Ms;
AllStats.MediaScan.Times.LessThan50ms += lessThan50Ms;
AllStats.MediaScan.Times.LessThan150ms += lessThan150Ms;
AllStats.MediaScan.Times.LessThan500ms += lessThan500Ms;
AllStats.MediaScan.Times.MoreThan500ms += moreThan500Ms;
}
}
}