Refactor.

This commit is contained in:
2019-12-27 18:00:03 +00:00
parent 482c646f71
commit a81ab9a8d5
10 changed files with 1014 additions and 751 deletions

View File

@@ -42,7 +42,7 @@ namespace DiscImageChef.Core.Devices.Report
{
public TestedMedia ReportAtaMedia()
{
TestedMedia mediaTest = new TestedMedia();
var mediaTest = new TestedMedia();
DicConsole.Write("Please write a description of the media type and press enter: ");
mediaTest.MediumTypeName = System.Console.ReadLine();
DicConsole.Write("Please write the media model and press enter: ");
@@ -60,27 +60,34 @@ namespace DiscImageChef.Core.Devices.Report
{
Identify.IdentifyDevice ataId = mediaTest.IdentifyDevice.Value;
if(ataId.UnformattedBPT != 0) mediaTest.UnformattedBPT = ataId.UnformattedBPT;
if(ataId.UnformattedBPT != 0)
mediaTest.UnformattedBPT = ataId.UnformattedBPT;
if(ataId.UnformattedBPS != 0) mediaTest.UnformattedBPS = ataId.UnformattedBPS;
if(ataId.UnformattedBPS != 0)
mediaTest.UnformattedBPS = ataId.UnformattedBPS;
if(ataId.Cylinders > 0 && ataId.Heads > 0 && ataId.SectorsPerTrack > 0)
if(ataId.Cylinders > 0 &&
ataId.Heads > 0 &&
ataId.SectorsPerTrack > 0)
{
mediaTest.CHS = new Chs
{
Cylinders = ataId.Cylinders, Heads = ataId.Heads, Sectors = ataId.SectorsPerTrack
};
mediaTest.Blocks = (ulong)(ataId.Cylinders * ataId.Heads * ataId.SectorsPerTrack);
}
if(ataId.CurrentCylinders > 0 && ataId.CurrentHeads > 0 && ataId.CurrentSectorsPerTrack > 0)
if(ataId.CurrentCylinders > 0 &&
ataId.CurrentHeads > 0 &&
ataId.CurrentSectorsPerTrack > 0)
{
mediaTest.CurrentCHS = new Chs
{
Cylinders = ataId.CurrentCylinders,
Heads = ataId.CurrentHeads,
Cylinders = ataId.CurrentCylinders, Heads = ataId.CurrentHeads,
Sectors = ataId.CurrentSectorsPerTrack
};
if(mediaTest.Blocks == 0)
mediaTest.Blocks =
(ulong)(ataId.CurrentCylinders * ataId.CurrentHeads * ataId.CurrentSectorsPerTrack);
@@ -98,7 +105,8 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.Blocks = ataId.LBA48Sectors;
}
if(ataId.NominalRotationRate != 0x0000 && ataId.NominalRotationRate != 0xFFFF)
if(ataId.NominalRotationRate != 0x0000 &&
ataId.NominalRotationRate != 0xFFFF)
if(ataId.NominalRotationRate == 0x0001)
mediaTest.SolidStateDevice = true;
else
@@ -107,40 +115,48 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.NominalRotationRate = ataId.NominalRotationRate;
}
uint logicalsectorsize;
uint physicalsectorsize;
if((ataId.PhysLogSectorSize & 0x8000) == 0x0000 && (ataId.PhysLogSectorSize & 0x4000) == 0x4000)
uint logicalSectorSize;
uint physicalSectorSize;
if((ataId.PhysLogSectorSize & 0x8000) == 0x0000 &&
(ataId.PhysLogSectorSize & 0x4000) == 0x4000)
{
if((ataId.PhysLogSectorSize & 0x1000) == 0x1000)
if(ataId.LogicalSectorWords <= 255 || ataId.LogicalAlignment == 0xFFFF)
logicalsectorsize = 512;
if(ataId.LogicalSectorWords <= 255 ||
ataId.LogicalAlignment == 0xFFFF)
logicalSectorSize = 512;
else
logicalsectorsize = ataId.LogicalSectorWords * 2;
else logicalsectorsize = 512;
logicalSectorSize = ataId.LogicalSectorWords * 2;
else
logicalSectorSize = 512;
if((ataId.PhysLogSectorSize & 0x2000) == 0x2000)
physicalsectorsize = (uint)(logicalsectorsize * ((1 << ataId.PhysLogSectorSize) & 0xF));
else physicalsectorsize = logicalsectorsize;
physicalSectorSize = (uint)(logicalSectorSize * ((1 << ataId.PhysLogSectorSize) & 0xF));
else
physicalSectorSize = logicalSectorSize;
}
else
{
logicalsectorsize = 512;
physicalsectorsize = 512;
logicalSectorSize = 512;
physicalSectorSize = 512;
}
mediaTest.BlockSize = logicalsectorsize;
if(physicalsectorsize != logicalsectorsize)
{
mediaTest.PhysicalBlockSize = physicalsectorsize;
mediaTest.BlockSize = logicalSectorSize;
if((ataId.LogicalAlignment & 0x8000) == 0x0000 && (ataId.LogicalAlignment & 0x4000) == 0x4000)
if(physicalSectorSize != logicalSectorSize)
{
mediaTest.PhysicalBlockSize = physicalSectorSize;
if((ataId.LogicalAlignment & 0x8000) == 0x0000 &&
(ataId.LogicalAlignment & 0x4000) == 0x4000)
mediaTest.LogicalAlignment = (ushort)(ataId.LogicalAlignment & 0x3FFF);
}
if(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF)
mediaTest.LongBlockSize = logicalsectorsize + ataId.EccBytes;
if(ataId.EccBytes != 0x0000 &&
ataId.EccBytes != 0xFFFF)
mediaTest.LongBlockSize = logicalSectorSize + ataId.EccBytes;
if(ataId.UnformattedBPS > logicalsectorsize &&
if(ataId.UnformattedBPS > logicalSectorSize &&
(!(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF) || mediaTest.LongBlockSize == 516))
mediaTest.LongBlockSize = ataId.UnformattedBPS;
@@ -149,6 +165,7 @@ namespace DiscImageChef.Core.Devices.Report
ataId.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial))
{
mediaTest.CanReadMediaSerial = true;
if(!string.IsNullOrWhiteSpace(ataId.MediaManufacturer))
mediaTest.Manufacturer = ataId.MediaManufacturer;
}
@@ -157,106 +174,139 @@ namespace DiscImageChef.Core.Devices.Report
bool sense;
DicConsole.WriteLine("Trying READ SECTOR(S) in CHS mode...");
sense = _dev.Read(out byte[] readBuf, out AtaErrorRegistersChs errorChs, false, 0, 0, 1, 1, _dev.Timeout,
out _);
sense = _dev.Read(out byte[] readBuf, out AtaErrorRegistersChs errorChs, false, 0, 0, 1, 1,
_dev.Timeout, out _);
mediaTest.SupportsReadSectors = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadSectorsData = readBuf;
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in CHS mode...");
sense = _dev.Read(out readBuf, out errorChs, true, 0, 0, 1, 1, _dev.Timeout, out _);
mediaTest.SupportsReadRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadSectorsRetryData = readBuf;
DicConsole.WriteLine("Trying READ DMA in CHS mode...");
sense = _dev.ReadDma(out readBuf, out errorChs, false, 0, 0, 1, 1, _dev.Timeout, out _);
mediaTest.SupportsReadDma = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadDmaData = readBuf;
DicConsole.WriteLine("Trying READ DMA RETRY in CHS mode...");
sense = _dev.ReadDma(out readBuf, out errorChs, true, 0, 0, 1, 1, _dev.Timeout, out _);
mediaTest.SupportsReadDmaRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadDmaRetryData = readBuf;
DicConsole.WriteLine("Trying SEEK in CHS mode...");
sense = _dev.Seek(out errorChs, 0, 0, 1, _dev.Timeout, out _);
mediaTest.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 AtaErrorRegistersLba28 errorLba, false, 0, 1, _dev.Timeout, out _);
mediaTest.SupportsReadLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadLbaData = readBuf;
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in LBA mode...");
sense = _dev.Read(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
mediaTest.SupportsReadRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadRetryLbaData = readBuf;
DicConsole.WriteLine("Trying READ DMA in LBA mode...");
sense = _dev.ReadDma(out readBuf, out errorLba, false, 0, 1, _dev.Timeout, out _);
mediaTest.SupportsReadDmaLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadDmaLbaData = readBuf;
DicConsole.WriteLine("Trying READ DMA RETRY in LBA mode...");
sense = _dev.ReadDma(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
mediaTest.SupportsReadDmaRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadDmaRetryLbaData = readBuf;
DicConsole.WriteLine("Trying SEEK in LBA mode...");
sense = _dev.Seek(out errorLba, 0, _dev.Timeout, out _);
mediaTest.SupportsSeekLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.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 LBA48 mode...");
sense = _dev.Read(out readBuf, out AtaErrorRegistersLba48 errorLba48, 0, 1, _dev.Timeout, out _);
mediaTest.SupportsReadLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 && errorLba48.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadLba48Data = readBuf;
DicConsole.WriteLine("Trying READ DMA in LBA48 mode...");
sense = _dev.ReadDma(out readBuf, out errorLba48, 0, 1, _dev.Timeout, out _);
mediaTest.SupportsReadDmaLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 &&
errorLba48.Error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadDmaLba48Data = readBuf;
// Send SET FEATURES before sending READ LONG commands, retrieve IDENTIFY again and
@@ -265,95 +315,120 @@ namespace DiscImageChef.Core.Devices.Report
_dev.SetFeatures(out _, AtaFeatures.EnableReadLongVendorLength, 0, 0, 1, 0, _dev.Timeout, out _);
_dev.AtaIdentify(out buffer, out _, _dev.Timeout, out _);
if(Identify.Decode(buffer).HasValue)
{
ataId = Identify.Decode(buffer).Value;
if(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF)
mediaTest.LongBlockSize = logicalsectorsize + ataId.EccBytes;
if(ataId.UnformattedBPS > logicalsectorsize &&
if(ataId.EccBytes != 0x0000 &&
ataId.EccBytes != 0xFFFF)
mediaTest.LongBlockSize = logicalSectorSize + ataId.EccBytes;
if(ataId.UnformattedBPS > logicalSectorSize &&
(!(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF) || mediaTest.LongBlockSize == 516))
mediaTest.LongBlockSize = ataId.UnformattedBPS;
}
DicConsole.WriteLine("Trying READ LONG in CHS mode...");
sense = _dev.ReadLong(out readBuf, out errorChs, false, 0, 0, 1, mediaTest.LongBlockSize ?? 0,
_dev.Timeout, out _);
mediaTest.SupportsReadLong = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadLongData = readBuf;
DicConsole.WriteLine("Trying READ LONG RETRY in CHS mode...");
sense = _dev.ReadLong(out readBuf, out errorChs, true, 0, 0, 1, mediaTest.LongBlockSize ?? 0,
_dev.Timeout, out _);
mediaTest.SupportsReadLongRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) !=
checkCorrectRead;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadLongRetryData = readBuf;
DicConsole.WriteLine("Trying READ LONG in LBA mode...");
sense = _dev.ReadLong(out readBuf, out errorLba, false, 0, mediaTest.LongBlockSize ?? 0, _dev.Timeout,
out _);
mediaTest.SupportsReadLongLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadLongLbaData = readBuf;
DicConsole.WriteLine("Trying READ LONG RETRY in LBA mode...");
sense = _dev.ReadLong(out readBuf, out errorLba, true, 0, mediaTest.LongBlockSize ?? 0, _dev.Timeout,
out _);
mediaTest.SupportsReadLongRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 &&
errorLba.Error == 0 && readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
DicConsole.DebugWriteLine("ATA Report",
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
errorChs.Status, errorChs.Error, readBuf.Length);
mediaTest.ReadLongRetryLbaData = readBuf;
}
else mediaTest.MediaIsRecognized = false;
else
mediaTest.MediaIsRecognized = false;
return mediaTest;
}
/// <summary>
/// Creates a report of an ATA device
/// </summary>
/// <summary>Creates a report of an ATA device</summary>
public TestedMedia ReportAta(Identify.IdentifyDevice ataId)
{
TestedMedia capabilities = new TestedMedia();
var capabilities = new TestedMedia();
if(ataId.UnformattedBPT != 0) capabilities.UnformattedBPT = ataId.UnformattedBPT;
if(ataId.UnformattedBPT != 0)
capabilities.UnformattedBPT = ataId.UnformattedBPT;
if(ataId.UnformattedBPS != 0) capabilities.UnformattedBPS = ataId.UnformattedBPS;
if(ataId.UnformattedBPS != 0)
capabilities.UnformattedBPS = ataId.UnformattedBPS;
if(ataId.Cylinders > 0 && ataId.Heads > 0 && ataId.SectorsPerTrack > 0)
if(ataId.Cylinders > 0 &&
ataId.Heads > 0 &&
ataId.SectorsPerTrack > 0)
{
capabilities.CHS = new Chs
{
Cylinders = ataId.Cylinders, Heads = ataId.Heads, Sectors = ataId.SectorsPerTrack
};
capabilities.Blocks = (ulong)(ataId.Cylinders * ataId.Heads * ataId.SectorsPerTrack);
}
if(ataId.CurrentCylinders > 0 && ataId.CurrentHeads > 0 && ataId.CurrentSectorsPerTrack > 0)
if(ataId.CurrentCylinders > 0 &&
ataId.CurrentHeads > 0 &&
ataId.CurrentSectorsPerTrack > 0)
{
capabilities.CurrentCHS = new Chs
{
Cylinders = ataId.CurrentCylinders,
Heads = ataId.CurrentHeads,
Cylinders = ataId.CurrentCylinders, Heads = ataId.CurrentHeads,
Sectors = ataId.CurrentSectorsPerTrack
};
capabilities.Blocks =
(ulong)(ataId.CurrentCylinders * ataId.CurrentHeads * ataId.CurrentSectorsPerTrack);
}
@@ -370,7 +445,8 @@ namespace DiscImageChef.Core.Devices.Report
capabilities.Blocks = ataId.LBA48Sectors;
}
if(ataId.NominalRotationRate != 0x0000 && ataId.NominalRotationRate != 0xFFFF)
if(ataId.NominalRotationRate != 0x0000 &&
ataId.NominalRotationRate != 0xFFFF)
if(ataId.NominalRotationRate == 0x0001)
capabilities.SolidStateDevice = true;
else
@@ -379,40 +455,48 @@ namespace DiscImageChef.Core.Devices.Report
capabilities.NominalRotationRate = ataId.NominalRotationRate;
}
uint logicalsectorsize;
uint physicalsectorsize;
if((ataId.PhysLogSectorSize & 0x8000) == 0x0000 && (ataId.PhysLogSectorSize & 0x4000) == 0x4000)
uint logicalSectorSize;
uint physicalSectorSize;
if((ataId.PhysLogSectorSize & 0x8000) == 0x0000 &&
(ataId.PhysLogSectorSize & 0x4000) == 0x4000)
{
if((ataId.PhysLogSectorSize & 0x1000) == 0x1000)
if(ataId.LogicalSectorWords <= 255 || ataId.LogicalAlignment == 0xFFFF)
logicalsectorsize = 512;
if(ataId.LogicalSectorWords <= 255 ||
ataId.LogicalAlignment == 0xFFFF)
logicalSectorSize = 512;
else
logicalsectorsize = ataId.LogicalSectorWords * 2;
else logicalsectorsize = 512;
logicalSectorSize = ataId.LogicalSectorWords * 2;
else
logicalSectorSize = 512;
if((ataId.PhysLogSectorSize & 0x2000) == 0x2000)
physicalsectorsize = logicalsectorsize * (uint)Math.Pow(2, ataId.PhysLogSectorSize & 0xF);
else physicalsectorsize = logicalsectorsize;
physicalSectorSize = logicalSectorSize * (uint)Math.Pow(2, ataId.PhysLogSectorSize & 0xF);
else
physicalSectorSize = logicalSectorSize;
}
else
{
logicalsectorsize = 512;
physicalsectorsize = 512;
logicalSectorSize = 512;
physicalSectorSize = 512;
}
capabilities.BlockSize = logicalsectorsize;
if(physicalsectorsize != logicalsectorsize)
{
capabilities.PhysicalBlockSize = physicalsectorsize;
capabilities.BlockSize = logicalSectorSize;
if((ataId.LogicalAlignment & 0x8000) == 0x0000 && (ataId.LogicalAlignment & 0x4000) == 0x4000)
if(physicalSectorSize != logicalSectorSize)
{
capabilities.PhysicalBlockSize = physicalSectorSize;
if((ataId.LogicalAlignment & 0x8000) == 0x0000 &&
(ataId.LogicalAlignment & 0x4000) == 0x4000)
capabilities.LogicalAlignment = (ushort)(ataId.LogicalAlignment & 0x3FFF);
}
if(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF)
capabilities.LongBlockSize = logicalsectorsize + ataId.EccBytes;
if(ataId.EccBytes != 0x0000 &&
ataId.EccBytes != 0xFFFF)
capabilities.LongBlockSize = logicalSectorSize + ataId.EccBytes;
if(ataId.UnformattedBPS > logicalsectorsize &&
if(ataId.UnformattedBPS > logicalSectorSize &&
(!(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF) || capabilities.LongBlockSize == 516))
capabilities.LongBlockSize = ataId.UnformattedBPS;
@@ -421,6 +505,7 @@ namespace DiscImageChef.Core.Devices.Report
ataId.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial))
{
capabilities.CanReadMediaSerial = true;
if(!string.IsNullOrWhiteSpace(ataId.MediaManufacturer))
capabilities.Manufacturer = ataId.MediaManufacturer;
}
@@ -429,96 +514,129 @@ namespace DiscImageChef.Core.Devices.Report
bool sense;
DicConsole.WriteLine("Trying READ SECTOR(S) in CHS mode...");
sense = _dev.Read(out byte[] readBuf, out AtaErrorRegistersChs errorChs, false, 0, 0, 1, 1, _dev.Timeout,
out _);
capabilities.SupportsReadSectors = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorChs.Status, errorChs.Error, readBuf.Length);
capabilities.ReadSectorsData = readBuf;
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in CHS mode...");
sense = _dev.Read(out readBuf, out errorChs, true, 0, 0, 1, 1, _dev.Timeout, out _);
capabilities.SupportsReadRetry =
!sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorChs.Status, errorChs.Error, readBuf.Length);
capabilities.ReadSectorsRetryData = readBuf;
DicConsole.WriteLine("Trying READ DMA in CHS mode...");
sense = _dev.ReadDma(out readBuf, out errorChs, false, 0, 0, 1, 1, _dev.Timeout, out _);
capabilities.SupportsReadDma =
!sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorChs.Status, errorChs.Error, readBuf.Length);
capabilities.ReadDmaData = readBuf;
DicConsole.WriteLine("Trying READ DMA RETRY in CHS mode...");
sense = _dev.ReadDma(out readBuf, out errorChs, true, 0, 0, 1, 1, _dev.Timeout, out _);
capabilities.SupportsReadDmaRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorChs.Status, errorChs.Error, readBuf.Length);
capabilities.ReadDmaRetryData = readBuf;
DicConsole.WriteLine("Trying SEEK in CHS mode...");
sense = _dev.Seek(out errorChs, 0, 0, 1, _dev.Timeout, out _);
capabilities.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 AtaErrorRegistersLba28 errorLba, false, 0, 1, _dev.Timeout, out _);
capabilities.SupportsReadLba =
!sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorLba.Status, errorLba.Error, readBuf.Length);
capabilities.ReadLbaData = readBuf;
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in LBA mode...");
sense = _dev.Read(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
capabilities.SupportsReadRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorLba.Status, errorLba.Error, readBuf.Length);
capabilities.ReadRetryLbaData = readBuf;
DicConsole.WriteLine("Trying READ DMA in LBA mode...");
sense = _dev.ReadDma(out readBuf, out errorLba, false, 0, 1, _dev.Timeout, out _);
capabilities.SupportsReadDmaLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorLba.Status, errorLba.Error, readBuf.Length);
capabilities.ReadDmaLbaData = readBuf;
DicConsole.WriteLine("Trying READ DMA RETRY in LBA mode...");
sense = _dev.ReadDma(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
capabilities.SupportsReadDmaRetryLba =
!sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 && readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorLba.Status, errorLba.Error, readBuf.Length);
capabilities.ReadDmaRetryLbaData = readBuf;
DicConsole.WriteLine("Trying SEEK in LBA mode...");
sense = _dev.Seek(out errorLba, 0, _dev.Timeout, out _);
capabilities.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 AtaErrorRegistersLba48 errorLba48, 0, 1, _dev.Timeout, out _);
capabilities.SupportsReadLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 && errorLba48.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorLba48.Status, errorLba48.Error, readBuf.Length);
capabilities.ReadLba48Data = readBuf;
DicConsole.WriteLine("Trying READ DMA in LBA48 mode...");
sense = _dev.ReadDma(out readBuf, out errorLba48, 0, 1, _dev.Timeout, out _);
capabilities.SupportsReadDmaLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 && errorLba48.Error == 0 &&
readBuf.Length > 0;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorLba48.Status, errorLba48.Error, readBuf.Length);
capabilities.ReadDmaLba48Data = readBuf;
// Send SET FEATURES before sending READ LONG commands, retrieve IDENTIFY again and
@@ -527,58 +645,77 @@ namespace DiscImageChef.Core.Devices.Report
_dev.SetFeatures(out _, AtaFeatures.EnableReadLongVendorLength, 0, 0, 1, 0, _dev.Timeout, out _);
_dev.AtaIdentify(out byte[] buffer, out _, _dev.Timeout, out _);
if(Identify.Decode(buffer).HasValue)
{
ataId = Identify.Decode(buffer).Value;
if(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF)
capabilities.LongBlockSize = logicalsectorsize + ataId.EccBytes;
if(ataId.UnformattedBPS > logicalsectorsize &&
if(ataId.EccBytes != 0x0000 &&
ataId.EccBytes != 0xFFFF)
capabilities.LongBlockSize = logicalSectorSize + ataId.EccBytes;
if(ataId.UnformattedBPS > logicalSectorSize &&
(!(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF) || capabilities.LongBlockSize == 516))
capabilities.LongBlockSize = ataId.UnformattedBPS;
}
DicConsole.WriteLine("Trying READ LONG in CHS mode...");
sense = _dev.ReadLong(out readBuf, out errorChs, false, 0, 0, 1, capabilities.LongBlockSize ?? 0,
_dev.Timeout, out _);
capabilities.SupportsReadLong = !sense && (errorChs.Status & 0x01) != 0x01 &&
errorChs.Error == 0 &&
readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorChs.Status, errorChs.Error, readBuf.Length);
capabilities.ReadLongData = readBuf;
DicConsole.WriteLine("Trying READ LONG RETRY in CHS mode...");
sense = _dev.ReadLong(out readBuf, out errorChs, true, 0, 0, 1, capabilities.LongBlockSize ?? 0, _dev.Timeout,
out _);
sense = _dev.ReadLong(out readBuf, out errorChs, true, 0, 0, 1, capabilities.LongBlockSize ?? 0,
_dev.Timeout, out _);
capabilities.SupportsReadLongRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) !=
checkCorrectRead;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorChs.Status, errorChs.Error, readBuf.Length);
capabilities.ReadLongRetryData = readBuf;
DicConsole.WriteLine("Trying READ LONG in LBA mode...");
sense = _dev.ReadLong(out readBuf, out errorLba, false, 0, capabilities.LongBlockSize ?? 0, _dev.Timeout,
out _);
capabilities.SupportsReadLongLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorLba.Status, errorLba.Error, readBuf.Length);
capabilities.ReadLongLbaData = readBuf;
DicConsole.WriteLine("Trying READ LONG RETRY in LBA mode...");
sense = _dev.ReadLong(out readBuf, out errorLba, true, 0, capabilities.LongBlockSize ?? 0, _dev.Timeout,
out _);
capabilities.SupportsReadLongRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
readBuf.Length > 0 &&
BitConverter.ToUInt64(readBuf, 0) !=
checkCorrectRead;
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
sense, errorLba.Status, errorLba.Error, readBuf.Length);
capabilities.ReadLongRetryLbaData = readBuf;
return capabilities;

View File

@@ -36,11 +36,8 @@ namespace DiscImageChef.Core.Devices.Report
{
public partial class DeviceReport
{
Device _dev;
readonly Device _dev;
public DeviceReport(Device device)
{
_dev = device;
}
public DeviceReport(Device device) => _dev = device;
}
}

View File

@@ -34,20 +34,13 @@ using DiscImageChef.CommonTypes.Metadata;
namespace DiscImageChef.Core.Devices.Report
{
/// <summary>
/// Implements creating a report for a FireWire device
/// </summary>
/// <summary>Implements creating a report for a FireWire device</summary>
public partial class DeviceReport
{
/// <summary>
/// Fills a device report with parameters specific to a FireWire device
/// </summary>
public FireWire FireWireReport() =>
new FireWire
/// <summary>Fills a device report with parameters specific to a FireWire device</summary>
public FireWire FireWireReport() => new FireWire
{
Manufacturer = _dev.FireWireVendorName,
Product = _dev.FireWireModelName,
ProductID = _dev.FireWireModel,
Manufacturer = _dev.FireWireVendorName, Product = _dev.FireWireModelName, ProductID = _dev.FireWireModel,
VendorID = _dev.FireWireVendor
};
}

View File

@@ -584,11 +584,9 @@ namespace DiscImageChef.Core.Devices.Report
{
mediaTest.SupportsReadCapacity = true;
mediaTest.Blocks =
(ulong)((buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]) + 1;
mediaTest.Blocks = (ulong)((buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]) + 1;
mediaTest.BlockSize =
(uint)((buffer[5] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
mediaTest.BlockSize = (uint)((buffer[5] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
}
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
@@ -617,7 +615,6 @@ namespace DiscImageChef.Core.Devices.Report
{
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
mediaTest.ModeSense10Data = buffer;
}
@@ -630,7 +627,6 @@ namespace DiscImageChef.Core.Devices.Report
if(!decMode.HasValue)
decMode = Modes.DecodeMode6(buffer, _dev.ScsiType);
mediaTest.ModeSense6Data = buffer;
}
@@ -654,14 +650,12 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadTOC);
mediaTest.TocData = buffer;
DicConsole.WriteLine("Querying CD Full TOC...");
mediaTest.CanReadFullTOC = !_dev.ReadRawToc(out buffer, out senseBuffer, 1, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadFullTOC);
mediaTest.FullTocData = buffer;
}
@@ -672,14 +666,12 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.CanReadATIP = !_dev.ReadAtip(out buffer, out senseBuffer, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadATIP);
mediaTest.AtipData = buffer;
DicConsole.WriteLine("Querying CD PMA...");
mediaTest.CanReadPMA = !_dev.ReadPma(out buffer, out senseBuffer, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPMA);
mediaTest.PmaData = buffer;
}
@@ -696,7 +688,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPFI);
mediaTest.PfiData = buffer;
DicConsole.WriteLine("Querying DVD DMI...");
@@ -708,7 +699,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDMI);
mediaTest.DmiData = buffer;
}
@@ -723,7 +713,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCMI);
mediaTest.CmiData = buffer;
}
@@ -740,7 +729,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
mediaTest.DvdBcaData = buffer;
DicConsole.WriteLine("Querying DVD AACS...");
@@ -752,7 +740,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadAACS);
mediaTest.DvdAacsData = buffer;
break;
@@ -767,7 +754,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
mediaTest.DvdBcaData = buffer;
break;
@@ -786,7 +772,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
mediaTest.BluBcaData = buffer;
break;
@@ -801,7 +786,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDDS);
mediaTest.DvdDdsData = buffer;
mediaTest.CanReadSpareAreaInformation =
@@ -811,7 +795,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadSpareAreaInformation);
mediaTest.DvdSaiData = buffer;
break;
@@ -822,13 +805,12 @@ namespace DiscImageChef.Core.Devices.Report
{
DicConsole.WriteLine("Querying BD DDS...");
mediaTest.CanReadDDS = !_dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Bd,
0, 0, MmcDiscStructureFormat.BdDds, 0, _dev.Timeout,
out _);
mediaTest.CanReadDDS = !_dev.ReadDiscStructure(out buffer, out senseBuffer,
MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.BdDds, 0, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDDS);
mediaTest.BluDdsData = buffer;
DicConsole.WriteLine("Querying BD SAI...");
@@ -839,7 +821,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadSpareAreaInformation);
mediaTest.BluSaiData = buffer;
}
@@ -855,7 +836,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPRI);
mediaTest.PriData = buffer;
}
@@ -880,7 +860,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRecordablePFI);
mediaTest.EmbossedPfiData = buffer;
}
@@ -895,7 +874,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadADIP);
mediaTest.AdipData = buffer;
DicConsole.WriteLine("Querying DVD DCB...");
@@ -906,7 +884,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDCB);
mediaTest.DcbData = buffer;
}
@@ -921,7 +898,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadHDCMI);
mediaTest.HdCmiData = buffer;
}
@@ -936,7 +912,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadLayerCapacity);
mediaTest.DvdLayerData = buffer;
}
@@ -956,17 +931,16 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDiscInformation);
mediaTest.BluDiData = buffer;
DicConsole.WriteLine("Querying BD PAC...");
mediaTest.CanReadPAC = !_dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Bd,
0, 0, MmcDiscStructureFormat.Pac, 0, _dev.Timeout, out _);
mediaTest.CanReadPAC = !_dev.ReadDiscStructure(out buffer, out senseBuffer,
MmcDiscStructureMediaType.Bd, 0, 0,
MmcDiscStructureFormat.Pac, 0, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPAC);
mediaTest.BluPacData = buffer;
}
@@ -979,7 +953,6 @@ namespace DiscImageChef.Core.Devices.Report
MmcHeaderCodes.None, true, false, MmcErrorField.None,
MmcSubchannel.None, _dev.Timeout, out _);
mediaTest.ReadCdScrambledData = buffer;
}
@@ -989,7 +962,6 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 16, 512, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead6);
mediaTest.Read6Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (10)...");
@@ -999,7 +971,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
mediaTest.Read10Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (12)...");
@@ -1009,7 +980,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
mediaTest.Read12Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (16)...");
@@ -1019,7 +989,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
mediaTest.Read16Data = buffer;
}
else
@@ -1028,7 +997,6 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 16, 2048, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead6);
mediaTest.Read6Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (10)...");
@@ -1038,7 +1006,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
mediaTest.Read10Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (12)...");
@@ -1048,7 +1015,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
mediaTest.Read12Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (16)...");
@@ -1058,7 +1024,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
mediaTest.Read16Data = buffer;
}
@@ -1077,7 +1042,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCd);
mediaTest.ReadCdFullData = buffer;
DicConsole.WriteLine("Trying SCSI READ CD MSF...");
@@ -1089,7 +1053,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsf);
mediaTest.ReadCdMsfFullData = buffer;
}
else
@@ -1103,7 +1066,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCd);
mediaTest.ReadCdData = buffer;
DicConsole.WriteLine("Trying SCSI READ CD MSF...");
@@ -1115,39 +1077,37 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsf);
mediaTest.ReadCdMsfData = buffer;
DicConsole.WriteLine("Trying SCSI READ CD full sector...");
mediaTest.SupportsReadCdRaw = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2352, 1,
MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
MmcSubchannel.None, _dev.Timeout, out _);
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.None, _dev.Timeout,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdRaw);
mediaTest.ReadCdFullData = buffer;
DicConsole.WriteLine("Trying SCSI READ CD MSF full sector...");
mediaTest.SupportsReadCdMsfRaw = !_dev.ReadCdMsf(out buffer, out senseBuffer, 0x00000210, 0x00000211,
2352, MmcSectorTypes.AllTypes, false, false,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.None, _dev.Timeout,
out _);
mediaTest.SupportsReadCdMsfRaw = !_dev.ReadCdMsf(out buffer, out senseBuffer, 0x00000210,
0x00000211, 2352, MmcSectorTypes.AllTypes, false,
false, MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.None, MmcSubchannel.None,
_dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsfRaw);
mediaTest.ReadCdMsfFullData = buffer;
}
if(mediaTest.SupportsReadCdRaw == true ||
mediaType == "Audio CD")
{
DicConsole.WriteLine("Trying to read CD Track 1 pregap...");
DicConsole.WriteLine("Trying to read CD Track 1 pre-gap...");
for(int i = -150; i < 0; i++)
{
@@ -1162,7 +1122,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", sense);
mediaTest.Track1PregapData = buffer;
if(sense)
@@ -1191,7 +1150,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", sense);
mediaTest.LeadInData = buffer;
if(sense)
@@ -1220,7 +1178,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadLeadOut);
mediaTest.LeadOutData = buffer;
}
@@ -1231,8 +1188,8 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2646, 1,
MmcSectorTypes.Cdda, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.C2Pointers, MmcSubchannel.None, _dev.Timeout,
out _);
MmcErrorField.C2Pointers, MmcSubchannel.None,
_dev.Timeout, out _);
if(!mediaTest.CanReadC2Pointers == true)
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2648, 1,
@@ -1243,7 +1200,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadC2Pointers);
mediaTest.C2PointersData = buffer;
DicConsole.WriteLine("Trying to read subchannels...");
@@ -1255,7 +1211,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
mediaTest.PQSubchannelData = buffer;
mediaTest.CanReadRWSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2448, 1,
@@ -1265,7 +1220,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannel);
mediaTest.RWSubchannelData = buffer;
mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2448, 1,
@@ -1276,7 +1230,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCorrectedSubchannel);
mediaTest.CorrectedSubchannelData = buffer;
DicConsole.WriteLine("Trying to read subchannels with C2 Pointers...");
@@ -1296,7 +1249,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannelWithC2);
mediaTest.PQSubchannelWithC2Data = buffer;
mediaTest.CanReadRWSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2712, 1,
@@ -1314,14 +1266,13 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannelWithC2);
mediaTest.RWSubchannelWithC2Data = buffer;
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2712, 1,
MmcSectorTypes.Cdda, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.C2Pointers, MmcSubchannel.Rw,
_dev.Timeout, out _);
MmcErrorField.C2Pointers,
MmcSubchannel.Rw, _dev.Timeout, out _);
if(mediaTest.CanReadCorrectedSubchannelWithC2 == false)
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2714,
@@ -1329,12 +1280,12 @@ namespace DiscImageChef.Core.Devices.Report
false, MmcHeaderCodes.None, true,
false,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.Rw, _dev.Timeout, out _);
MmcSubchannel.Rw, _dev.Timeout,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadCorrectedSubchannelWithC2);
mediaTest.CorrectedSubchannelWithC2Data = buffer;
}
else if(mediaTest.SupportsReadCdRaw == true)
@@ -1344,8 +1295,8 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2646, 1,
MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.C2Pointers, MmcSubchannel.None, _dev.Timeout,
out _);
MmcErrorField.C2Pointers, MmcSubchannel.None,
_dev.Timeout, out _);
if(mediaTest.CanReadC2Pointers == false)
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2648, 1,
@@ -1356,7 +1307,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadC2Pointers);
mediaTest.C2PointersData = buffer;
DicConsole.WriteLine("Trying to read subchannels...");
@@ -1369,7 +1319,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
mediaTest.PQSubchannelData = buffer;
mediaTest.CanReadRWSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2448, 1,
@@ -1380,7 +1329,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannel);
mediaTest.RWSubchannelData = buffer;
mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2448, 1,
@@ -1391,7 +1339,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCorrectedSubchannel);
mediaTest.CorrectedSubchannelData = buffer;
DicConsole.WriteLine("Trying to read subchannels with C2 Pointers...");
@@ -1411,7 +1358,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannelWithC2);
mediaTest.PQSubchannelWithC2Data = buffer;
mediaTest.CanReadRWSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2712, 1,
@@ -1429,7 +1375,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannelWithC2);
mediaTest.RWSubchannelWithC2Data = buffer;
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2712, 1,
@@ -1441,15 +1386,15 @@ namespace DiscImageChef.Core.Devices.Report
if(mediaTest.CanReadCorrectedSubchannelWithC2 == false)
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2714,
1, MmcSectorTypes.AllTypes, false,
false, true, MmcHeaderCodes.AllHeaders,
true, true,
false, true,
MmcHeaderCodes.AllHeaders, true, true,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.Rw, _dev.Timeout, out _);
MmcSubchannel.Rw, _dev.Timeout,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadCorrectedSubchannelWithC2);
mediaTest.CorrectedSubchannelWithC2Data = buffer;
}
else
@@ -1459,8 +1404,8 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2342, 1,
MmcSectorTypes.AllTypes, false, false, false,
MmcHeaderCodes.None, true, false,
MmcErrorField.C2Pointers, MmcSubchannel.None, _dev.Timeout,
out _);
MmcErrorField.C2Pointers, MmcSubchannel.None,
_dev.Timeout, out _);
if(mediaTest.CanReadC2Pointers == false)
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2344, 1,
@@ -1471,7 +1416,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadC2Pointers);
mediaTest.C2PointersData = buffer;
DicConsole.WriteLine("Trying to read subchannels...");
@@ -1483,7 +1427,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
mediaTest.PQSubchannelData = buffer;
mediaTest.CanReadRWSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2144, 1,
@@ -1493,7 +1436,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannel);
mediaTest.RWSubchannelData = buffer;
mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2144, 1,
@@ -1504,7 +1446,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCorrectedSubchannel);
mediaTest.CorrectedSubchannelData = buffer;
DicConsole.WriteLine("Trying to read subchannels with C2 Pointers...");
@@ -1524,7 +1465,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannelWithC2);
mediaTest.PQSubchannelWithC2Data = buffer;
mediaTest.CanReadRWSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2438, 1,
@@ -1542,14 +1482,13 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannelWithC2);
mediaTest.RWSubchannelWithC2Data = buffer;
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2438, 1,
MmcSectorTypes.AllTypes, false, false,
false, MmcHeaderCodes.None, true, false,
MmcErrorField.C2Pointers, MmcSubchannel.Rw,
_dev.Timeout, out _);
MmcErrorField.C2Pointers,
MmcSubchannel.Rw, _dev.Timeout, out _);
if(mediaTest.CanReadCorrectedSubchannelWithC2 == false)
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2440,
@@ -1557,12 +1496,12 @@ namespace DiscImageChef.Core.Devices.Report
false, false, MmcHeaderCodes.None,
true, false,
MmcErrorField.C2PointersAndBlock,
MmcSubchannel.Rw, _dev.Timeout, out _);
MmcSubchannel.Rw, _dev.Timeout,
out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadCorrectedSubchannelWithC2);
mediaTest.CorrectedSubchannelWithC2Data = buffer;
}
@@ -1576,7 +1515,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsPlextorReadCDDA);
mediaTest.PlextorReadCddaData = buffer;
}
@@ -1590,7 +1528,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsPioneerReadCDDA);
mediaTest.PioneerReadCddaData = buffer;
DicConsole.WriteLine("Trying Pioneer READ CD-DA MSF...");
@@ -1601,7 +1538,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsPioneerReadCDDAMSF);
mediaTest.PioneerReadCddaMsfData = buffer;
}
@@ -1614,7 +1550,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsNECReadCDDA);
mediaTest.NecReadCddaData = buffer;
}
}
@@ -1694,7 +1629,6 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.CanReadFullTOC = !_dev.ReadRawToc(out buffer, out senseBuffer, 1, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadFullTOC);
mediaTest.FullTocData = buffer;
if(mediaTest.CanReadFullTOC == true)
@@ -1762,9 +1696,10 @@ namespace DiscImageChef.Core.Devices.Report
{
mediaTest.CanReadingIntersessionLeadOut = !_dev.ReadCd(out buffer, out senseBuffer,
firstSessionLeadOutLba, 2368, 1,
MmcSectorTypes.AllTypes, false, false,
false, MmcHeaderCodes.AllHeaders,
true, false, MmcErrorField.None,
MmcSectorTypes.AllTypes, false,
false, false,
MmcHeaderCodes.AllHeaders, true,
false, MmcErrorField.None,
MmcSubchannel.Q16, _dev.Timeout,
out _);
@@ -1782,7 +1717,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadingIntersessionLeadOut);
mediaTest.IntersessionLeadOutData = buffer;
DicConsole.WriteLine("Trying SCSI READ CD in second session Lead-In...");
@@ -1799,9 +1733,10 @@ namespace DiscImageChef.Core.Devices.Report
mediaTest.CanReadingIntersessionLeadIn = !_dev.ReadCd(out buffer, out senseBuffer,
secondSessionLeadInLba, 2368, 1,
MmcSectorTypes.AllTypes, false, false,
false, MmcHeaderCodes.AllHeaders, true,
false, MmcErrorField.None,
MmcSubchannel.Q16, _dev.Timeout, out _);
false, MmcHeaderCodes.AllHeaders,
true, false, MmcErrorField.None,
MmcSubchannel.Q16, _dev.Timeout,
out _);
if(mediaTest.CanReadingIntersessionLeadIn == false)
mediaTest.CanReadingIntersessionLeadIn = !_dev.ReadCd(out buffer, out senseBuffer,
@@ -1817,7 +1752,6 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadingIntersessionLeadIn);
mediaTest.IntersessionLeadInData = buffer;
}
}

View File

@@ -35,19 +35,21 @@ using DiscImageChef.Decoders.PCMCIA;
namespace DiscImageChef.Core.Devices.Report
{
/// <summary>
/// Implements creating a report for a PCMCIA device
/// </summary>
/// <summary>Implements creating a report for a PCMCIA device</summary>
public partial class DeviceReport
{
/// <summary>
/// Fills a device report with parameters specific to a PCMCIA device
/// </summary>
/// <summary>Fills a device report with parameters specific to a PCMCIA device</summary>
public Pcmcia PcmciaReport()
{
Pcmcia pcmciaReport = new Pcmcia {CIS = _dev.Cis};
var pcmciaReport = new Pcmcia
{
CIS = _dev.Cis
};
Tuple[] tuples = CIS.GetTuples(_dev.Cis);
if(tuples == null) return pcmciaReport;
if(tuples == null)
return pcmciaReport;
foreach(Tuple tuple in tuples)
switch(tuple.Code)

View File

@@ -43,30 +43,38 @@ namespace DiscImageChef.Core.Devices.Report
{
public Ssc ReportScsiSsc()
{
Ssc report = new Ssc();
var report = new Ssc();
DicConsole.WriteLine("Querying SCSI READ BLOCK LIMITS...");
bool sense = _dev.ReadBlockLimits(out byte[] buffer, out byte[] _, _dev.Timeout, out _);
if(!sense)
{
BlockLimits.BlockLimitsData? decBl = BlockLimits.Decode(buffer);
if(decBl.HasValue)
{
if(decBl.Value.granularity > 0) report.BlockSizeGranularity = decBl.Value.granularity;
if(decBl.Value.granularity > 0)
report.BlockSizeGranularity = decBl.Value.granularity;
if(decBl.Value.maxBlockLen > 0) report.MaxBlockLength = decBl.Value.maxBlockLen;
if(decBl.Value.maxBlockLen > 0)
report.MaxBlockLength = decBl.Value.maxBlockLen;
if(decBl.Value.minBlockLen > 0) report.MinBlockLength = decBl.Value.minBlockLen;
if(decBl.Value.minBlockLen > 0)
report.MinBlockLength = decBl.Value.minBlockLen;
}
}
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT...");
sense = _dev.ReportDensitySupport(out buffer, out byte[] _, false, false, _dev.Timeout, out _);
if(!sense)
{
DensitySupport.DensitySupportHeader? dsh = DensitySupport.DecodeDensity(buffer);
if(dsh.HasValue)
{
SupportedDensity[] array = new SupportedDensity[dsh.Value.descriptors.Length];
for(int i = 0; i < dsh.Value.descriptors.Length; i++)
array[i] = new SupportedDensity
{
@@ -74,13 +82,11 @@ namespace DiscImageChef.Core.Devices.Report
Capacity = dsh.Value.descriptors[i].capacity,
DefaultDensity = dsh.Value.descriptors[i].defaultDensity,
Description = dsh.Value.descriptors[i].description,
Duplicate = dsh.Value.descriptors[i].duplicate,
Name = dsh.Value.descriptors[i].name,
Duplicate = dsh.Value.descriptors[i].duplicate, Name = dsh.Value.descriptors[i].name,
Organization = dsh.Value.descriptors[i].organization,
PrimaryCode = dsh.Value.descriptors[i].primaryCode,
SecondaryCode = dsh.Value.descriptors[i].secondaryCode,
Tracks = dsh.Value.descriptors[i].tracks,
Width = dsh.Value.descriptors[i].width,
Tracks = dsh.Value.descriptors[i].tracks, Width = dsh.Value.descriptors[i].width,
Writable = dsh.Value.descriptors[i].writable
};
@@ -90,28 +96,37 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for medium types...");
sense = _dev.ReportDensitySupport(out buffer, out byte[] _, true, false, _dev.Timeout, out _);
if(sense) return report;
if(sense)
return report;
DensitySupport.MediaTypeSupportHeader? mtsh = DensitySupport.DecodeMediumType(buffer);
if(!mtsh.HasValue) return report;
if(!mtsh.HasValue)
return report;
SscSupportedMedia[] array2 = new SscSupportedMedia[mtsh.Value.descriptors.Length];
for(int i = 0; i < mtsh.Value.descriptors.Length; i++)
{
array2[i] = new SscSupportedMedia
{
Description = mtsh.Value.descriptors[i].description,
Length = mtsh.Value.descriptors[i].length,
MediumType = mtsh.Value.descriptors[i].mediumType,
Name = mtsh.Value.descriptors[i].name,
Organization = mtsh.Value.descriptors[i].organization,
Width = mtsh.Value.descriptors[i].width
Description = mtsh.Value.descriptors[i].description, Length = mtsh.Value.descriptors[i].length,
MediumType = mtsh.Value.descriptors[i].mediumType, Name = mtsh.Value.descriptors[i].name,
Organization = mtsh.Value.descriptors[i].organization, Width = mtsh.Value.descriptors[i].width
};
if(mtsh.Value.descriptors[i].densityCodes == null) continue;
if(mtsh.Value.descriptors[i].densityCodes == null)
continue;
DensityCode[] array3 = new DensityCode[mtsh.Value.descriptors[i].densityCodes.Length];
for(int j = 0; j < mtsh.Value.descriptors[i].densityCodes.Length; j++)
array3[j] = new DensityCode {Code = mtsh.Value.descriptors[i].densityCodes[j]};
array3[j] = new DensityCode
{
Code = mtsh.Value.descriptors[i].densityCodes[j]
};
array2[i].DensityCodes = array3.Distinct().ToList();
}
@@ -122,14 +137,17 @@ namespace DiscImageChef.Core.Devices.Report
public TestedSequentialMedia ReportSscMedia()
{
TestedSequentialMedia seqTest = new TestedSequentialMedia();
var seqTest = new TestedSequentialMedia();
Modes.DecodedMode? decMode = null;
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
bool sense = _dev.ModeSense10(out byte[] buffer, out byte[] _, false, true, ScsiModeSensePageControl.Current,
0x3F, 0x00, _dev.Timeout, out _);
if(!sense && !_dev.Error)
bool sense = _dev.ModeSense10(out byte[] buffer, out byte[] _, false, true,
ScsiModeSensePageControl.Current, 0x3F, 0x00, _dev.Timeout, out _);
if(!sense &&
!_dev.Error)
{
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
seqTest.ModeSense10Data = buffer;
@@ -137,27 +155,36 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
sense = _dev.ModeSense(out buffer, out byte[] _, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
if(!decMode.HasValue) decMode = Modes.DecodeMode6(buffer, _dev.ScsiType);
if(!decMode.HasValue)
decMode = Modes.DecodeMode6(buffer, _dev.ScsiType);
seqTest.ModeSense6Data = buffer;
}
if(decMode.HasValue)
{
seqTest.MediumType = (byte)decMode.Value.Header.MediumType;
if(decMode.Value.Header.BlockDescriptors != null && decMode.Value.Header.BlockDescriptors.Length > 0)
if(decMode.Value.Header.BlockDescriptors != null &&
decMode.Value.Header.BlockDescriptors.Length > 0)
seqTest.Density = (byte)decMode.Value.Header.BlockDescriptors[0].Density;
}
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for current media...");
sense = _dev.ReportDensitySupport(out buffer, out byte[] _, false, true, _dev.Timeout, out _);
if(!sense)
{
DensitySupport.DensitySupportHeader? dsh = DensitySupport.DecodeDensity(buffer);
if(dsh.HasValue)
{
SupportedDensity[] array = new SupportedDensity[dsh.Value.descriptors.Length];
for(int i = 0; i < dsh.Value.descriptors.Length; i++)
array[i] = new SupportedDensity
{
@@ -165,13 +192,11 @@ namespace DiscImageChef.Core.Devices.Report
Capacity = dsh.Value.descriptors[i].capacity,
DefaultDensity = dsh.Value.descriptors[i].defaultDensity,
Description = dsh.Value.descriptors[i].description,
Duplicate = dsh.Value.descriptors[i].duplicate,
Name = dsh.Value.descriptors[i].name,
Duplicate = dsh.Value.descriptors[i].duplicate, Name = dsh.Value.descriptors[i].name,
Organization = dsh.Value.descriptors[i].organization,
PrimaryCode = dsh.Value.descriptors[i].primaryCode,
SecondaryCode = dsh.Value.descriptors[i].secondaryCode,
Tracks = dsh.Value.descriptors[i].tracks,
Width = dsh.Value.descriptors[i].width,
Tracks = dsh.Value.descriptors[i].tracks, Width = dsh.Value.descriptors[i].width,
Writable = dsh.Value.descriptors[i].writable
};
@@ -181,28 +206,37 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for medium types for current media...");
sense = _dev.ReportDensitySupport(out buffer, out byte[] _, true, true, _dev.Timeout, out _);
if(!sense)
{
DensitySupport.MediaTypeSupportHeader? mtsh = DensitySupport.DecodeMediumType(buffer);
if(mtsh.HasValue)
{
SscSupportedMedia[] array = new SscSupportedMedia[mtsh.Value.descriptors.Length];
for(int i = 0; i < mtsh.Value.descriptors.Length; i++)
{
array[i] = new SscSupportedMedia
{
Description = mtsh.Value.descriptors[i].description,
Length = mtsh.Value.descriptors[i].length,
MediumType = mtsh.Value.descriptors[i].mediumType,
Name = mtsh.Value.descriptors[i].name,
MediumType = mtsh.Value.descriptors[i].mediumType, Name = mtsh.Value.descriptors[i].name,
Organization = mtsh.Value.descriptors[i].organization,
Width = mtsh.Value.descriptors[i].width
};
if(mtsh.Value.descriptors[i].densityCodes == null) continue;
if(mtsh.Value.descriptors[i].densityCodes == null)
continue;
DensityCode[] array2 = new DensityCode[mtsh.Value.descriptors[i].densityCodes.Length];
for(int j = 0; j < mtsh.Value.descriptors[i].densityCodes.Length; j++)
array2[j] = new DensityCode {Code = mtsh.Value.descriptors[i].densityCodes[j]};
array2[j] = new DensityCode
{
Code = mtsh.Value.descriptors[i].densityCodes[j]
};
array[i].DensityCodes = array2.Distinct().ToList();
}

View File

@@ -47,13 +47,15 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Querying SCSI INQUIRY...");
bool sense = _dev.ScsiInquiry(out byte[] buffer, out byte[] senseBuffer);
Scsi report = new Scsi();
var report = new Scsi();
if(sense) return null;
if(sense)
return null;
Inquiry.SCSIInquiry? decodedNullable = Inquiry.Decode(buffer);
if(!decodedNullable.HasValue) return null;
if(!decodedNullable.HasValue)
return null;
Inquiry.SCSIInquiry decoded = decodedNullable.Value;
@@ -73,39 +75,51 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Querying list of SCSI EVPDs...");
bool sense = _dev.ScsiInquiry(out byte[] buffer, out _, 0x00);
if(sense) return null;
if(sense)
return null;
byte[] evpdPages = EVPD.DecodePage00(buffer);
if(evpdPages == null || evpdPages.Length <= 0) return null;
if(evpdPages == null ||
evpdPages.Length <= 0)
return null;
List<ScsiPage> evpds = new List<ScsiPage>();
foreach(byte page in evpdPages.Where(page => page != 0x80))
{
DicConsole.WriteLine("Querying SCSI EVPD {0:X2}h...", page);
sense = _dev.ScsiInquiry(out buffer, out _, page);
if(sense) continue;
if(sense)
continue;
byte[] empty;
switch(page)
{
case 0x83:
buffer = ClearPage83(buffer);
break;
case 0x80:
byte[] identify = new byte[512];
Array.Copy(buffer, 60, identify, 0, 512);
identify = ClearIdentify(identify);
Array.Copy(identify, 0, buffer, 60, 512);
break;
case 0xB1:
case 0xB3:
empty = new byte[buffer.Length - 4];
Array.Copy(empty, 0, buffer, 4, buffer.Length - 4);
break;
case 0xC1 when vendor == "ibm":
empty = new byte[12];
Array.Copy(empty, 0, buffer, 4, 12);
Array.Copy(empty, 0, buffer, 16, 12);
break;
case 0xC2 when vendor == "certance":
case 0xC3 when vendor == "certance":
@@ -113,10 +127,15 @@ namespace DiscImageChef.Core.Devices.Report
case 0xC5 when vendor == "certance":
case 0xC6 when vendor == "certance":
Array.Copy(new byte[12], 0, buffer, 4, 12);
break;
}
ScsiPage evpd = new ScsiPage {page = page, value = buffer};
var evpd = new ScsiPage
{
page = page, value = buffer
};
evpds.Add(evpd);
}
@@ -125,18 +144,24 @@ namespace DiscImageChef.Core.Devices.Report
byte[] ClearPage83(byte[] pageResponse)
{
if(pageResponse?[1] != 0x83) return null;
if(pageResponse?[1] != 0x83)
return null;
if(pageResponse[3] + 4 != pageResponse.Length) return null;
if(pageResponse[3] + 4 != pageResponse.Length)
return null;
if(pageResponse.Length < 6) return null;
if(pageResponse.Length < 6)
return null;
int position = 4;
while(position < pageResponse.Length)
{
byte length = pageResponse[position + 3];
if(length + position + 4 >= pageResponse.Length) length = (byte)(pageResponse.Length - position - 4);
if(length + position + 4 >= pageResponse.Length)
length = (byte)(pageResponse.Length - position - 4);
byte[] empty = new byte[length];
Array.Copy(empty, 0, pageResponse, position + 4, length);
@@ -150,32 +175,44 @@ namespace DiscImageChef.Core.Devices.Report
{
Modes.DecodedMode? decMode = null;
PeripheralDeviceTypes devType = _dev.ScsiType;
byte[] mode10Currentbuffer;
byte[] mode10Changeablebuffer;
byte[] mode6Currentbuffer;
byte[] mode6Changeablebuffer;
byte[] mode10CurrentBuffer;
byte[] mode10ChangeableBuffer;
byte[] mode6CurrentBuffer;
byte[] mode6ChangeableBuffer;
DicConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (10)...");
bool sense = _dev.ModeSense10(out byte[] mode10Buffer, out _, false, true, ScsiModeSensePageControl.Default,
0x3F, 0xFF, _dev.Timeout, out _);
if(sense || _dev.Error)
{
DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (10)...");
sense = _dev.ModeSense10(out mode10Buffer, out _, false, true, ScsiModeSensePageControl.Default, 0x3F,
0x00, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
report.SCSI.SupportsModeSense10 = true;
report.SCSI.SupportsModeSubpages = false;
decMode = Modes.DecodeMode10(mode10Buffer, devType);
{
sense = _dev.ModeSense10(out mode10Currentbuffer, out _, false, true,
sense = _dev.ModeSense10(out mode10CurrentBuffer, out _, false, true,
ScsiModeSensePageControl.Current, 0x3F, 0x00, _dev.Timeout, out _);
if(!sense && !_dev.Error) report.SCSI.ModeSense10CurrentData = mode10Currentbuffer;
sense = _dev.ModeSense10(out mode10Changeablebuffer, out _, false, true,
if(!sense &&
!_dev.Error)
report.SCSI.ModeSense10CurrentData = mode10CurrentBuffer;
sense = _dev.ModeSense10(out mode10ChangeableBuffer, out _, false, true,
ScsiModeSensePageControl.Changeable, 0x3F, 0x00, _dev.Timeout, out _);
if(!sense && !_dev.Error) report.SCSI.ModeSense10ChangeableData = mode10Changeablebuffer;
if(!sense &&
!_dev.Error)
report.SCSI.ModeSense10ChangeableData = mode10ChangeableBuffer;
}
}
}
@@ -186,23 +223,34 @@ namespace DiscImageChef.Core.Devices.Report
decMode = Modes.DecodeMode10(mode10Buffer, devType);
{
sense = _dev.ModeSense10(out mode10Currentbuffer, out _, false, true,
sense = _dev.ModeSense10(out mode10CurrentBuffer, out _, false, true,
ScsiModeSensePageControl.Current, 0x3F, 0xFF, _dev.Timeout, out _);
if(!sense && !_dev.Error) report.SCSI.ModeSense10CurrentData = mode10Currentbuffer;
sense = _dev.ModeSense10(out mode10Changeablebuffer, out _, false, true,
if(!sense &&
!_dev.Error)
report.SCSI.ModeSense10CurrentData = mode10CurrentBuffer;
sense = _dev.ModeSense10(out mode10ChangeableBuffer, out _, false, true,
ScsiModeSensePageControl.Changeable, 0x3F, 0xFF, _dev.Timeout, out _);
if(!sense && !_dev.Error) report.SCSI.ModeSense10ChangeableData = mode10Changeablebuffer;
if(!sense &&
!_dev.Error)
report.SCSI.ModeSense10ChangeableData = mode10ChangeableBuffer;
}
}
DicConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (6)...");
sense = _dev.ModeSense6(out byte[] mode6Buffer, out _, false, ScsiModeSensePageControl.Default, 0x3F, 0xFF,
_dev.Timeout, out _);
if(sense || _dev.Error)
{
DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (6)...");
sense = _dev.ModeSense6(out mode6Buffer, out _, false, ScsiModeSensePageControl.Default, 0x3F, 0x00,
_dev.Timeout, out _);
if(sense || _dev.Error)
{
DicConsole.WriteLine("Querying SCSI MODE SENSE (6)...");
@@ -210,12 +258,19 @@ namespace DiscImageChef.Core.Devices.Report
}
else
{
sense = _dev.ModeSense6(out mode6Currentbuffer, out _, false, ScsiModeSensePageControl.Current, 0x3F,
0x00, _dev.Timeout, out _);
if(!sense && !_dev.Error) report.SCSI.ModeSense6CurrentData = mode6Currentbuffer;
sense = _dev.ModeSense6(out mode6Changeablebuffer, out _, false, ScsiModeSensePageControl.Changeable,
sense = _dev.ModeSense6(out mode6CurrentBuffer, out _, false, ScsiModeSensePageControl.Current,
0x3F, 0x00, _dev.Timeout, out _);
if(!sense && !_dev.Error) report.SCSI.ModeSense6ChangeableData = mode6Changeablebuffer;
if(!sense &&
!_dev.Error)
report.SCSI.ModeSense6CurrentData = mode6CurrentBuffer;
sense = _dev.ModeSense6(out mode6ChangeableBuffer, out _, false,
ScsiModeSensePageControl.Changeable, 0x3F, 0x00, _dev.Timeout, out _);
if(!sense &&
!_dev.Error)
report.SCSI.ModeSense6ChangeableData = mode6ChangeableBuffer;
}
}
else
@@ -223,69 +278,96 @@ namespace DiscImageChef.Core.Devices.Report
report.SCSI.SupportsModeSubpages = true;
{
sense = _dev.ModeSense6(out mode6Currentbuffer, out _, false, ScsiModeSensePageControl.Current, 0x3F,
0xFF, _dev.Timeout, out _);
if(!sense && !_dev.Error) report.SCSI.ModeSense6CurrentData = mode6Currentbuffer;
sense = _dev.ModeSense6(out mode6Changeablebuffer, out _, false, ScsiModeSensePageControl.Changeable,
sense = _dev.ModeSense6(out mode6CurrentBuffer, out _, false, ScsiModeSensePageControl.Current,
0x3F, 0xFF, _dev.Timeout, out _);
if(!sense && !_dev.Error) report.SCSI.ModeSense6ChangeableData = mode6Changeablebuffer;
if(!sense &&
!_dev.Error)
report.SCSI.ModeSense6CurrentData = mode6CurrentBuffer;
sense = _dev.ModeSense6(out mode6ChangeableBuffer, out _, false,
ScsiModeSensePageControl.Changeable, 0x3F, 0xFF, _dev.Timeout, out _);
if(!sense &&
!_dev.Error)
report.SCSI.ModeSense6ChangeableData = mode6ChangeableBuffer;
}
}
if(!sense && !_dev.Error && !decMode.HasValue) decMode = Modes.DecodeMode6(mode6Buffer, devType);
if(!sense &&
!_dev.Error &&
!decMode.HasValue)
decMode = Modes.DecodeMode6(mode6Buffer, devType);
report.SCSI.SupportsModeSense6 |= !sense && !_dev.Error;
cdromMode = null;
if(report.SCSI.SupportsModeSense6) report.SCSI.ModeSense6Data = mode6Buffer;
if(report.SCSI.SupportsModeSense10) report.SCSI.ModeSense10Data = mode10Buffer;
if(report.SCSI.SupportsModeSense6)
report.SCSI.ModeSense6Data = mode6Buffer;
if(!decMode.HasValue) return;
if(report.SCSI.SupportsModeSense10)
report.SCSI.ModeSense10Data = mode10Buffer;
if(!decMode.HasValue)
return;
report.SCSI.ModeSense = new ScsiMode
{
BlankCheckEnabled = decMode.Value.Header.EBC,
DPOandFUA = decMode.Value.Header.DPOFUA,
BlankCheckEnabled = decMode.Value.Header.EBC, DPOandFUA = decMode.Value.Header.DPOFUA,
WriteProtected = decMode.Value.Header.WriteProtected
};
if(decMode.Value.Header.BufferedMode > 0)
report.SCSI.ModeSense.BufferedMode = decMode.Value.Header.BufferedMode;
if(decMode.Value.Header.Speed > 0) report.SCSI.ModeSense.Speed = decMode.Value.Header.Speed;
if(decMode.Value.Header.Speed > 0)
report.SCSI.ModeSense.Speed = decMode.Value.Header.Speed;
if(decMode.Value.Pages == null) return;
if(decMode.Value.Pages == null)
return;
List<ScsiPage> modePages = new List<ScsiPage>();
foreach(Modes.ModePage page in decMode.Value.Pages)
{
ScsiPage modePage = new ScsiPage {page = page.Page, subpage = page.Subpage, value = page.PageResponse};
var modePage = new ScsiPage
{
page = page.Page, subpage = page.Subpage, value = page.PageResponse
};
modePages.Add(modePage);
if(modePage.page == 0x2A && modePage.subpage == 0x00) cdromMode = page.PageResponse;
if(modePage.page == 0x2A &&
modePage.subpage == 0x00)
cdromMode = page.PageResponse;
}
if(modePages.Count > 0) report.SCSI.ModeSense.ModePages = modePages;
if(modePages.Count > 0)
report.SCSI.ModeSense.ModePages = modePages;
}
public TestedMedia ReportScsiMedia()
{
TestedMedia mediaTest = new TestedMedia();
var mediaTest = new TestedMedia();
DicConsole.WriteLine("Querying SCSI READ CAPACITY...");
bool sense = _dev.ReadCapacity(out byte[] buffer, out byte[] senseBuffer, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
mediaTest.SupportsReadCapacity = true;
mediaTest.Blocks =
(ulong)((buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]) + 1;
mediaTest.BlockSize =
(uint)((buffer[4] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
mediaTest.Blocks = (ulong)((buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]) + 1;
mediaTest.BlockSize = (uint)((buffer[4] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
}
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
sense = _dev.ReadCapacity16(out buffer, out buffer, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
mediaTest.SupportsReadCapacity16 = true;
byte[] temp = new byte[8];
@@ -298,9 +380,12 @@ namespace DiscImageChef.Core.Devices.Report
Modes.DecodedMode? decMode = null;
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
sense = _dev.ModeSense10(out buffer, out senseBuffer, false, true, ScsiModeSensePageControl.Current, 0x3F,
0x00, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
mediaTest.ModeSense10Data = buffer;
@@ -308,78 +393,104 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
sense = _dev.ModeSense(out buffer, out senseBuffer, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
if(!decMode.HasValue) decMode = Modes.DecodeMode6(buffer, _dev.ScsiType);
if(!decMode.HasValue)
decMode = Modes.DecodeMode6(buffer, _dev.ScsiType);
mediaTest.ModeSense6Data = buffer;
}
if(decMode.HasValue)
{
mediaTest.MediumType = (byte)decMode.Value.Header.MediumType;
if(decMode.Value.Header.BlockDescriptors != null && decMode.Value.Header.BlockDescriptors.Length > 0)
if(decMode.Value.Header.BlockDescriptors != null &&
decMode.Value.Header.BlockDescriptors.Length > 0)
mediaTest.Density = (byte)decMode.Value.Header.BlockDescriptors[0].Density;
}
DicConsole.WriteLine("Trying SCSI READ (6)...");
mediaTest.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 0,
mediaTest.BlockSize ?? 512, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead6);
mediaTest.Read6Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (10)...");
mediaTest.SupportsRead10 = !_dev.Read10(out buffer, out senseBuffer, 0, false, true, false, false, 0,
mediaTest.BlockSize ?? 512, 0, 1, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
mediaTest.Read10Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (12)...");
mediaTest.SupportsRead12 = !_dev.Read12(out buffer, out senseBuffer, 0, false, true, false, false, 0,
mediaTest.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
mediaTest.Read12Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (16)...");
mediaTest.SupportsRead16 = !_dev.Read16(out buffer, out senseBuffer, 0, false, true, false, 0,
mediaTest.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
mediaTest.Read16Data = buffer;
mediaTest.LongBlockSize = mediaTest.BlockSize;
DicConsole.WriteLine("Trying SCSI READ LONG (10)...");
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, _dev.Timeout, out _);
if(sense && !_dev.Error)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
if(decSense.HasValue)
if(decSense.Value.SenseKey == SenseKeys.IllegalRequest && decSense.Value.ASC == 0x24 &&
if(decSense.Value.SenseKey == SenseKeys.IllegalRequest &&
decSense.Value.ASC == 0x24 &&
decSense.Value.ASCQ == 0x00)
{
mediaTest.SupportsReadLong = true;
if(decSense.Value.InformationValid && decSense.Value.ILI)
if(decSense.Value.InformationValid &&
decSense.Value.ILI)
mediaTest.LongBlockSize = 0xFFFF - (decSense.Value.Information & 0xFFFF);
}
}
if(mediaTest.SupportsReadLong == true && mediaTest.LongBlockSize == mediaTest.BlockSize)
if(mediaTest.SupportsReadLong == true &&
mediaTest.LongBlockSize == mediaTest.BlockSize)
if(mediaTest.BlockSize == 512)
foreach(int i in new[]
{
// Long sector sizes for floppies
514,
// Long sector sizes for SuperDisk
536, 558,
// Long sector sizes for 512-byte magneto-opticals
600, 610, 630
})
{
ushort testSize = (ushort)i;
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, testSize, _dev.Timeout,
out _);
if(sense || _dev.Error) continue;
if(sense || _dev.Error)
continue;
mediaTest.SupportsReadLong = true;
mediaTest.LongBlockSize = testSize;
break;
}
else if(mediaTest.BlockSize == 1024)
@@ -387,23 +498,30 @@ namespace DiscImageChef.Core.Devices.Report
{
// Long sector sizes for floppies
1026,
// Long sector sizes for 1024-byte magneto-opticals
1200
})
{
ushort testSize = (ushort)i;
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, (ushort)i, _dev.Timeout,
out _);
if(sense || _dev.Error) continue;
if(sense || _dev.Error)
continue;
mediaTest.SupportsReadLong = true;
mediaTest.LongBlockSize = testSize;
break;
}
else if(mediaTest.BlockSize == 2048)
{
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 2380, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
mediaTest.SupportsReadLong = true;
mediaTest.LongBlockSize = 2380;
@@ -412,7 +530,9 @@ namespace DiscImageChef.Core.Devices.Report
else if(mediaTest.BlockSize == 4096)
{
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 4760, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
mediaTest.SupportsReadLong = true;
mediaTest.LongBlockSize = 4760;
@@ -421,7 +541,9 @@ namespace DiscImageChef.Core.Devices.Report
else if(mediaTest.BlockSize == 8192)
{
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 9424, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
mediaTest.SupportsReadLong = true;
mediaTest.LongBlockSize = 9424;
@@ -429,29 +551,38 @@ namespace DiscImageChef.Core.Devices.Report
}
DicConsole.WriteLine("Trying SCSI READ MEDIA SERIAL NUMBER...");
mediaTest.CanReadMediaSerial = !_dev.ReadMediaSerialNumber(out buffer, out senseBuffer, _dev.Timeout, out _);
mediaTest.CanReadMediaSerial =
!_dev.ReadMediaSerialNumber(out buffer, out senseBuffer, _dev.Timeout, out _);
return mediaTest;
}
public TestedMedia ReportScsi()
{
TestedMedia capabilities = new TestedMedia {MediaIsRecognized = true};
var capabilities = new TestedMedia
{
MediaIsRecognized = true
};
DicConsole.WriteLine("Querying SCSI READ CAPACITY...");
bool sense = _dev.ReadCapacity(out byte[] buffer, out byte[] senseBuffer, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
capabilities.SupportsReadCapacity = true;
capabilities.Blocks =
(ulong)((buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]) + 1;
capabilities.BlockSize =
(uint)((buffer[4] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
capabilities.Blocks = (ulong)((buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]) + 1;
capabilities.BlockSize = (uint)((buffer[4] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
}
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
sense = _dev.ReadCapacity16(out buffer, out buffer, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
capabilities.SupportsReadCapacity16 = true;
byte[] temp = new byte[8];
@@ -464,9 +595,12 @@ namespace DiscImageChef.Core.Devices.Report
Modes.DecodedMode? decMode = null;
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
sense = _dev.ModeSense10(out buffer, out senseBuffer, false, true, ScsiModeSensePageControl.Current, 0x3F,
0x00, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
capabilities.ModeSense10Data = buffer;
@@ -474,60 +608,80 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
sense = _dev.ModeSense(out buffer, out senseBuffer, _dev.Timeout, out _);
if(!sense && !_dev.Error)
if(!sense &&
!_dev.Error)
{
if(!decMode.HasValue) decMode = Modes.DecodeMode6(buffer, _dev.ScsiType);
if(!decMode.HasValue)
decMode = Modes.DecodeMode6(buffer, _dev.ScsiType);
capabilities.ModeSense6Data = buffer;
}
if(decMode.HasValue)
{
capabilities.MediumType = (byte)decMode.Value.Header.MediumType;
if(decMode.Value.Header.BlockDescriptors != null && decMode.Value.Header.BlockDescriptors.Length > 0)
if(decMode.Value.Header.BlockDescriptors != null &&
decMode.Value.Header.BlockDescriptors.Length > 0)
capabilities.Density = (byte)decMode.Value.Header.BlockDescriptors[0].Density;
}
DicConsole.WriteLine("Trying SCSI READ (6)...");
capabilities.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 0, capabilities.BlockSize ?? 512,
_dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead6);
capabilities.Read6Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (10)...");
capabilities.SupportsRead10 = !_dev.Read10(out buffer, out senseBuffer, 0, false, true, false, false, 0,
capabilities.BlockSize ?? 512, 0, 1, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead10);
capabilities.Read10Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (12)...");
capabilities.SupportsRead12 = !_dev.Read12(out buffer, out senseBuffer, 0, false, true, false, false, 0,
capabilities.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead12);
capabilities.Read12Data = buffer;
DicConsole.WriteLine("Trying SCSI READ (16)...");
capabilities.SupportsRead16 = !_dev.Read16(out buffer, out senseBuffer, 0, false, true, false, 0,
capabilities.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead16);
capabilities.Read16Data = buffer;
capabilities.LongBlockSize = capabilities.BlockSize;
DicConsole.WriteLine("Trying SCSI READ LONG (10)...");
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, _dev.Timeout, out _);
if(sense && !_dev.Error)
{
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
if(decSense.HasValue)
if(decSense.Value.SenseKey == SenseKeys.IllegalRequest && decSense.Value.ASC == 0x24 &&
if(decSense.Value.SenseKey == SenseKeys.IllegalRequest &&
decSense.Value.ASC == 0x24 &&
decSense.Value.ASCQ == 0x00)
{
capabilities.SupportsReadLong = true;
if(decSense.Value.InformationValid && decSense.Value.ILI)
if(decSense.Value.InformationValid &&
decSense.Value.ILI)
capabilities.LongBlockSize = 0xFFFF - (decSense.Value.Information & 0xFFFF);
}
}
if(capabilities.SupportsReadLong != true || capabilities.LongBlockSize != capabilities.BlockSize)
if(capabilities.SupportsReadLong != true ||
capabilities.LongBlockSize != capabilities.BlockSize)
return capabilities;
if(capabilities.BlockSize == 512)
@@ -535,18 +689,25 @@ namespace DiscImageChef.Core.Devices.Report
{
// Long sector sizes for floppies
514,
// Long sector sizes for SuperDisk
536, 558,
// Long sector sizes for 512-byte magneto-opticals
600, 610, 630
})
{
ushort testSize = (ushort)i;
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, (ushort)i, _dev.Timeout, out _);
if(sense || _dev.Error) continue;
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, (ushort)i, _dev.Timeout,
out _);
if(sense || _dev.Error)
continue;
capabilities.SupportsReadLong = true;
capabilities.LongBlockSize = testSize;
break;
}
else if(capabilities.BlockSize == 1024)
@@ -554,22 +715,30 @@ namespace DiscImageChef.Core.Devices.Report
{
// Long sector sizes for floppies
1026,
// Long sector sizes for 1024-byte magneto-opticals
1200
})
{
ushort testSize = (ushort)i;
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, (ushort)i, _dev.Timeout, out _);
if(sense || _dev.Error) continue;
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, (ushort)i, _dev.Timeout,
out _);
if(sense || _dev.Error)
continue;
capabilities.SupportsReadLong = true;
capabilities.LongBlockSize = testSize;
break;
}
else if(capabilities.BlockSize == 2048)
{
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 2380, _dev.Timeout, out _);
if(sense || _dev.Error) return capabilities;
if(sense || _dev.Error)
return capabilities;
capabilities.SupportsReadLong = true;
capabilities.LongBlockSize = 2380;
@@ -577,7 +746,9 @@ namespace DiscImageChef.Core.Devices.Report
else if(capabilities.BlockSize == 4096)
{
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 4760, _dev.Timeout, out _);
if(sense || _dev.Error) return capabilities;
if(sense || _dev.Error)
return capabilities;
capabilities.SupportsReadLong = true;
capabilities.LongBlockSize = 4760;
@@ -585,7 +756,9 @@ namespace DiscImageChef.Core.Devices.Report
else if(capabilities.BlockSize == 8192)
{
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 9424, _dev.Timeout, out _);
if(sense || _dev.Error) return capabilities;
if(sense || _dev.Error)
return capabilities;
capabilities.SupportsReadLong = true;
capabilities.LongBlockSize = 9424;

View File

@@ -36,17 +36,13 @@ using DiscImageChef.Console;
namespace DiscImageChef.Core.Devices.Report
{
/// <summary>
/// Implements creating a device report for a SecureDigital or MultiMediaCard flash card
/// </summary>
/// <summary>Implements creating a device report for a SecureDigital or MultiMediaCard flash card</summary>
public partial class DeviceReport
{
/// <summary>
/// Creates a device report for a SecureDigital or MultiMediaCard flash card
/// </summary>
/// <summary>Creates a device report for a SecureDigital or MultiMediaCard flash card</summary>
public MmcSd MmcSdReport()
{
MmcSd report = new MmcSd();
var report = new MmcSd();
DicConsole.WriteLine("Trying to get CID...");
bool sense = _dev.ReadCid(out byte[] cid, out _, _dev.Timeout, out _);
@@ -65,6 +61,7 @@ namespace DiscImageChef.Core.Devices.Report
cid[12] = 0;
cid[13] = 0;
cid[14] = 0;
break;
case DeviceType.MMC:
// Clear serial number and manufacturing date
@@ -73,12 +70,14 @@ namespace DiscImageChef.Core.Devices.Report
cid[12] = 0;
cid[13] = 0;
cid[14] = 0;
break;
}
report.CID = cid;
}
else DicConsole.WriteLine("Could not read CID...");
else
DicConsole.WriteLine("Could not read CID...");
DicConsole.WriteLine("Trying to get CSD...");
sense = _dev.ReadCsd(out byte[] csd, out _, _dev.Timeout, out _);
@@ -88,21 +87,25 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("CSD obtained correctly...");
report.CSD = csd;
}
else DicConsole.WriteLine("Could not read CSD...");
else
DicConsole.WriteLine("Could not read CSD...");
sense = true;
byte[] ocr = null;
DicConsole.WriteLine("Trying to get OCR...");
switch(_dev.Type)
{
case DeviceType.MMC:
{
sense = _dev.ReadOcr(out ocr, out _, _dev.Timeout, out _);
break;
}
case DeviceType.SecureDigital:
{
sense = _dev.ReadSdocr(out ocr, out _, _dev.Timeout, out _);
break;
}
}
@@ -112,7 +115,8 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("OCR obtained correctly...");
report.OCR = ocr;
}
else DicConsole.WriteLine("Could not read OCR...");
else
DicConsole.WriteLine("Could not read OCR...");
switch(_dev.Type)
{
@@ -126,7 +130,8 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("Extended CSD obtained correctly...");
report.ExtendedCSD = ecsd;
}
else DicConsole.WriteLine("Could not read Extended CSD...");
else
DicConsole.WriteLine("Could not read Extended CSD...");
break;
}
@@ -140,7 +145,8 @@ namespace DiscImageChef.Core.Devices.Report
DicConsole.WriteLine("SCR obtained correctly...");
report.SCR = scr;
}
else DicConsole.WriteLine("Could not read SCR...");
else
DicConsole.WriteLine("Could not read SCR...");
break;
}

View File

@@ -34,30 +34,18 @@ using DiscImageChef.CommonTypes.Metadata;
namespace DiscImageChef.Core.Devices.Report
{
/// <summary>
/// Implements creating a report for a USB device
/// </summary>
/// <summary>Implements creating a report for a USB device</summary>
public partial class DeviceReport
{
/// <summary>
/// Fills a device report with parameters specific to a USB device
/// </summary>
/// <param name="dev">Device</param>
/// <param name="report">Device report</param>
/// <param name="removable">If device is removable</param>
/// <param name="debug">If debug is enabled</param>
/// <summary>Fills a device report with parameters specific to a USB device</summary>
public Usb UsbReport()
{
Usb usbReport = new Usb
var usbReport = new Usb
{
Manufacturer = _dev.UsbManufacturerString,
Product = _dev.UsbProductString,
ProductID = _dev.UsbProductId,
VendorID = _dev.UsbVendorId
Manufacturer = _dev.UsbManufacturerString, Product = _dev.UsbProductString,
ProductID = _dev.UsbProductId, VendorID = _dev.UsbVendorId, Descriptors = _dev.UsbDescriptors
};
usbReport.Descriptors = _dev.UsbDescriptors;
return usbReport;
}
}

View File

@@ -1261,8 +1261,7 @@ namespace DiscImageChef.Commands
}
}
if(
report.SCSI.ReadCapabilities.SupportsReadLong == true &&
if(report.SCSI.ReadCapabilities.SupportsReadLong == true &&
report.SCSI.ReadCapabilities.LongBlockSize !=
report.SCSI.ReadCapabilities.BlockSize)
{