mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Refactor.
This commit is contained in:
@@ -42,7 +42,7 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
public TestedMedia ReportAtaMedia()
|
public TestedMedia ReportAtaMedia()
|
||||||
{
|
{
|
||||||
TestedMedia mediaTest = new TestedMedia();
|
var mediaTest = new TestedMedia();
|
||||||
DicConsole.Write("Please write a description of the media type and press enter: ");
|
DicConsole.Write("Please write a description of the media type and press enter: ");
|
||||||
mediaTest.MediumTypeName = System.Console.ReadLine();
|
mediaTest.MediumTypeName = System.Console.ReadLine();
|
||||||
DicConsole.Write("Please write the media model and press enter: ");
|
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;
|
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
|
mediaTest.CHS = new Chs
|
||||||
{
|
{
|
||||||
Cylinders = ataId.Cylinders, Heads = ataId.Heads, Sectors = ataId.SectorsPerTrack
|
Cylinders = ataId.Cylinders, Heads = ataId.Heads, Sectors = ataId.SectorsPerTrack
|
||||||
};
|
};
|
||||||
|
|
||||||
mediaTest.Blocks = (ulong)(ataId.Cylinders * ataId.Heads * 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
|
mediaTest.CurrentCHS = new Chs
|
||||||
{
|
{
|
||||||
Cylinders = ataId.CurrentCylinders,
|
Cylinders = ataId.CurrentCylinders, Heads = ataId.CurrentHeads,
|
||||||
Heads = ataId.CurrentHeads,
|
|
||||||
Sectors = ataId.CurrentSectorsPerTrack
|
Sectors = ataId.CurrentSectorsPerTrack
|
||||||
};
|
};
|
||||||
|
|
||||||
if(mediaTest.Blocks == 0)
|
if(mediaTest.Blocks == 0)
|
||||||
mediaTest.Blocks =
|
mediaTest.Blocks =
|
||||||
(ulong)(ataId.CurrentCylinders * ataId.CurrentHeads * ataId.CurrentSectorsPerTrack);
|
(ulong)(ataId.CurrentCylinders * ataId.CurrentHeads * ataId.CurrentSectorsPerTrack);
|
||||||
@@ -98,7 +105,8 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
mediaTest.Blocks = ataId.LBA48Sectors;
|
mediaTest.Blocks = ataId.LBA48Sectors;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ataId.NominalRotationRate != 0x0000 && ataId.NominalRotationRate != 0xFFFF)
|
if(ataId.NominalRotationRate != 0x0000 &&
|
||||||
|
ataId.NominalRotationRate != 0xFFFF)
|
||||||
if(ataId.NominalRotationRate == 0x0001)
|
if(ataId.NominalRotationRate == 0x0001)
|
||||||
mediaTest.SolidStateDevice = true;
|
mediaTest.SolidStateDevice = true;
|
||||||
else
|
else
|
||||||
@@ -107,40 +115,48 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
mediaTest.NominalRotationRate = ataId.NominalRotationRate;
|
mediaTest.NominalRotationRate = ataId.NominalRotationRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint logicalsectorsize;
|
uint logicalSectorSize;
|
||||||
uint physicalsectorsize;
|
uint physicalSectorSize;
|
||||||
if((ataId.PhysLogSectorSize & 0x8000) == 0x0000 && (ataId.PhysLogSectorSize & 0x4000) == 0x4000)
|
|
||||||
|
if((ataId.PhysLogSectorSize & 0x8000) == 0x0000 &&
|
||||||
|
(ataId.PhysLogSectorSize & 0x4000) == 0x4000)
|
||||||
{
|
{
|
||||||
if((ataId.PhysLogSectorSize & 0x1000) == 0x1000)
|
if((ataId.PhysLogSectorSize & 0x1000) == 0x1000)
|
||||||
if(ataId.LogicalSectorWords <= 255 || ataId.LogicalAlignment == 0xFFFF)
|
if(ataId.LogicalSectorWords <= 255 ||
|
||||||
logicalsectorsize = 512;
|
ataId.LogicalAlignment == 0xFFFF)
|
||||||
|
logicalSectorSize = 512;
|
||||||
else
|
else
|
||||||
logicalsectorsize = ataId.LogicalSectorWords * 2;
|
logicalSectorSize = ataId.LogicalSectorWords * 2;
|
||||||
else logicalsectorsize = 512;
|
else
|
||||||
|
logicalSectorSize = 512;
|
||||||
|
|
||||||
if((ataId.PhysLogSectorSize & 0x2000) == 0x2000)
|
if((ataId.PhysLogSectorSize & 0x2000) == 0x2000)
|
||||||
physicalsectorsize = (uint)(logicalsectorsize * ((1 << ataId.PhysLogSectorSize) & 0xF));
|
physicalSectorSize = (uint)(logicalSectorSize * ((1 << ataId.PhysLogSectorSize) & 0xF));
|
||||||
else physicalsectorsize = logicalsectorsize;
|
else
|
||||||
|
physicalSectorSize = logicalSectorSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logicalsectorsize = 512;
|
logicalSectorSize = 512;
|
||||||
physicalsectorsize = 512;
|
physicalSectorSize = 512;
|
||||||
}
|
}
|
||||||
|
|
||||||
mediaTest.BlockSize = logicalsectorsize;
|
mediaTest.BlockSize = logicalSectorSize;
|
||||||
if(physicalsectorsize != logicalsectorsize)
|
|
||||||
{
|
|
||||||
mediaTest.PhysicalBlockSize = physicalsectorsize;
|
|
||||||
|
|
||||||
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);
|
mediaTest.LogicalAlignment = (ushort)(ataId.LogicalAlignment & 0x3FFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF)
|
if(ataId.EccBytes != 0x0000 &&
|
||||||
mediaTest.LongBlockSize = logicalsectorsize + ataId.EccBytes;
|
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))
|
(!(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF) || mediaTest.LongBlockSize == 516))
|
||||||
mediaTest.LongBlockSize = ataId.UnformattedBPS;
|
mediaTest.LongBlockSize = ataId.UnformattedBPS;
|
||||||
|
|
||||||
@@ -149,6 +165,7 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
ataId.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial))
|
ataId.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial))
|
||||||
{
|
{
|
||||||
mediaTest.CanReadMediaSerial = true;
|
mediaTest.CanReadMediaSerial = true;
|
||||||
|
|
||||||
if(!string.IsNullOrWhiteSpace(ataId.MediaManufacturer))
|
if(!string.IsNullOrWhiteSpace(ataId.MediaManufacturer))
|
||||||
mediaTest.Manufacturer = ataId.MediaManufacturer;
|
mediaTest.Manufacturer = ataId.MediaManufacturer;
|
||||||
}
|
}
|
||||||
@@ -157,106 +174,139 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
bool sense;
|
bool sense;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ SECTOR(S) in CHS mode...");
|
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 &&
|
mediaTest.SupportsReadSectors = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadSectorsData = readBuf;
|
mediaTest.ReadSectorsData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in CHS mode...");
|
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 _);
|
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 &&
|
mediaTest.SupportsReadRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadSectorsRetryData = readBuf;
|
mediaTest.ReadSectorsRetryData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ DMA in CHS mode...");
|
DicConsole.WriteLine("Trying READ DMA in CHS mode...");
|
||||||
sense = _dev.ReadDma(out readBuf, out errorChs, false, 0, 0, 1, 1, _dev.Timeout, out _);
|
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 &&
|
mediaTest.SupportsReadDma = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadDmaData = readBuf;
|
mediaTest.ReadDmaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ DMA RETRY in CHS mode...");
|
DicConsole.WriteLine("Trying READ DMA RETRY in CHS mode...");
|
||||||
sense = _dev.ReadDma(out readBuf, out errorChs, true, 0, 0, 1, 1, _dev.Timeout, out _);
|
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 &&
|
mediaTest.SupportsReadDmaRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadDmaRetryData = readBuf;
|
mediaTest.ReadDmaRetryData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SEEK in CHS mode...");
|
DicConsole.WriteLine("Trying SEEK in CHS mode...");
|
||||||
sense = _dev.Seek(out errorChs, 0, 0, 1, _dev.Timeout, out _);
|
sense = _dev.Seek(out errorChs, 0, 0, 1, _dev.Timeout, out _);
|
||||||
mediaTest.SupportsSeek = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0;
|
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,
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}", sense,
|
||||||
errorChs.Status, errorChs.Error);
|
errorChs.Status, errorChs.Error);
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA mode...");
|
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA mode...");
|
||||||
sense = _dev.Read(out readBuf, out AtaErrorRegistersLba28 errorLba, false, 0, 1, _dev.Timeout, out _);
|
sense = _dev.Read(out readBuf, out AtaErrorRegistersLba28 errorLba, false, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
mediaTest.SupportsReadLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
mediaTest.SupportsReadLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadLbaData = readBuf;
|
mediaTest.ReadLbaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in LBA mode...");
|
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in LBA mode...");
|
||||||
sense = _dev.Read(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
|
sense = _dev.Read(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
mediaTest.SupportsReadRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
mediaTest.SupportsReadRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadRetryLbaData = readBuf;
|
mediaTest.ReadRetryLbaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ DMA in LBA mode...");
|
DicConsole.WriteLine("Trying READ DMA in LBA mode...");
|
||||||
sense = _dev.ReadDma(out readBuf, out errorLba, false, 0, 1, _dev.Timeout, out _);
|
sense = _dev.ReadDma(out readBuf, out errorLba, false, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
mediaTest.SupportsReadDmaLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
mediaTest.SupportsReadDmaLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadDmaLbaData = readBuf;
|
mediaTest.ReadDmaLbaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ DMA RETRY in LBA mode...");
|
DicConsole.WriteLine("Trying READ DMA RETRY in LBA mode...");
|
||||||
sense = _dev.ReadDma(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
|
sense = _dev.ReadDma(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
mediaTest.SupportsReadDmaRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
mediaTest.SupportsReadDmaRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadDmaRetryLbaData = readBuf;
|
mediaTest.ReadDmaRetryLbaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SEEK in LBA mode...");
|
DicConsole.WriteLine("Trying SEEK in LBA mode...");
|
||||||
sense = _dev.Seek(out errorLba, 0, _dev.Timeout, out _);
|
sense = _dev.Seek(out errorLba, 0, _dev.Timeout, out _);
|
||||||
mediaTest.SupportsSeekLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0;
|
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,
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}", sense,
|
||||||
errorChs.Status, errorChs.Error);
|
errorChs.Status, errorChs.Error);
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA48 mode...");
|
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA48 mode...");
|
||||||
sense = _dev.Read(out readBuf, out AtaErrorRegistersLba48 errorLba48, 0, 1, _dev.Timeout, out _);
|
sense = _dev.Read(out readBuf, out AtaErrorRegistersLba48 errorLba48, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
mediaTest.SupportsReadLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 && errorLba48.Error == 0 &&
|
mediaTest.SupportsReadLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 && errorLba48.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadLba48Data = readBuf;
|
mediaTest.ReadLba48Data = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ DMA in LBA48 mode...");
|
DicConsole.WriteLine("Trying READ DMA in LBA48 mode...");
|
||||||
sense = _dev.ReadDma(out readBuf, out errorLba48, 0, 1, _dev.Timeout, out _);
|
sense = _dev.ReadDma(out readBuf, out errorLba48, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
mediaTest.SupportsReadDmaLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 &&
|
mediaTest.SupportsReadDmaLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 &&
|
||||||
errorLba48.Error == 0 && readBuf.Length > 0;
|
errorLba48.Error == 0 && readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadDmaLba48Data = readBuf;
|
mediaTest.ReadDmaLba48Data = readBuf;
|
||||||
|
|
||||||
// Send SET FEATURES before sending READ LONG commands, retrieve IDENTIFY again and
|
// 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.SetFeatures(out _, AtaFeatures.EnableReadLongVendorLength, 0, 0, 1, 0, _dev.Timeout, out _);
|
||||||
|
|
||||||
_dev.AtaIdentify(out buffer, out _, _dev.Timeout, out _);
|
_dev.AtaIdentify(out buffer, out _, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(Identify.Decode(buffer).HasValue)
|
if(Identify.Decode(buffer).HasValue)
|
||||||
{
|
{
|
||||||
ataId = Identify.Decode(buffer).Value;
|
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))
|
(!(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF) || mediaTest.LongBlockSize == 516))
|
||||||
mediaTest.LongBlockSize = ataId.UnformattedBPS;
|
mediaTest.LongBlockSize = ataId.UnformattedBPS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ LONG in CHS mode...");
|
DicConsole.WriteLine("Trying READ LONG in CHS mode...");
|
||||||
|
|
||||||
sense = _dev.ReadLong(out readBuf, out errorChs, false, 0, 0, 1, mediaTest.LongBlockSize ?? 0,
|
sense = _dev.ReadLong(out readBuf, out errorChs, false, 0, 0, 1, mediaTest.LongBlockSize ?? 0,
|
||||||
_dev.Timeout, out _);
|
_dev.Timeout, out _);
|
||||||
|
|
||||||
mediaTest.SupportsReadLong = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
mediaTest.SupportsReadLong = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
||||||
readBuf.Length > 0 &&
|
readBuf.Length > 0 &&
|
||||||
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
|
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadLongData = readBuf;
|
mediaTest.ReadLongData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ LONG RETRY in CHS mode...");
|
DicConsole.WriteLine("Trying READ LONG RETRY in CHS mode...");
|
||||||
|
|
||||||
sense = _dev.ReadLong(out readBuf, out errorChs, true, 0, 0, 1, mediaTest.LongBlockSize ?? 0,
|
sense = _dev.ReadLong(out readBuf, out errorChs, true, 0, 0, 1, mediaTest.LongBlockSize ?? 0,
|
||||||
_dev.Timeout, out _);
|
_dev.Timeout, out _);
|
||||||
|
|
||||||
mediaTest.SupportsReadLongRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
mediaTest.SupportsReadLongRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
||||||
readBuf.Length > 0 &&
|
readBuf.Length > 0 &&
|
||||||
BitConverter.ToUInt64(readBuf, 0) !=
|
BitConverter.ToUInt64(readBuf, 0) !=
|
||||||
checkCorrectRead;
|
checkCorrectRead;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadLongRetryData = readBuf;
|
mediaTest.ReadLongRetryData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ LONG in LBA mode...");
|
DicConsole.WriteLine("Trying READ LONG in LBA mode...");
|
||||||
|
|
||||||
sense = _dev.ReadLong(out readBuf, out errorLba, false, 0, mediaTest.LongBlockSize ?? 0, _dev.Timeout,
|
sense = _dev.ReadLong(out readBuf, out errorLba, false, 0, mediaTest.LongBlockSize ?? 0, _dev.Timeout,
|
||||||
out _);
|
out _);
|
||||||
|
|
||||||
mediaTest.SupportsReadLongLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
mediaTest.SupportsReadLongLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
||||||
readBuf.Length > 0 &&
|
readBuf.Length > 0 &&
|
||||||
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
|
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadLongLbaData = readBuf;
|
mediaTest.ReadLongLbaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ LONG RETRY in LBA mode...");
|
DicConsole.WriteLine("Trying READ LONG RETRY in LBA mode...");
|
||||||
|
|
||||||
sense = _dev.ReadLong(out readBuf, out errorLba, true, 0, mediaTest.LongBlockSize ?? 0, _dev.Timeout,
|
sense = _dev.ReadLong(out readBuf, out errorLba, true, 0, mediaTest.LongBlockSize ?? 0, _dev.Timeout,
|
||||||
out _);
|
out _);
|
||||||
|
|
||||||
mediaTest.SupportsReadLongRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 &&
|
mediaTest.SupportsReadLongRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 &&
|
||||||
errorLba.Error == 0 && readBuf.Length > 0 &&
|
errorLba.Error == 0 && readBuf.Length > 0 &&
|
||||||
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
|
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report",
|
DicConsole.DebugWriteLine("ATA Report",
|
||||||
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
"Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}", sense,
|
||||||
errorChs.Status, errorChs.Error, readBuf.Length);
|
errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
mediaTest.ReadLongRetryLbaData = readBuf;
|
mediaTest.ReadLongRetryLbaData = readBuf;
|
||||||
}
|
}
|
||||||
else mediaTest.MediaIsRecognized = false;
|
else
|
||||||
|
mediaTest.MediaIsRecognized = false;
|
||||||
|
|
||||||
return mediaTest;
|
return mediaTest;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>Creates a report of an ATA device</summary>
|
||||||
/// Creates a report of an ATA device
|
|
||||||
/// </summary>
|
|
||||||
public TestedMedia ReportAta(Identify.IdentifyDevice ataId)
|
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
|
capabilities.CHS = new Chs
|
||||||
{
|
{
|
||||||
Cylinders = ataId.Cylinders, Heads = ataId.Heads, Sectors = ataId.SectorsPerTrack
|
Cylinders = ataId.Cylinders, Heads = ataId.Heads, Sectors = ataId.SectorsPerTrack
|
||||||
};
|
};
|
||||||
|
|
||||||
capabilities.Blocks = (ulong)(ataId.Cylinders * ataId.Heads * 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
|
capabilities.CurrentCHS = new Chs
|
||||||
{
|
{
|
||||||
Cylinders = ataId.CurrentCylinders,
|
Cylinders = ataId.CurrentCylinders, Heads = ataId.CurrentHeads,
|
||||||
Heads = ataId.CurrentHeads,
|
|
||||||
Sectors = ataId.CurrentSectorsPerTrack
|
Sectors = ataId.CurrentSectorsPerTrack
|
||||||
};
|
};
|
||||||
|
|
||||||
capabilities.Blocks =
|
capabilities.Blocks =
|
||||||
(ulong)(ataId.CurrentCylinders * ataId.CurrentHeads * ataId.CurrentSectorsPerTrack);
|
(ulong)(ataId.CurrentCylinders * ataId.CurrentHeads * ataId.CurrentSectorsPerTrack);
|
||||||
}
|
}
|
||||||
@@ -370,7 +445,8 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
capabilities.Blocks = ataId.LBA48Sectors;
|
capabilities.Blocks = ataId.LBA48Sectors;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ataId.NominalRotationRate != 0x0000 && ataId.NominalRotationRate != 0xFFFF)
|
if(ataId.NominalRotationRate != 0x0000 &&
|
||||||
|
ataId.NominalRotationRate != 0xFFFF)
|
||||||
if(ataId.NominalRotationRate == 0x0001)
|
if(ataId.NominalRotationRate == 0x0001)
|
||||||
capabilities.SolidStateDevice = true;
|
capabilities.SolidStateDevice = true;
|
||||||
else
|
else
|
||||||
@@ -379,40 +455,48 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
capabilities.NominalRotationRate = ataId.NominalRotationRate;
|
capabilities.NominalRotationRate = ataId.NominalRotationRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint logicalsectorsize;
|
uint logicalSectorSize;
|
||||||
uint physicalsectorsize;
|
uint physicalSectorSize;
|
||||||
if((ataId.PhysLogSectorSize & 0x8000) == 0x0000 && (ataId.PhysLogSectorSize & 0x4000) == 0x4000)
|
|
||||||
|
if((ataId.PhysLogSectorSize & 0x8000) == 0x0000 &&
|
||||||
|
(ataId.PhysLogSectorSize & 0x4000) == 0x4000)
|
||||||
{
|
{
|
||||||
if((ataId.PhysLogSectorSize & 0x1000) == 0x1000)
|
if((ataId.PhysLogSectorSize & 0x1000) == 0x1000)
|
||||||
if(ataId.LogicalSectorWords <= 255 || ataId.LogicalAlignment == 0xFFFF)
|
if(ataId.LogicalSectorWords <= 255 ||
|
||||||
logicalsectorsize = 512;
|
ataId.LogicalAlignment == 0xFFFF)
|
||||||
|
logicalSectorSize = 512;
|
||||||
else
|
else
|
||||||
logicalsectorsize = ataId.LogicalSectorWords * 2;
|
logicalSectorSize = ataId.LogicalSectorWords * 2;
|
||||||
else logicalsectorsize = 512;
|
else
|
||||||
|
logicalSectorSize = 512;
|
||||||
|
|
||||||
if((ataId.PhysLogSectorSize & 0x2000) == 0x2000)
|
if((ataId.PhysLogSectorSize & 0x2000) == 0x2000)
|
||||||
physicalsectorsize = logicalsectorsize * (uint)Math.Pow(2, ataId.PhysLogSectorSize & 0xF);
|
physicalSectorSize = logicalSectorSize * (uint)Math.Pow(2, ataId.PhysLogSectorSize & 0xF);
|
||||||
else physicalsectorsize = logicalsectorsize;
|
else
|
||||||
|
physicalSectorSize = logicalSectorSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logicalsectorsize = 512;
|
logicalSectorSize = 512;
|
||||||
physicalsectorsize = 512;
|
physicalSectorSize = 512;
|
||||||
}
|
}
|
||||||
|
|
||||||
capabilities.BlockSize = logicalsectorsize;
|
capabilities.BlockSize = logicalSectorSize;
|
||||||
if(physicalsectorsize != logicalsectorsize)
|
|
||||||
{
|
|
||||||
capabilities.PhysicalBlockSize = physicalsectorsize;
|
|
||||||
|
|
||||||
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);
|
capabilities.LogicalAlignment = (ushort)(ataId.LogicalAlignment & 0x3FFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF)
|
if(ataId.EccBytes != 0x0000 &&
|
||||||
capabilities.LongBlockSize = logicalsectorsize + ataId.EccBytes;
|
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))
|
(!(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF) || capabilities.LongBlockSize == 516))
|
||||||
capabilities.LongBlockSize = ataId.UnformattedBPS;
|
capabilities.LongBlockSize = ataId.UnformattedBPS;
|
||||||
|
|
||||||
@@ -421,6 +505,7 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
ataId.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial))
|
ataId.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial))
|
||||||
{
|
{
|
||||||
capabilities.CanReadMediaSerial = true;
|
capabilities.CanReadMediaSerial = true;
|
||||||
|
|
||||||
if(!string.IsNullOrWhiteSpace(ataId.MediaManufacturer))
|
if(!string.IsNullOrWhiteSpace(ataId.MediaManufacturer))
|
||||||
capabilities.Manufacturer = ataId.MediaManufacturer;
|
capabilities.Manufacturer = ataId.MediaManufacturer;
|
||||||
}
|
}
|
||||||
@@ -429,96 +514,129 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
bool sense;
|
bool sense;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ SECTOR(S) in CHS mode...");
|
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,
|
sense = _dev.Read(out byte[] readBuf, out AtaErrorRegistersChs errorChs, false, 0, 0, 1, 1, _dev.Timeout,
|
||||||
out _);
|
out _);
|
||||||
|
|
||||||
capabilities.SupportsReadSectors = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
capabilities.SupportsReadSectors = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadSectorsData = readBuf;
|
capabilities.ReadSectorsData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in CHS mode...");
|
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 _);
|
sense = _dev.Read(out readBuf, out errorChs, true, 0, 0, 1, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
capabilities.SupportsReadRetry =
|
capabilities.SupportsReadRetry =
|
||||||
!sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 && readBuf.Length > 0;
|
!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}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadSectorsRetryData = readBuf;
|
capabilities.ReadSectorsRetryData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ DMA in CHS mode...");
|
DicConsole.WriteLine("Trying READ DMA in CHS mode...");
|
||||||
sense = _dev.ReadDma(out readBuf, out errorChs, false, 0, 0, 1, 1, _dev.Timeout, out _);
|
sense = _dev.ReadDma(out readBuf, out errorChs, false, 0, 0, 1, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
capabilities.SupportsReadDma =
|
capabilities.SupportsReadDma =
|
||||||
!sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 && readBuf.Length > 0;
|
!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}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadDmaData = readBuf;
|
capabilities.ReadDmaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ DMA RETRY in CHS mode...");
|
DicConsole.WriteLine("Trying READ DMA RETRY in CHS mode...");
|
||||||
sense = _dev.ReadDma(out readBuf, out errorChs, true, 0, 0, 1, 1, _dev.Timeout, out _);
|
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 &&
|
capabilities.SupportsReadDmaRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadDmaRetryData = readBuf;
|
capabilities.ReadDmaRetryData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SEEK in CHS mode...");
|
DicConsole.WriteLine("Trying SEEK in CHS mode...");
|
||||||
sense = _dev.Seek(out errorChs, 0, 0, 1, _dev.Timeout, out _);
|
sense = _dev.Seek(out errorChs, 0, 0, 1, _dev.Timeout, out _);
|
||||||
capabilities.SupportsSeek = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0;
|
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,
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}", sense,
|
||||||
errorChs.Status, errorChs.Error);
|
errorChs.Status, errorChs.Error);
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA mode...");
|
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA mode...");
|
||||||
sense = _dev.Read(out readBuf, out AtaErrorRegistersLba28 errorLba, false, 0, 1, _dev.Timeout, out _);
|
sense = _dev.Read(out readBuf, out AtaErrorRegistersLba28 errorLba, false, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
capabilities.SupportsReadLba =
|
capabilities.SupportsReadLba =
|
||||||
!sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 && readBuf.Length > 0;
|
!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}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadLbaData = readBuf;
|
capabilities.ReadLbaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in LBA mode...");
|
DicConsole.WriteLine("Trying READ SECTOR(S) RETRY in LBA mode...");
|
||||||
sense = _dev.Read(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
|
sense = _dev.Read(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
capabilities.SupportsReadRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
capabilities.SupportsReadRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadRetryLbaData = readBuf;
|
capabilities.ReadRetryLbaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ DMA in LBA mode...");
|
DicConsole.WriteLine("Trying READ DMA in LBA mode...");
|
||||||
sense = _dev.ReadDma(out readBuf, out errorLba, false, 0, 1, _dev.Timeout, out _);
|
sense = _dev.ReadDma(out readBuf, out errorLba, false, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
capabilities.SupportsReadDmaLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
capabilities.SupportsReadDmaLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadDmaLbaData = readBuf;
|
capabilities.ReadDmaLbaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ DMA RETRY in LBA mode...");
|
DicConsole.WriteLine("Trying READ DMA RETRY in LBA mode...");
|
||||||
sense = _dev.ReadDma(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
|
sense = _dev.ReadDma(out readBuf, out errorLba, true, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
capabilities.SupportsReadDmaRetryLba =
|
capabilities.SupportsReadDmaRetryLba =
|
||||||
!sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 && readBuf.Length > 0;
|
!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}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadDmaRetryLbaData = readBuf;
|
capabilities.ReadDmaRetryLbaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SEEK in LBA mode...");
|
DicConsole.WriteLine("Trying SEEK in LBA mode...");
|
||||||
sense = _dev.Seek(out errorLba, 0, _dev.Timeout, out _);
|
sense = _dev.Seek(out errorLba, 0, _dev.Timeout, out _);
|
||||||
capabilities.SupportsSeekLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0;
|
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,
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}", sense,
|
||||||
errorLba.Status, errorLba.Error);
|
errorLba.Status, errorLba.Error);
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA48 mode...");
|
DicConsole.WriteLine("Trying READ SECTOR(S) in LBA48 mode...");
|
||||||
sense = _dev.Read(out readBuf, out AtaErrorRegistersLba48 errorLba48, 0, 1, _dev.Timeout, out _);
|
sense = _dev.Read(out readBuf, out AtaErrorRegistersLba48 errorLba48, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
capabilities.SupportsReadLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 && errorLba48.Error == 0 &&
|
capabilities.SupportsReadLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 && errorLba48.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorLba48.Status, errorLba48.Error, readBuf.Length);
|
sense, errorLba48.Status, errorLba48.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadLba48Data = readBuf;
|
capabilities.ReadLba48Data = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ DMA in LBA48 mode...");
|
DicConsole.WriteLine("Trying READ DMA in LBA48 mode...");
|
||||||
sense = _dev.ReadDma(out readBuf, out errorLba48, 0, 1, _dev.Timeout, out _);
|
sense = _dev.ReadDma(out readBuf, out errorLba48, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
capabilities.SupportsReadDmaLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 && errorLba48.Error == 0 &&
|
capabilities.SupportsReadDmaLba48 = !sense && (errorLba48.Status & 0x01) != 0x01 && errorLba48.Error == 0 &&
|
||||||
readBuf.Length > 0;
|
readBuf.Length > 0;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorLba48.Status, errorLba48.Error, readBuf.Length);
|
sense, errorLba48.Status, errorLba48.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadDmaLba48Data = readBuf;
|
capabilities.ReadDmaLba48Data = readBuf;
|
||||||
|
|
||||||
// Send SET FEATURES before sending READ LONG commands, retrieve IDENTIFY again and
|
// 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.SetFeatures(out _, AtaFeatures.EnableReadLongVendorLength, 0, 0, 1, 0, _dev.Timeout, out _);
|
||||||
|
|
||||||
_dev.AtaIdentify(out byte[] buffer, out _, _dev.Timeout, out _);
|
_dev.AtaIdentify(out byte[] buffer, out _, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(Identify.Decode(buffer).HasValue)
|
if(Identify.Decode(buffer).HasValue)
|
||||||
{
|
{
|
||||||
ataId = Identify.Decode(buffer).Value;
|
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))
|
(!(ataId.EccBytes != 0x0000 && ataId.EccBytes != 0xFFFF) || capabilities.LongBlockSize == 516))
|
||||||
capabilities.LongBlockSize = ataId.UnformattedBPS;
|
capabilities.LongBlockSize = ataId.UnformattedBPS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ LONG in CHS mode...");
|
DicConsole.WriteLine("Trying READ LONG in CHS mode...");
|
||||||
|
|
||||||
sense = _dev.ReadLong(out readBuf, out errorChs, false, 0, 0, 1, capabilities.LongBlockSize ?? 0,
|
sense = _dev.ReadLong(out readBuf, out errorChs, false, 0, 0, 1, capabilities.LongBlockSize ?? 0,
|
||||||
_dev.Timeout, out _);
|
_dev.Timeout, out _);
|
||||||
|
|
||||||
capabilities.SupportsReadLong = !sense && (errorChs.Status & 0x01) != 0x01 &&
|
capabilities.SupportsReadLong = !sense && (errorChs.Status & 0x01) != 0x01 &&
|
||||||
errorChs.Error == 0 &&
|
errorChs.Error == 0 &&
|
||||||
readBuf.Length > 0 &&
|
readBuf.Length > 0 &&
|
||||||
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
|
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadLongData = readBuf;
|
capabilities.ReadLongData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ LONG RETRY in CHS mode...");
|
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 &&
|
capabilities.SupportsReadLongRetry = !sense && (errorChs.Status & 0x01) != 0x01 && errorChs.Error == 0 &&
|
||||||
readBuf.Length > 0 &&
|
readBuf.Length > 0 &&
|
||||||
BitConverter.ToUInt64(readBuf, 0) !=
|
BitConverter.ToUInt64(readBuf, 0) !=
|
||||||
checkCorrectRead;
|
checkCorrectRead;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
sense, errorChs.Status, errorChs.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadLongRetryData = readBuf;
|
capabilities.ReadLongRetryData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ LONG in LBA mode...");
|
DicConsole.WriteLine("Trying READ LONG in LBA mode...");
|
||||||
|
|
||||||
sense = _dev.ReadLong(out readBuf, out errorLba, false, 0, capabilities.LongBlockSize ?? 0, _dev.Timeout,
|
sense = _dev.ReadLong(out readBuf, out errorLba, false, 0, capabilities.LongBlockSize ?? 0, _dev.Timeout,
|
||||||
out _);
|
out _);
|
||||||
|
|
||||||
capabilities.SupportsReadLongLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
capabilities.SupportsReadLongLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
||||||
readBuf.Length > 0 &&
|
readBuf.Length > 0 &&
|
||||||
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
|
BitConverter.ToUInt64(readBuf, 0) != checkCorrectRead;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadLongLbaData = readBuf;
|
capabilities.ReadLongLbaData = readBuf;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying READ LONG RETRY in LBA mode...");
|
DicConsole.WriteLine("Trying READ LONG RETRY in LBA mode...");
|
||||||
|
|
||||||
sense = _dev.ReadLong(out readBuf, out errorLba, true, 0, capabilities.LongBlockSize ?? 0, _dev.Timeout,
|
sense = _dev.ReadLong(out readBuf, out errorLba, true, 0, capabilities.LongBlockSize ?? 0, _dev.Timeout,
|
||||||
out _);
|
out _);
|
||||||
|
|
||||||
capabilities.SupportsReadLongRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
capabilities.SupportsReadLongRetryLba = !sense && (errorLba.Status & 0x01) != 0x01 && errorLba.Error == 0 &&
|
||||||
readBuf.Length > 0 &&
|
readBuf.Length > 0 &&
|
||||||
BitConverter.ToUInt64(readBuf, 0) !=
|
BitConverter.ToUInt64(readBuf, 0) !=
|
||||||
checkCorrectRead;
|
checkCorrectRead;
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
DicConsole.DebugWriteLine("ATA Report", "Sense = {0}, Status = 0x{1:X2}, Error = 0x{2:X2}, Length = {3}",
|
||||||
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
sense, errorLba.Status, errorLba.Error, readBuf.Length);
|
||||||
|
|
||||||
capabilities.ReadLongRetryLbaData = readBuf;
|
capabilities.ReadLongRetryLbaData = readBuf;
|
||||||
|
|
||||||
return capabilities;
|
return capabilities;
|
||||||
|
|||||||
@@ -36,11 +36,8 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
public partial class DeviceReport
|
public partial class DeviceReport
|
||||||
{
|
{
|
||||||
Device _dev;
|
readonly Device _dev;
|
||||||
|
|
||||||
public DeviceReport(Device device)
|
public DeviceReport(Device device) => _dev = device;
|
||||||
{
|
|
||||||
_dev = device;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -34,20 +34,13 @@ using DiscImageChef.CommonTypes.Metadata;
|
|||||||
|
|
||||||
namespace DiscImageChef.Core.Devices.Report
|
namespace DiscImageChef.Core.Devices.Report
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>Implements creating a report for a FireWire device</summary>
|
||||||
/// Implements creating a report for a FireWire device
|
|
||||||
/// </summary>
|
|
||||||
public partial class DeviceReport
|
public partial class DeviceReport
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>Fills a device report with parameters specific to a FireWire device</summary>
|
||||||
/// Fills a device report with parameters specific to a FireWire device
|
public FireWire FireWireReport() => new FireWire
|
||||||
/// </summary>
|
|
||||||
public FireWire FireWireReport() =>
|
|
||||||
new FireWire
|
|
||||||
{
|
{
|
||||||
Manufacturer = _dev.FireWireVendorName,
|
Manufacturer = _dev.FireWireVendorName, Product = _dev.FireWireModelName, ProductID = _dev.FireWireModel,
|
||||||
Product = _dev.FireWireModelName,
|
|
||||||
ProductID = _dev.FireWireModel,
|
|
||||||
VendorID = _dev.FireWireVendor
|
VendorID = _dev.FireWireVendor
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -584,11 +584,9 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
mediaTest.SupportsReadCapacity = true;
|
mediaTest.SupportsReadCapacity = true;
|
||||||
|
|
||||||
mediaTest.Blocks =
|
mediaTest.Blocks = (ulong)((buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]) + 1;
|
||||||
(ulong)((buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]) + 1;
|
|
||||||
|
|
||||||
mediaTest.BlockSize =
|
mediaTest.BlockSize = (uint)((buffer[5] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
|
||||||
(uint)((buffer[5] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
|
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
|
||||||
@@ -617,7 +615,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
|
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.ModeSense10Data = buffer;
|
mediaTest.ModeSense10Data = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -630,7 +627,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
if(!decMode.HasValue)
|
if(!decMode.HasValue)
|
||||||
decMode = Modes.DecodeMode6(buffer, _dev.ScsiType);
|
decMode = Modes.DecodeMode6(buffer, _dev.ScsiType);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.ModeSense6Data = buffer;
|
mediaTest.ModeSense6Data = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -654,14 +650,12 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadTOC);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadTOC);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.TocData = buffer;
|
mediaTest.TocData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying CD Full TOC...");
|
DicConsole.WriteLine("Querying CD Full TOC...");
|
||||||
mediaTest.CanReadFullTOC = !_dev.ReadRawToc(out buffer, out senseBuffer, 1, _dev.Timeout, out _);
|
mediaTest.CanReadFullTOC = !_dev.ReadRawToc(out buffer, out senseBuffer, 1, _dev.Timeout, out _);
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadFullTOC);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadFullTOC);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.FullTocData = buffer;
|
mediaTest.FullTocData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -672,14 +666,12 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
mediaTest.CanReadATIP = !_dev.ReadAtip(out buffer, out senseBuffer, _dev.Timeout, out _);
|
mediaTest.CanReadATIP = !_dev.ReadAtip(out buffer, out senseBuffer, _dev.Timeout, out _);
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadATIP);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadATIP);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.AtipData = buffer;
|
mediaTest.AtipData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying CD PMA...");
|
DicConsole.WriteLine("Querying CD PMA...");
|
||||||
mediaTest.CanReadPMA = !_dev.ReadPma(out buffer, out senseBuffer, _dev.Timeout, out _);
|
mediaTest.CanReadPMA = !_dev.ReadPma(out buffer, out senseBuffer, _dev.Timeout, out _);
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPMA);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPMA);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PmaData = buffer;
|
mediaTest.PmaData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -696,7 +688,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPFI);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPFI);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PfiData = buffer;
|
mediaTest.PfiData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying DVD DMI...");
|
DicConsole.WriteLine("Querying DVD DMI...");
|
||||||
@@ -708,7 +699,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDMI);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDMI);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.DmiData = buffer;
|
mediaTest.DmiData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -723,7 +713,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCMI);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCMI);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.CmiData = buffer;
|
mediaTest.CmiData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -740,7 +729,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.DvdBcaData = buffer;
|
mediaTest.DvdBcaData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying DVD AACS...");
|
DicConsole.WriteLine("Querying DVD AACS...");
|
||||||
@@ -752,7 +740,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadAACS);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadAACS);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.DvdAacsData = buffer;
|
mediaTest.DvdAacsData = buffer;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -767,7 +754,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.DvdBcaData = buffer;
|
mediaTest.DvdBcaData = buffer;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -786,7 +772,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadBCA);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.BluBcaData = buffer;
|
mediaTest.BluBcaData = buffer;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -801,7 +786,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDDS);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDDS);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.DvdDdsData = buffer;
|
mediaTest.DvdDdsData = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadSpareAreaInformation =
|
mediaTest.CanReadSpareAreaInformation =
|
||||||
@@ -811,7 +795,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadSpareAreaInformation);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadSpareAreaInformation);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.DvdSaiData = buffer;
|
mediaTest.DvdSaiData = buffer;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -822,13 +805,12 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
DicConsole.WriteLine("Querying BD DDS...");
|
DicConsole.WriteLine("Querying BD DDS...");
|
||||||
|
|
||||||
mediaTest.CanReadDDS = !_dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Bd,
|
mediaTest.CanReadDDS = !_dev.ReadDiscStructure(out buffer, out senseBuffer,
|
||||||
0, 0, MmcDiscStructureFormat.BdDds, 0, _dev.Timeout,
|
MmcDiscStructureMediaType.Bd, 0, 0,
|
||||||
out _);
|
MmcDiscStructureFormat.BdDds, 0, _dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDDS);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDDS);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.BluDdsData = buffer;
|
mediaTest.BluDdsData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying BD SAI...");
|
DicConsole.WriteLine("Querying BD SAI...");
|
||||||
@@ -839,7 +821,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadSpareAreaInformation);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadSpareAreaInformation);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.BluSaiData = buffer;
|
mediaTest.BluSaiData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -855,7 +836,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPRI);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPRI);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PriData = buffer;
|
mediaTest.PriData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -880,7 +860,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRecordablePFI);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRecordablePFI);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.EmbossedPfiData = buffer;
|
mediaTest.EmbossedPfiData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -895,7 +874,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadADIP);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadADIP);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.AdipData = buffer;
|
mediaTest.AdipData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying DVD DCB...");
|
DicConsole.WriteLine("Querying DVD DCB...");
|
||||||
@@ -906,7 +884,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDCB);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDCB);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.DcbData = buffer;
|
mediaTest.DcbData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -921,7 +898,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadHDCMI);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadHDCMI);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.HdCmiData = buffer;
|
mediaTest.HdCmiData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -936,7 +912,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadLayerCapacity);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadLayerCapacity);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.DvdLayerData = buffer;
|
mediaTest.DvdLayerData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -956,17 +931,16 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDiscInformation);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadDiscInformation);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.BluDiData = buffer;
|
mediaTest.BluDiData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying BD PAC...");
|
DicConsole.WriteLine("Querying BD PAC...");
|
||||||
|
|
||||||
mediaTest.CanReadPAC = !_dev.ReadDiscStructure(out buffer, out senseBuffer, MmcDiscStructureMediaType.Bd,
|
mediaTest.CanReadPAC = !_dev.ReadDiscStructure(out buffer, out senseBuffer,
|
||||||
0, 0, MmcDiscStructureFormat.Pac, 0, _dev.Timeout, out _);
|
MmcDiscStructureMediaType.Bd, 0, 0,
|
||||||
|
MmcDiscStructureFormat.Pac, 0, _dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPAC);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPAC);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.BluPacData = buffer;
|
mediaTest.BluPacData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -979,7 +953,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
MmcHeaderCodes.None, true, false, MmcErrorField.None,
|
MmcHeaderCodes.None, true, false, MmcErrorField.None,
|
||||||
MmcSubchannel.None, _dev.Timeout, out _);
|
MmcSubchannel.None, _dev.Timeout, out _);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.ReadCdScrambledData = buffer;
|
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 _);
|
mediaTest.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 16, 512, _dev.Timeout, out _);
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead6);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead6);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.Read6Data = buffer;
|
mediaTest.Read6Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (10)...");
|
DicConsole.WriteLine("Trying SCSI READ (10)...");
|
||||||
@@ -999,7 +971,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.Read10Data = buffer;
|
mediaTest.Read10Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (12)...");
|
DicConsole.WriteLine("Trying SCSI READ (12)...");
|
||||||
@@ -1009,7 +980,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.Read12Data = buffer;
|
mediaTest.Read12Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (16)...");
|
DicConsole.WriteLine("Trying SCSI READ (16)...");
|
||||||
@@ -1019,7 +989,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.Read16Data = buffer;
|
mediaTest.Read16Data = buffer;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1028,7 +997,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
mediaTest.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 16, 2048, _dev.Timeout, out _);
|
mediaTest.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 16, 2048, _dev.Timeout, out _);
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead6);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead6);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.Read6Data = buffer;
|
mediaTest.Read6Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (10)...");
|
DicConsole.WriteLine("Trying SCSI READ (10)...");
|
||||||
@@ -1038,7 +1006,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.Read10Data = buffer;
|
mediaTest.Read10Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (12)...");
|
DicConsole.WriteLine("Trying SCSI READ (12)...");
|
||||||
@@ -1048,7 +1015,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.Read12Data = buffer;
|
mediaTest.Read12Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (16)...");
|
DicConsole.WriteLine("Trying SCSI READ (16)...");
|
||||||
@@ -1058,7 +1024,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.Read16Data = buffer;
|
mediaTest.Read16Data = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1077,7 +1042,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCd);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCd);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.ReadCdFullData = buffer;
|
mediaTest.ReadCdFullData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ CD MSF...");
|
DicConsole.WriteLine("Trying SCSI READ CD MSF...");
|
||||||
@@ -1089,7 +1053,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsf);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsf);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.ReadCdMsfFullData = buffer;
|
mediaTest.ReadCdMsfFullData = buffer;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1103,7 +1066,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCd);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCd);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.ReadCdData = buffer;
|
mediaTest.ReadCdData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ CD MSF...");
|
DicConsole.WriteLine("Trying SCSI READ CD MSF...");
|
||||||
@@ -1115,39 +1077,37 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsf);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsf);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.ReadCdMsfData = buffer;
|
mediaTest.ReadCdMsfData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ CD full sector...");
|
DicConsole.WriteLine("Trying SCSI READ CD full sector...");
|
||||||
|
|
||||||
mediaTest.SupportsReadCdRaw = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2352, 1,
|
mediaTest.SupportsReadCdRaw = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2352, 1,
|
||||||
MmcSectorTypes.AllTypes, false, false, true,
|
MmcSectorTypes.AllTypes, false, false, true,
|
||||||
MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
|
MmcHeaderCodes.AllHeaders, true, true,
|
||||||
MmcSubchannel.None, _dev.Timeout, out _);
|
MmcErrorField.None, MmcSubchannel.None, _dev.Timeout,
|
||||||
|
out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdRaw);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdRaw);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.ReadCdFullData = buffer;
|
mediaTest.ReadCdFullData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ CD MSF full sector...");
|
DicConsole.WriteLine("Trying SCSI READ CD MSF full sector...");
|
||||||
|
|
||||||
mediaTest.SupportsReadCdMsfRaw = !_dev.ReadCdMsf(out buffer, out senseBuffer, 0x00000210, 0x00000211,
|
mediaTest.SupportsReadCdMsfRaw = !_dev.ReadCdMsf(out buffer, out senseBuffer, 0x00000210,
|
||||||
2352, MmcSectorTypes.AllTypes, false, false,
|
0x00000211, 2352, MmcSectorTypes.AllTypes, false,
|
||||||
MmcHeaderCodes.AllHeaders, true, true,
|
false, MmcHeaderCodes.AllHeaders, true, true,
|
||||||
MmcErrorField.None, MmcSubchannel.None, _dev.Timeout,
|
MmcErrorField.None, MmcSubchannel.None,
|
||||||
out _);
|
_dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsfRaw);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsReadCdMsfRaw);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.ReadCdMsfFullData = buffer;
|
mediaTest.ReadCdMsfFullData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mediaTest.SupportsReadCdRaw == true ||
|
if(mediaTest.SupportsReadCdRaw == true ||
|
||||||
mediaType == "Audio CD")
|
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++)
|
for(int i = -150; i < 0; i++)
|
||||||
{
|
{
|
||||||
@@ -1162,7 +1122,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", sense);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", sense);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.Track1PregapData = buffer;
|
mediaTest.Track1PregapData = buffer;
|
||||||
|
|
||||||
if(sense)
|
if(sense)
|
||||||
@@ -1191,7 +1150,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", sense);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", sense);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.LeadInData = buffer;
|
mediaTest.LeadInData = buffer;
|
||||||
|
|
||||||
if(sense)
|
if(sense)
|
||||||
@@ -1220,7 +1178,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadLeadOut);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadLeadOut);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.LeadOutData = buffer;
|
mediaTest.LeadOutData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1231,8 +1188,8 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2646, 1,
|
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2646, 1,
|
||||||
MmcSectorTypes.Cdda, false, false, false,
|
MmcSectorTypes.Cdda, false, false, false,
|
||||||
MmcHeaderCodes.None, true, false,
|
MmcHeaderCodes.None, true, false,
|
||||||
MmcErrorField.C2Pointers, MmcSubchannel.None, _dev.Timeout,
|
MmcErrorField.C2Pointers, MmcSubchannel.None,
|
||||||
out _);
|
_dev.Timeout, out _);
|
||||||
|
|
||||||
if(!mediaTest.CanReadC2Pointers == true)
|
if(!mediaTest.CanReadC2Pointers == true)
|
||||||
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2648, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadC2Pointers);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.C2PointersData = buffer;
|
mediaTest.C2PointersData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying to read subchannels...");
|
DicConsole.WriteLine("Trying to read subchannels...");
|
||||||
@@ -1255,7 +1211,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PQSubchannelData = buffer;
|
mediaTest.PQSubchannelData = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadRWSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2448, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannel);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.RWSubchannelData = buffer;
|
mediaTest.RWSubchannelData = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2448, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCorrectedSubchannel);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.CorrectedSubchannelData = buffer;
|
mediaTest.CorrectedSubchannelData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying to read subchannels with C2 Pointers...");
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannelWithC2);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PQSubchannelWithC2Data = buffer;
|
mediaTest.PQSubchannelWithC2Data = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadRWSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2712, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannelWithC2);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.RWSubchannelWithC2Data = buffer;
|
mediaTest.RWSubchannelWithC2Data = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2712, 1,
|
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2712, 1,
|
||||||
MmcSectorTypes.Cdda, false, false, false,
|
MmcSectorTypes.Cdda, false, false, false,
|
||||||
MmcHeaderCodes.None, true, false,
|
MmcHeaderCodes.None, true, false,
|
||||||
MmcErrorField.C2Pointers, MmcSubchannel.Rw,
|
MmcErrorField.C2Pointers,
|
||||||
_dev.Timeout, out _);
|
MmcSubchannel.Rw, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(mediaTest.CanReadCorrectedSubchannelWithC2 == false)
|
if(mediaTest.CanReadCorrectedSubchannelWithC2 == false)
|
||||||
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2714,
|
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 0, 2714,
|
||||||
@@ -1329,12 +1280,12 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
false, MmcHeaderCodes.None, true,
|
false, MmcHeaderCodes.None, true,
|
||||||
false,
|
false,
|
||||||
MmcErrorField.C2PointersAndBlock,
|
MmcErrorField.C2PointersAndBlock,
|
||||||
MmcSubchannel.Rw, _dev.Timeout, out _);
|
MmcSubchannel.Rw, _dev.Timeout,
|
||||||
|
out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
||||||
!mediaTest.CanReadCorrectedSubchannelWithC2);
|
!mediaTest.CanReadCorrectedSubchannelWithC2);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.CorrectedSubchannelWithC2Data = buffer;
|
mediaTest.CorrectedSubchannelWithC2Data = buffer;
|
||||||
}
|
}
|
||||||
else if(mediaTest.SupportsReadCdRaw == true)
|
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,
|
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2646, 1,
|
||||||
MmcSectorTypes.AllTypes, false, false, true,
|
MmcSectorTypes.AllTypes, false, false, true,
|
||||||
MmcHeaderCodes.AllHeaders, true, true,
|
MmcHeaderCodes.AllHeaders, true, true,
|
||||||
MmcErrorField.C2Pointers, MmcSubchannel.None, _dev.Timeout,
|
MmcErrorField.C2Pointers, MmcSubchannel.None,
|
||||||
out _);
|
_dev.Timeout, out _);
|
||||||
|
|
||||||
if(mediaTest.CanReadC2Pointers == false)
|
if(mediaTest.CanReadC2Pointers == false)
|
||||||
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2648, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadC2Pointers);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.C2PointersData = buffer;
|
mediaTest.C2PointersData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying to read subchannels...");
|
DicConsole.WriteLine("Trying to read subchannels...");
|
||||||
@@ -1369,7 +1319,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PQSubchannelData = buffer;
|
mediaTest.PQSubchannelData = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadRWSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2448, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannel);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.RWSubchannelData = buffer;
|
mediaTest.RWSubchannelData = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2448, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCorrectedSubchannel);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.CorrectedSubchannelData = buffer;
|
mediaTest.CorrectedSubchannelData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying to read subchannels with C2 Pointers...");
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannelWithC2);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PQSubchannelWithC2Data = buffer;
|
mediaTest.PQSubchannelWithC2Data = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadRWSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2712, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannelWithC2);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.RWSubchannelWithC2Data = buffer;
|
mediaTest.RWSubchannelWithC2Data = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2712, 1,
|
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2712, 1,
|
||||||
@@ -1441,15 +1386,15 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
if(mediaTest.CanReadCorrectedSubchannelWithC2 == false)
|
if(mediaTest.CanReadCorrectedSubchannelWithC2 == false)
|
||||||
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2714,
|
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2714,
|
||||||
1, MmcSectorTypes.AllTypes, false,
|
1, MmcSectorTypes.AllTypes, false,
|
||||||
false, true, MmcHeaderCodes.AllHeaders,
|
false, true,
|
||||||
true, true,
|
MmcHeaderCodes.AllHeaders, true, true,
|
||||||
MmcErrorField.C2PointersAndBlock,
|
MmcErrorField.C2PointersAndBlock,
|
||||||
MmcSubchannel.Rw, _dev.Timeout, out _);
|
MmcSubchannel.Rw, _dev.Timeout,
|
||||||
|
out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
||||||
!mediaTest.CanReadCorrectedSubchannelWithC2);
|
!mediaTest.CanReadCorrectedSubchannelWithC2);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.CorrectedSubchannelWithC2Data = buffer;
|
mediaTest.CorrectedSubchannelWithC2Data = buffer;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1459,8 +1404,8 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2342, 1,
|
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2342, 1,
|
||||||
MmcSectorTypes.AllTypes, false, false, false,
|
MmcSectorTypes.AllTypes, false, false, false,
|
||||||
MmcHeaderCodes.None, true, false,
|
MmcHeaderCodes.None, true, false,
|
||||||
MmcErrorField.C2Pointers, MmcSubchannel.None, _dev.Timeout,
|
MmcErrorField.C2Pointers, MmcSubchannel.None,
|
||||||
out _);
|
_dev.Timeout, out _);
|
||||||
|
|
||||||
if(mediaTest.CanReadC2Pointers == false)
|
if(mediaTest.CanReadC2Pointers == false)
|
||||||
mediaTest.CanReadC2Pointers = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2344, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadC2Pointers);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.C2PointersData = buffer;
|
mediaTest.C2PointersData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying to read subchannels...");
|
DicConsole.WriteLine("Trying to read subchannels...");
|
||||||
@@ -1483,7 +1427,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannel);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PQSubchannelData = buffer;
|
mediaTest.PQSubchannelData = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadRWSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2144, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannel);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.RWSubchannelData = buffer;
|
mediaTest.RWSubchannelData = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2144, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCorrectedSubchannel);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.CorrectedSubchannelData = buffer;
|
mediaTest.CorrectedSubchannelData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying to read subchannels with C2 Pointers...");
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadPQSubchannelWithC2);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PQSubchannelWithC2Data = buffer;
|
mediaTest.PQSubchannelWithC2Data = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadRWSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2438, 1,
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadRWSubchannelWithC2);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.RWSubchannelWithC2Data = buffer;
|
mediaTest.RWSubchannelWithC2Data = buffer;
|
||||||
|
|
||||||
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2438, 1,
|
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2438, 1,
|
||||||
MmcSectorTypes.AllTypes, false, false,
|
MmcSectorTypes.AllTypes, false, false,
|
||||||
false, MmcHeaderCodes.None, true, false,
|
false, MmcHeaderCodes.None, true, false,
|
||||||
MmcErrorField.C2Pointers, MmcSubchannel.Rw,
|
MmcErrorField.C2Pointers,
|
||||||
_dev.Timeout, out _);
|
MmcSubchannel.Rw, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(mediaTest.CanReadCorrectedSubchannelWithC2 == false)
|
if(mediaTest.CanReadCorrectedSubchannelWithC2 == false)
|
||||||
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2440,
|
mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2440,
|
||||||
@@ -1557,12 +1496,12 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
false, false, MmcHeaderCodes.None,
|
false, false, MmcHeaderCodes.None,
|
||||||
true, false,
|
true, false,
|
||||||
MmcErrorField.C2PointersAndBlock,
|
MmcErrorField.C2PointersAndBlock,
|
||||||
MmcSubchannel.Rw, _dev.Timeout, out _);
|
MmcSubchannel.Rw, _dev.Timeout,
|
||||||
|
out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
||||||
!mediaTest.CanReadCorrectedSubchannelWithC2);
|
!mediaTest.CanReadCorrectedSubchannelWithC2);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.CorrectedSubchannelWithC2Data = buffer;
|
mediaTest.CorrectedSubchannelWithC2Data = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1576,7 +1515,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsPlextorReadCDDA);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsPlextorReadCDDA);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PlextorReadCddaData = buffer;
|
mediaTest.PlextorReadCddaData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1590,7 +1528,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsPioneerReadCDDA);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsPioneerReadCDDA);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PioneerReadCddaData = buffer;
|
mediaTest.PioneerReadCddaData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying Pioneer READ CD-DA MSF...");
|
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);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsPioneerReadCDDAMSF);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.PioneerReadCddaMsfData = buffer;
|
mediaTest.PioneerReadCddaMsfData = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1614,7 +1550,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsNECReadCDDA);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsNECReadCDDA);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.NecReadCddaData = buffer;
|
mediaTest.NecReadCddaData = buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1694,7 +1629,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
mediaTest.CanReadFullTOC = !_dev.ReadRawToc(out buffer, out senseBuffer, 1, _dev.Timeout, out _);
|
mediaTest.CanReadFullTOC = !_dev.ReadRawToc(out buffer, out senseBuffer, 1, _dev.Timeout, out _);
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadFullTOC);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadFullTOC);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.FullTocData = buffer;
|
mediaTest.FullTocData = buffer;
|
||||||
|
|
||||||
if(mediaTest.CanReadFullTOC == true)
|
if(mediaTest.CanReadFullTOC == true)
|
||||||
@@ -1762,9 +1696,10 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
mediaTest.CanReadingIntersessionLeadOut = !_dev.ReadCd(out buffer, out senseBuffer,
|
mediaTest.CanReadingIntersessionLeadOut = !_dev.ReadCd(out buffer, out senseBuffer,
|
||||||
firstSessionLeadOutLba, 2368, 1,
|
firstSessionLeadOutLba, 2368, 1,
|
||||||
MmcSectorTypes.AllTypes, false, false,
|
MmcSectorTypes.AllTypes, false,
|
||||||
false, MmcHeaderCodes.AllHeaders,
|
false, false,
|
||||||
true, false, MmcErrorField.None,
|
MmcHeaderCodes.AllHeaders, true,
|
||||||
|
false, MmcErrorField.None,
|
||||||
MmcSubchannel.Q16, _dev.Timeout,
|
MmcSubchannel.Q16, _dev.Timeout,
|
||||||
out _);
|
out _);
|
||||||
|
|
||||||
@@ -1782,7 +1717,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
||||||
!mediaTest.CanReadingIntersessionLeadOut);
|
!mediaTest.CanReadingIntersessionLeadOut);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.IntersessionLeadOutData = buffer;
|
mediaTest.IntersessionLeadOutData = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ CD in second session Lead-In...");
|
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,
|
mediaTest.CanReadingIntersessionLeadIn = !_dev.ReadCd(out buffer, out senseBuffer,
|
||||||
secondSessionLeadInLba, 2368, 1,
|
secondSessionLeadInLba, 2368, 1,
|
||||||
MmcSectorTypes.AllTypes, false, false,
|
MmcSectorTypes.AllTypes, false, false,
|
||||||
false, MmcHeaderCodes.AllHeaders, true,
|
false, MmcHeaderCodes.AllHeaders,
|
||||||
false, MmcErrorField.None,
|
true, false, MmcErrorField.None,
|
||||||
MmcSubchannel.Q16, _dev.Timeout, out _);
|
MmcSubchannel.Q16, _dev.Timeout,
|
||||||
|
out _);
|
||||||
|
|
||||||
if(mediaTest.CanReadingIntersessionLeadIn == false)
|
if(mediaTest.CanReadingIntersessionLeadIn == false)
|
||||||
mediaTest.CanReadingIntersessionLeadIn = !_dev.ReadCd(out buffer, out senseBuffer,
|
mediaTest.CanReadingIntersessionLeadIn = !_dev.ReadCd(out buffer, out senseBuffer,
|
||||||
@@ -1817,7 +1752,6 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
||||||
!mediaTest.CanReadingIntersessionLeadIn);
|
!mediaTest.CanReadingIntersessionLeadIn);
|
||||||
|
|
||||||
|
|
||||||
mediaTest.IntersessionLeadInData = buffer;
|
mediaTest.IntersessionLeadInData = buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,19 +35,21 @@ using DiscImageChef.Decoders.PCMCIA;
|
|||||||
|
|
||||||
namespace DiscImageChef.Core.Devices.Report
|
namespace DiscImageChef.Core.Devices.Report
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>Implements creating a report for a PCMCIA device</summary>
|
||||||
/// Implements creating a report for a PCMCIA device
|
|
||||||
/// </summary>
|
|
||||||
public partial class DeviceReport
|
public partial class DeviceReport
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>Fills a device report with parameters specific to a PCMCIA device</summary>
|
||||||
/// Fills a device report with parameters specific to a PCMCIA device
|
|
||||||
/// </summary>
|
|
||||||
public Pcmcia PcmciaReport()
|
public Pcmcia PcmciaReport()
|
||||||
{
|
{
|
||||||
Pcmcia pcmciaReport = new Pcmcia {CIS = _dev.Cis};
|
var pcmciaReport = new Pcmcia
|
||||||
|
{
|
||||||
|
CIS = _dev.Cis
|
||||||
|
};
|
||||||
|
|
||||||
Tuple[] tuples = CIS.GetTuples(_dev.Cis);
|
Tuple[] tuples = CIS.GetTuples(_dev.Cis);
|
||||||
if(tuples == null) return pcmciaReport;
|
|
||||||
|
if(tuples == null)
|
||||||
|
return pcmciaReport;
|
||||||
|
|
||||||
foreach(Tuple tuple in tuples)
|
foreach(Tuple tuple in tuples)
|
||||||
switch(tuple.Code)
|
switch(tuple.Code)
|
||||||
|
|||||||
@@ -43,30 +43,38 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
public Ssc ReportScsiSsc()
|
public Ssc ReportScsiSsc()
|
||||||
{
|
{
|
||||||
Ssc report = new Ssc();
|
var report = new Ssc();
|
||||||
DicConsole.WriteLine("Querying SCSI READ BLOCK LIMITS...");
|
DicConsole.WriteLine("Querying SCSI READ BLOCK LIMITS...");
|
||||||
bool sense = _dev.ReadBlockLimits(out byte[] buffer, out byte[] _, _dev.Timeout, out _);
|
bool sense = _dev.ReadBlockLimits(out byte[] buffer, out byte[] _, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(!sense)
|
if(!sense)
|
||||||
{
|
{
|
||||||
BlockLimits.BlockLimitsData? decBl = BlockLimits.Decode(buffer);
|
BlockLimits.BlockLimitsData? decBl = BlockLimits.Decode(buffer);
|
||||||
|
|
||||||
if(decBl.HasValue)
|
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...");
|
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT...");
|
||||||
sense = _dev.ReportDensitySupport(out buffer, out byte[] _, false, false, _dev.Timeout, out _);
|
sense = _dev.ReportDensitySupport(out buffer, out byte[] _, false, false, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(!sense)
|
if(!sense)
|
||||||
{
|
{
|
||||||
DensitySupport.DensitySupportHeader? dsh = DensitySupport.DecodeDensity(buffer);
|
DensitySupport.DensitySupportHeader? dsh = DensitySupport.DecodeDensity(buffer);
|
||||||
|
|
||||||
if(dsh.HasValue)
|
if(dsh.HasValue)
|
||||||
{
|
{
|
||||||
SupportedDensity[] array = new SupportedDensity[dsh.Value.descriptors.Length];
|
SupportedDensity[] array = new SupportedDensity[dsh.Value.descriptors.Length];
|
||||||
|
|
||||||
for(int i = 0; i < dsh.Value.descriptors.Length; i++)
|
for(int i = 0; i < dsh.Value.descriptors.Length; i++)
|
||||||
array[i] = new SupportedDensity
|
array[i] = new SupportedDensity
|
||||||
{
|
{
|
||||||
@@ -74,13 +82,11 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
Capacity = dsh.Value.descriptors[i].capacity,
|
Capacity = dsh.Value.descriptors[i].capacity,
|
||||||
DefaultDensity = dsh.Value.descriptors[i].defaultDensity,
|
DefaultDensity = dsh.Value.descriptors[i].defaultDensity,
|
||||||
Description = dsh.Value.descriptors[i].description,
|
Description = dsh.Value.descriptors[i].description,
|
||||||
Duplicate = dsh.Value.descriptors[i].duplicate,
|
Duplicate = dsh.Value.descriptors[i].duplicate, Name = dsh.Value.descriptors[i].name,
|
||||||
Name = dsh.Value.descriptors[i].name,
|
|
||||||
Organization = dsh.Value.descriptors[i].organization,
|
Organization = dsh.Value.descriptors[i].organization,
|
||||||
PrimaryCode = dsh.Value.descriptors[i].primaryCode,
|
PrimaryCode = dsh.Value.descriptors[i].primaryCode,
|
||||||
SecondaryCode = dsh.Value.descriptors[i].secondaryCode,
|
SecondaryCode = dsh.Value.descriptors[i].secondaryCode,
|
||||||
Tracks = dsh.Value.descriptors[i].tracks,
|
Tracks = dsh.Value.descriptors[i].tracks, Width = dsh.Value.descriptors[i].width,
|
||||||
Width = dsh.Value.descriptors[i].width,
|
|
||||||
Writable = dsh.Value.descriptors[i].writable
|
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...");
|
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for medium types...");
|
||||||
sense = _dev.ReportDensitySupport(out buffer, out byte[] _, true, false, _dev.Timeout, out _);
|
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);
|
DensitySupport.MediaTypeSupportHeader? mtsh = DensitySupport.DecodeMediumType(buffer);
|
||||||
if(!mtsh.HasValue) return report;
|
|
||||||
|
if(!mtsh.HasValue)
|
||||||
|
return report;
|
||||||
|
|
||||||
SscSupportedMedia[] array2 = new SscSupportedMedia[mtsh.Value.descriptors.Length];
|
SscSupportedMedia[] array2 = new SscSupportedMedia[mtsh.Value.descriptors.Length];
|
||||||
|
|
||||||
for(int i = 0; i < mtsh.Value.descriptors.Length; i++)
|
for(int i = 0; i < mtsh.Value.descriptors.Length; i++)
|
||||||
{
|
{
|
||||||
array2[i] = new SscSupportedMedia
|
array2[i] = new SscSupportedMedia
|
||||||
{
|
{
|
||||||
Description = mtsh.Value.descriptors[i].description,
|
Description = mtsh.Value.descriptors[i].description, Length = mtsh.Value.descriptors[i].length,
|
||||||
Length = mtsh.Value.descriptors[i].length,
|
MediumType = mtsh.Value.descriptors[i].mediumType, Name = mtsh.Value.descriptors[i].name,
|
||||||
MediumType = mtsh.Value.descriptors[i].mediumType,
|
Organization = mtsh.Value.descriptors[i].organization, Width = mtsh.Value.descriptors[i].width
|
||||||
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];
|
DensityCode[] array3 = new DensityCode[mtsh.Value.descriptors[i].densityCodes.Length];
|
||||||
|
|
||||||
for(int j = 0; j < mtsh.Value.descriptors[i].densityCodes.Length; j++)
|
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();
|
array2[i].DensityCodes = array3.Distinct().ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,14 +137,17 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
public TestedSequentialMedia ReportSscMedia()
|
public TestedSequentialMedia ReportSscMedia()
|
||||||
{
|
{
|
||||||
TestedSequentialMedia seqTest = new TestedSequentialMedia();
|
var seqTest = new TestedSequentialMedia();
|
||||||
|
|
||||||
Modes.DecodedMode? decMode = null;
|
Modes.DecodedMode? decMode = null;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
|
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 _);
|
bool sense = _dev.ModeSense10(out byte[] buffer, out byte[] _, false, true,
|
||||||
if(!sense && !_dev.Error)
|
ScsiModeSensePageControl.Current, 0x3F, 0x00, _dev.Timeout, out _);
|
||||||
|
|
||||||
|
if(!sense &&
|
||||||
|
!_dev.Error)
|
||||||
{
|
{
|
||||||
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
|
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
|
||||||
seqTest.ModeSense10Data = buffer;
|
seqTest.ModeSense10Data = buffer;
|
||||||
@@ -137,27 +155,36 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
|
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
|
||||||
sense = _dev.ModeSense(out buffer, out byte[] _, _dev.Timeout, out _);
|
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;
|
seqTest.ModeSense6Data = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(decMode.HasValue)
|
if(decMode.HasValue)
|
||||||
{
|
{
|
||||||
seqTest.MediumType = (byte)decMode.Value.Header.MediumType;
|
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;
|
seqTest.Density = (byte)decMode.Value.Header.BlockDescriptors[0].Density;
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for current media...");
|
DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for current media...");
|
||||||
sense = _dev.ReportDensitySupport(out buffer, out byte[] _, false, true, _dev.Timeout, out _);
|
sense = _dev.ReportDensitySupport(out buffer, out byte[] _, false, true, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(!sense)
|
if(!sense)
|
||||||
{
|
{
|
||||||
DensitySupport.DensitySupportHeader? dsh = DensitySupport.DecodeDensity(buffer);
|
DensitySupport.DensitySupportHeader? dsh = DensitySupport.DecodeDensity(buffer);
|
||||||
|
|
||||||
if(dsh.HasValue)
|
if(dsh.HasValue)
|
||||||
{
|
{
|
||||||
SupportedDensity[] array = new SupportedDensity[dsh.Value.descriptors.Length];
|
SupportedDensity[] array = new SupportedDensity[dsh.Value.descriptors.Length];
|
||||||
|
|
||||||
for(int i = 0; i < dsh.Value.descriptors.Length; i++)
|
for(int i = 0; i < dsh.Value.descriptors.Length; i++)
|
||||||
array[i] = new SupportedDensity
|
array[i] = new SupportedDensity
|
||||||
{
|
{
|
||||||
@@ -165,13 +192,11 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
Capacity = dsh.Value.descriptors[i].capacity,
|
Capacity = dsh.Value.descriptors[i].capacity,
|
||||||
DefaultDensity = dsh.Value.descriptors[i].defaultDensity,
|
DefaultDensity = dsh.Value.descriptors[i].defaultDensity,
|
||||||
Description = dsh.Value.descriptors[i].description,
|
Description = dsh.Value.descriptors[i].description,
|
||||||
Duplicate = dsh.Value.descriptors[i].duplicate,
|
Duplicate = dsh.Value.descriptors[i].duplicate, Name = dsh.Value.descriptors[i].name,
|
||||||
Name = dsh.Value.descriptors[i].name,
|
|
||||||
Organization = dsh.Value.descriptors[i].organization,
|
Organization = dsh.Value.descriptors[i].organization,
|
||||||
PrimaryCode = dsh.Value.descriptors[i].primaryCode,
|
PrimaryCode = dsh.Value.descriptors[i].primaryCode,
|
||||||
SecondaryCode = dsh.Value.descriptors[i].secondaryCode,
|
SecondaryCode = dsh.Value.descriptors[i].secondaryCode,
|
||||||
Tracks = dsh.Value.descriptors[i].tracks,
|
Tracks = dsh.Value.descriptors[i].tracks, Width = dsh.Value.descriptors[i].width,
|
||||||
Width = dsh.Value.descriptors[i].width,
|
|
||||||
Writable = dsh.Value.descriptors[i].writable
|
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...");
|
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 _);
|
sense = _dev.ReportDensitySupport(out buffer, out byte[] _, true, true, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(!sense)
|
if(!sense)
|
||||||
{
|
{
|
||||||
DensitySupport.MediaTypeSupportHeader? mtsh = DensitySupport.DecodeMediumType(buffer);
|
DensitySupport.MediaTypeSupportHeader? mtsh = DensitySupport.DecodeMediumType(buffer);
|
||||||
|
|
||||||
if(mtsh.HasValue)
|
if(mtsh.HasValue)
|
||||||
{
|
{
|
||||||
SscSupportedMedia[] array = new SscSupportedMedia[mtsh.Value.descriptors.Length];
|
SscSupportedMedia[] array = new SscSupportedMedia[mtsh.Value.descriptors.Length];
|
||||||
|
|
||||||
for(int i = 0; i < mtsh.Value.descriptors.Length; i++)
|
for(int i = 0; i < mtsh.Value.descriptors.Length; i++)
|
||||||
{
|
{
|
||||||
array[i] = new SscSupportedMedia
|
array[i] = new SscSupportedMedia
|
||||||
{
|
{
|
||||||
Description = mtsh.Value.descriptors[i].description,
|
Description = mtsh.Value.descriptors[i].description,
|
||||||
Length = mtsh.Value.descriptors[i].length,
|
Length = mtsh.Value.descriptors[i].length,
|
||||||
MediumType = mtsh.Value.descriptors[i].mediumType,
|
MediumType = mtsh.Value.descriptors[i].mediumType, Name = mtsh.Value.descriptors[i].name,
|
||||||
Name = mtsh.Value.descriptors[i].name,
|
|
||||||
Organization = mtsh.Value.descriptors[i].organization,
|
Organization = mtsh.Value.descriptors[i].organization,
|
||||||
Width = mtsh.Value.descriptors[i].width
|
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];
|
DensityCode[] array2 = new DensityCode[mtsh.Value.descriptors[i].densityCodes.Length];
|
||||||
|
|
||||||
for(int j = 0; j < mtsh.Value.descriptors[i].densityCodes.Length; j++)
|
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();
|
array[i].DensityCodes = array2.Distinct().ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,13 +47,15 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
DicConsole.WriteLine("Querying SCSI INQUIRY...");
|
DicConsole.WriteLine("Querying SCSI INQUIRY...");
|
||||||
bool sense = _dev.ScsiInquiry(out byte[] buffer, out byte[] senseBuffer);
|
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);
|
Inquiry.SCSIInquiry? decodedNullable = Inquiry.Decode(buffer);
|
||||||
|
|
||||||
if(!decodedNullable.HasValue) return null;
|
if(!decodedNullable.HasValue)
|
||||||
|
return null;
|
||||||
|
|
||||||
Inquiry.SCSIInquiry decoded = decodedNullable.Value;
|
Inquiry.SCSIInquiry decoded = decodedNullable.Value;
|
||||||
|
|
||||||
@@ -73,39 +75,51 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
DicConsole.WriteLine("Querying list of SCSI EVPDs...");
|
DicConsole.WriteLine("Querying list of SCSI EVPDs...");
|
||||||
bool sense = _dev.ScsiInquiry(out byte[] buffer, out _, 0x00);
|
bool sense = _dev.ScsiInquiry(out byte[] buffer, out _, 0x00);
|
||||||
|
|
||||||
if(sense) return null;
|
if(sense)
|
||||||
|
return null;
|
||||||
|
|
||||||
byte[] evpdPages = EVPD.DecodePage00(buffer);
|
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>();
|
List<ScsiPage> evpds = new List<ScsiPage>();
|
||||||
|
|
||||||
foreach(byte page in evpdPages.Where(page => page != 0x80))
|
foreach(byte page in evpdPages.Where(page => page != 0x80))
|
||||||
{
|
{
|
||||||
DicConsole.WriteLine("Querying SCSI EVPD {0:X2}h...", page);
|
DicConsole.WriteLine("Querying SCSI EVPD {0:X2}h...", page);
|
||||||
sense = _dev.ScsiInquiry(out buffer, out _, page);
|
sense = _dev.ScsiInquiry(out buffer, out _, page);
|
||||||
if(sense) continue;
|
|
||||||
|
if(sense)
|
||||||
|
continue;
|
||||||
|
|
||||||
byte[] empty;
|
byte[] empty;
|
||||||
|
|
||||||
switch(page)
|
switch(page)
|
||||||
{
|
{
|
||||||
case 0x83:
|
case 0x83:
|
||||||
buffer = ClearPage83(buffer);
|
buffer = ClearPage83(buffer);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 0x80:
|
case 0x80:
|
||||||
byte[] identify = new byte[512];
|
byte[] identify = new byte[512];
|
||||||
Array.Copy(buffer, 60, identify, 0, 512);
|
Array.Copy(buffer, 60, identify, 0, 512);
|
||||||
identify = ClearIdentify(identify);
|
identify = ClearIdentify(identify);
|
||||||
Array.Copy(identify, 0, buffer, 60, 512);
|
Array.Copy(identify, 0, buffer, 60, 512);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 0xB1:
|
case 0xB1:
|
||||||
case 0xB3:
|
case 0xB3:
|
||||||
empty = new byte[buffer.Length - 4];
|
empty = new byte[buffer.Length - 4];
|
||||||
Array.Copy(empty, 0, buffer, 4, buffer.Length - 4);
|
Array.Copy(empty, 0, buffer, 4, buffer.Length - 4);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 0xC1 when vendor == "ibm":
|
case 0xC1 when vendor == "ibm":
|
||||||
empty = new byte[12];
|
empty = new byte[12];
|
||||||
Array.Copy(empty, 0, buffer, 4, 12);
|
Array.Copy(empty, 0, buffer, 4, 12);
|
||||||
Array.Copy(empty, 0, buffer, 16, 12);
|
Array.Copy(empty, 0, buffer, 16, 12);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 0xC2 when vendor == "certance":
|
case 0xC2 when vendor == "certance":
|
||||||
case 0xC3 when vendor == "certance":
|
case 0xC3 when vendor == "certance":
|
||||||
@@ -113,10 +127,15 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
case 0xC5 when vendor == "certance":
|
case 0xC5 when vendor == "certance":
|
||||||
case 0xC6 when vendor == "certance":
|
case 0xC6 when vendor == "certance":
|
||||||
Array.Copy(new byte[12], 0, buffer, 4, 12);
|
Array.Copy(new byte[12], 0, buffer, 4, 12);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScsiPage evpd = new ScsiPage {page = page, value = buffer};
|
var evpd = new ScsiPage
|
||||||
|
{
|
||||||
|
page = page, value = buffer
|
||||||
|
};
|
||||||
|
|
||||||
evpds.Add(evpd);
|
evpds.Add(evpd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,18 +144,24 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
byte[] ClearPage83(byte[] pageResponse)
|
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;
|
int position = 4;
|
||||||
|
|
||||||
while(position < pageResponse.Length)
|
while(position < pageResponse.Length)
|
||||||
{
|
{
|
||||||
byte length = pageResponse[position + 3];
|
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];
|
byte[] empty = new byte[length];
|
||||||
Array.Copy(empty, 0, pageResponse, position + 4, length);
|
Array.Copy(empty, 0, pageResponse, position + 4, length);
|
||||||
|
|
||||||
@@ -150,32 +175,44 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
Modes.DecodedMode? decMode = null;
|
Modes.DecodedMode? decMode = null;
|
||||||
PeripheralDeviceTypes devType = _dev.ScsiType;
|
PeripheralDeviceTypes devType = _dev.ScsiType;
|
||||||
byte[] mode10Currentbuffer;
|
byte[] mode10CurrentBuffer;
|
||||||
byte[] mode10Changeablebuffer;
|
byte[] mode10ChangeableBuffer;
|
||||||
byte[] mode6Currentbuffer;
|
byte[] mode6CurrentBuffer;
|
||||||
byte[] mode6Changeablebuffer;
|
byte[] mode6ChangeableBuffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (10)...");
|
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,
|
bool sense = _dev.ModeSense10(out byte[] mode10Buffer, out _, false, true, ScsiModeSensePageControl.Default,
|
||||||
0x3F, 0xFF, _dev.Timeout, out _);
|
0x3F, 0xFF, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(sense || _dev.Error)
|
if(sense || _dev.Error)
|
||||||
{
|
{
|
||||||
DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (10)...");
|
DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (10)...");
|
||||||
|
|
||||||
sense = _dev.ModeSense10(out mode10Buffer, out _, false, true, ScsiModeSensePageControl.Default, 0x3F,
|
sense = _dev.ModeSense10(out mode10Buffer, out _, false, true, ScsiModeSensePageControl.Default, 0x3F,
|
||||||
0x00, _dev.Timeout, out _);
|
0x00, _dev.Timeout, out _);
|
||||||
if(!sense && !_dev.Error)
|
|
||||||
|
if(!sense &&
|
||||||
|
!_dev.Error)
|
||||||
{
|
{
|
||||||
report.SCSI.SupportsModeSense10 = true;
|
report.SCSI.SupportsModeSense10 = true;
|
||||||
report.SCSI.SupportsModeSubpages = false;
|
report.SCSI.SupportsModeSubpages = false;
|
||||||
decMode = Modes.DecodeMode10(mode10Buffer, devType);
|
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 _);
|
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 _);
|
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);
|
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 _);
|
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 _);
|
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)...");
|
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,
|
sense = _dev.ModeSense6(out byte[] mode6Buffer, out _, false, ScsiModeSensePageControl.Default, 0x3F, 0xFF,
|
||||||
_dev.Timeout, out _);
|
_dev.Timeout, out _);
|
||||||
|
|
||||||
if(sense || _dev.Error)
|
if(sense || _dev.Error)
|
||||||
{
|
{
|
||||||
DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (6)...");
|
DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (6)...");
|
||||||
|
|
||||||
sense = _dev.ModeSense6(out mode6Buffer, out _, false, ScsiModeSensePageControl.Default, 0x3F, 0x00,
|
sense = _dev.ModeSense6(out mode6Buffer, out _, false, ScsiModeSensePageControl.Default, 0x3F, 0x00,
|
||||||
_dev.Timeout, out _);
|
_dev.Timeout, out _);
|
||||||
|
|
||||||
if(sense || _dev.Error)
|
if(sense || _dev.Error)
|
||||||
{
|
{
|
||||||
DicConsole.WriteLine("Querying SCSI MODE SENSE (6)...");
|
DicConsole.WriteLine("Querying SCSI MODE SENSE (6)...");
|
||||||
@@ -210,12 +258,19 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sense = _dev.ModeSense6(out mode6Currentbuffer, out _, false, ScsiModeSensePageControl.Current, 0x3F,
|
sense = _dev.ModeSense6(out mode6CurrentBuffer, out _, false, ScsiModeSensePageControl.Current,
|
||||||
0x00, _dev.Timeout, out _);
|
|
||||||
if(!sense && !_dev.Error) report.SCSI.ModeSense6CurrentData = mode6Currentbuffer;
|
|
||||||
sense = _dev.ModeSense6(out mode6Changeablebuffer, out _, false, ScsiModeSensePageControl.Changeable,
|
|
||||||
0x3F, 0x00, _dev.Timeout, out _);
|
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
|
else
|
||||||
@@ -223,69 +278,96 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
report.SCSI.SupportsModeSubpages = true;
|
report.SCSI.SupportsModeSubpages = true;
|
||||||
|
|
||||||
{
|
{
|
||||||
sense = _dev.ModeSense6(out mode6Currentbuffer, out _, false, ScsiModeSensePageControl.Current, 0x3F,
|
sense = _dev.ModeSense6(out mode6CurrentBuffer, out _, false, ScsiModeSensePageControl.Current,
|
||||||
0xFF, _dev.Timeout, out _);
|
|
||||||
if(!sense && !_dev.Error) report.SCSI.ModeSense6CurrentData = mode6Currentbuffer;
|
|
||||||
sense = _dev.ModeSense6(out mode6Changeablebuffer, out _, false, ScsiModeSensePageControl.Changeable,
|
|
||||||
0x3F, 0xFF, _dev.Timeout, out _);
|
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;
|
report.SCSI.SupportsModeSense6 |= !sense && !_dev.Error;
|
||||||
|
|
||||||
cdromMode = null;
|
cdromMode = null;
|
||||||
|
|
||||||
if(report.SCSI.SupportsModeSense6) report.SCSI.ModeSense6Data = mode6Buffer;
|
if(report.SCSI.SupportsModeSense6)
|
||||||
if(report.SCSI.SupportsModeSense10) report.SCSI.ModeSense10Data = mode10Buffer;
|
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
|
report.SCSI.ModeSense = new ScsiMode
|
||||||
{
|
{
|
||||||
BlankCheckEnabled = decMode.Value.Header.EBC,
|
BlankCheckEnabled = decMode.Value.Header.EBC, DPOandFUA = decMode.Value.Header.DPOFUA,
|
||||||
DPOandFUA = decMode.Value.Header.DPOFUA,
|
|
||||||
WriteProtected = decMode.Value.Header.WriteProtected
|
WriteProtected = decMode.Value.Header.WriteProtected
|
||||||
};
|
};
|
||||||
|
|
||||||
if(decMode.Value.Header.BufferedMode > 0)
|
if(decMode.Value.Header.BufferedMode > 0)
|
||||||
report.SCSI.ModeSense.BufferedMode = decMode.Value.Header.BufferedMode;
|
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>();
|
List<ScsiPage> modePages = new List<ScsiPage>();
|
||||||
|
|
||||||
foreach(Modes.ModePage page in decMode.Value.Pages)
|
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);
|
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()
|
public TestedMedia ReportScsiMedia()
|
||||||
{
|
{
|
||||||
TestedMedia mediaTest = new TestedMedia();
|
var mediaTest = new TestedMedia();
|
||||||
DicConsole.WriteLine("Querying SCSI READ CAPACITY...");
|
DicConsole.WriteLine("Querying SCSI READ CAPACITY...");
|
||||||
bool sense = _dev.ReadCapacity(out byte[] buffer, out byte[] senseBuffer, _dev.Timeout, out _);
|
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.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[4] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
|
mediaTest.BlockSize = (uint)((buffer[4] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
|
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
|
||||||
sense = _dev.ReadCapacity16(out buffer, out buffer, _dev.Timeout, out _);
|
sense = _dev.ReadCapacity16(out buffer, out buffer, _dev.Timeout, out _);
|
||||||
if(!sense && !_dev.Error)
|
|
||||||
|
if(!sense &&
|
||||||
|
!_dev.Error)
|
||||||
{
|
{
|
||||||
mediaTest.SupportsReadCapacity16 = true;
|
mediaTest.SupportsReadCapacity16 = true;
|
||||||
byte[] temp = new byte[8];
|
byte[] temp = new byte[8];
|
||||||
@@ -298,9 +380,12 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
Modes.DecodedMode? decMode = null;
|
Modes.DecodedMode? decMode = null;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
|
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
|
||||||
|
|
||||||
sense = _dev.ModeSense10(out buffer, out senseBuffer, false, true, ScsiModeSensePageControl.Current, 0x3F,
|
sense = _dev.ModeSense10(out buffer, out senseBuffer, false, true, ScsiModeSensePageControl.Current, 0x3F,
|
||||||
0x00, _dev.Timeout, out _);
|
0x00, _dev.Timeout, out _);
|
||||||
if(!sense && !_dev.Error)
|
|
||||||
|
if(!sense &&
|
||||||
|
!_dev.Error)
|
||||||
{
|
{
|
||||||
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
|
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
|
||||||
mediaTest.ModeSense10Data = buffer;
|
mediaTest.ModeSense10Data = buffer;
|
||||||
@@ -308,78 +393,104 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
|
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
|
||||||
sense = _dev.ModeSense(out buffer, out senseBuffer, _dev.Timeout, out _);
|
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;
|
mediaTest.ModeSense6Data = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(decMode.HasValue)
|
if(decMode.HasValue)
|
||||||
{
|
{
|
||||||
mediaTest.MediumType = (byte)decMode.Value.Header.MediumType;
|
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;
|
mediaTest.Density = (byte)decMode.Value.Header.BlockDescriptors[0].Density;
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (6)...");
|
DicConsole.WriteLine("Trying SCSI READ (6)...");
|
||||||
|
|
||||||
mediaTest.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 0,
|
mediaTest.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 0,
|
||||||
mediaTest.BlockSize ?? 512, _dev.Timeout, out _);
|
mediaTest.BlockSize ?? 512, _dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead6);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead6);
|
||||||
mediaTest.Read6Data = buffer;
|
mediaTest.Read6Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (10)...");
|
DicConsole.WriteLine("Trying SCSI READ (10)...");
|
||||||
|
|
||||||
mediaTest.SupportsRead10 = !_dev.Read10(out buffer, out senseBuffer, 0, false, true, false, false, 0,
|
mediaTest.SupportsRead10 = !_dev.Read10(out buffer, out senseBuffer, 0, false, true, false, false, 0,
|
||||||
mediaTest.BlockSize ?? 512, 0, 1, _dev.Timeout, out _);
|
mediaTest.BlockSize ?? 512, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead10);
|
||||||
mediaTest.Read10Data = buffer;
|
mediaTest.Read10Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (12)...");
|
DicConsole.WriteLine("Trying SCSI READ (12)...");
|
||||||
|
|
||||||
mediaTest.SupportsRead12 = !_dev.Read12(out buffer, out senseBuffer, 0, false, true, false, false, 0,
|
mediaTest.SupportsRead12 = !_dev.Read12(out buffer, out senseBuffer, 0, false, true, false, false, 0,
|
||||||
mediaTest.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
|
mediaTest.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead12);
|
||||||
mediaTest.Read12Data = buffer;
|
mediaTest.Read12Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (16)...");
|
DicConsole.WriteLine("Trying SCSI READ (16)...");
|
||||||
|
|
||||||
mediaTest.SupportsRead16 = !_dev.Read16(out buffer, out senseBuffer, 0, false, true, false, 0,
|
mediaTest.SupportsRead16 = !_dev.Read16(out buffer, out senseBuffer, 0, false, true, false, 0,
|
||||||
mediaTest.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
|
mediaTest.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.SupportsRead16);
|
||||||
mediaTest.Read16Data = buffer;
|
mediaTest.Read16Data = buffer;
|
||||||
|
|
||||||
mediaTest.LongBlockSize = mediaTest.BlockSize;
|
mediaTest.LongBlockSize = mediaTest.BlockSize;
|
||||||
DicConsole.WriteLine("Trying SCSI READ LONG (10)...");
|
DicConsole.WriteLine("Trying SCSI READ LONG (10)...");
|
||||||
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, _dev.Timeout, out _);
|
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(sense && !_dev.Error)
|
if(sense && !_dev.Error)
|
||||||
{
|
{
|
||||||
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
|
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
|
||||||
|
|
||||||
if(decSense.HasValue)
|
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)
|
decSense.Value.ASCQ == 0x00)
|
||||||
{
|
{
|
||||||
mediaTest.SupportsReadLong = true;
|
mediaTest.SupportsReadLong = true;
|
||||||
if(decSense.Value.InformationValid && decSense.Value.ILI)
|
|
||||||
|
if(decSense.Value.InformationValid &&
|
||||||
|
decSense.Value.ILI)
|
||||||
mediaTest.LongBlockSize = 0xFFFF - (decSense.Value.Information & 0xFFFF);
|
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)
|
if(mediaTest.BlockSize == 512)
|
||||||
foreach(int i in new[]
|
foreach(int i in new[]
|
||||||
{
|
{
|
||||||
// Long sector sizes for floppies
|
// Long sector sizes for floppies
|
||||||
514,
|
514,
|
||||||
|
|
||||||
// Long sector sizes for SuperDisk
|
// Long sector sizes for SuperDisk
|
||||||
536, 558,
|
536, 558,
|
||||||
|
|
||||||
// Long sector sizes for 512-byte magneto-opticals
|
// Long sector sizes for 512-byte magneto-opticals
|
||||||
600, 610, 630
|
600, 610, 630
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
ushort testSize = (ushort)i;
|
ushort testSize = (ushort)i;
|
||||||
|
|
||||||
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, testSize, _dev.Timeout,
|
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, testSize, _dev.Timeout,
|
||||||
out _);
|
out _);
|
||||||
if(sense || _dev.Error) continue;
|
|
||||||
|
if(sense || _dev.Error)
|
||||||
|
continue;
|
||||||
|
|
||||||
mediaTest.SupportsReadLong = true;
|
mediaTest.SupportsReadLong = true;
|
||||||
mediaTest.LongBlockSize = testSize;
|
mediaTest.LongBlockSize = testSize;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if(mediaTest.BlockSize == 1024)
|
else if(mediaTest.BlockSize == 1024)
|
||||||
@@ -387,23 +498,30 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
// Long sector sizes for floppies
|
// Long sector sizes for floppies
|
||||||
1026,
|
1026,
|
||||||
|
|
||||||
// Long sector sizes for 1024-byte magneto-opticals
|
// Long sector sizes for 1024-byte magneto-opticals
|
||||||
1200
|
1200
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
ushort testSize = (ushort)i;
|
ushort testSize = (ushort)i;
|
||||||
|
|
||||||
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, (ushort)i, _dev.Timeout,
|
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, (ushort)i, _dev.Timeout,
|
||||||
out _);
|
out _);
|
||||||
if(sense || _dev.Error) continue;
|
|
||||||
|
if(sense || _dev.Error)
|
||||||
|
continue;
|
||||||
|
|
||||||
mediaTest.SupportsReadLong = true;
|
mediaTest.SupportsReadLong = true;
|
||||||
mediaTest.LongBlockSize = testSize;
|
mediaTest.LongBlockSize = testSize;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if(mediaTest.BlockSize == 2048)
|
else if(mediaTest.BlockSize == 2048)
|
||||||
{
|
{
|
||||||
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 2380, _dev.Timeout, out _);
|
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.SupportsReadLong = true;
|
||||||
mediaTest.LongBlockSize = 2380;
|
mediaTest.LongBlockSize = 2380;
|
||||||
@@ -412,7 +530,9 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
else if(mediaTest.BlockSize == 4096)
|
else if(mediaTest.BlockSize == 4096)
|
||||||
{
|
{
|
||||||
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 4760, _dev.Timeout, out _);
|
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.SupportsReadLong = true;
|
||||||
mediaTest.LongBlockSize = 4760;
|
mediaTest.LongBlockSize = 4760;
|
||||||
@@ -421,7 +541,9 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
else if(mediaTest.BlockSize == 8192)
|
else if(mediaTest.BlockSize == 8192)
|
||||||
{
|
{
|
||||||
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 9424, _dev.Timeout, out _);
|
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.SupportsReadLong = true;
|
||||||
mediaTest.LongBlockSize = 9424;
|
mediaTest.LongBlockSize = 9424;
|
||||||
@@ -429,29 +551,38 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ MEDIA SERIAL NUMBER...");
|
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;
|
return mediaTest;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestedMedia ReportScsi()
|
public TestedMedia ReportScsi()
|
||||||
{
|
{
|
||||||
TestedMedia capabilities = new TestedMedia {MediaIsRecognized = true};
|
var capabilities = new TestedMedia
|
||||||
|
{
|
||||||
|
MediaIsRecognized = true
|
||||||
|
};
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI READ CAPACITY...");
|
DicConsole.WriteLine("Querying SCSI READ CAPACITY...");
|
||||||
bool sense = _dev.ReadCapacity(out byte[] buffer, out byte[] senseBuffer, _dev.Timeout, out _);
|
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.SupportsReadCapacity = true;
|
||||||
capabilities.Blocks =
|
|
||||||
(ulong)((buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]) + 1;
|
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.BlockSize = (uint)((buffer[4] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + buffer[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
|
DicConsole.WriteLine("Querying SCSI READ CAPACITY (16)...");
|
||||||
sense = _dev.ReadCapacity16(out buffer, out buffer, _dev.Timeout, out _);
|
sense = _dev.ReadCapacity16(out buffer, out buffer, _dev.Timeout, out _);
|
||||||
if(!sense && !_dev.Error)
|
|
||||||
|
if(!sense &&
|
||||||
|
!_dev.Error)
|
||||||
{
|
{
|
||||||
capabilities.SupportsReadCapacity16 = true;
|
capabilities.SupportsReadCapacity16 = true;
|
||||||
byte[] temp = new byte[8];
|
byte[] temp = new byte[8];
|
||||||
@@ -464,9 +595,12 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
Modes.DecodedMode? decMode = null;
|
Modes.DecodedMode? decMode = null;
|
||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
|
DicConsole.WriteLine("Querying SCSI MODE SENSE (10)...");
|
||||||
|
|
||||||
sense = _dev.ModeSense10(out buffer, out senseBuffer, false, true, ScsiModeSensePageControl.Current, 0x3F,
|
sense = _dev.ModeSense10(out buffer, out senseBuffer, false, true, ScsiModeSensePageControl.Current, 0x3F,
|
||||||
0x00, _dev.Timeout, out _);
|
0x00, _dev.Timeout, out _);
|
||||||
if(!sense && !_dev.Error)
|
|
||||||
|
if(!sense &&
|
||||||
|
!_dev.Error)
|
||||||
{
|
{
|
||||||
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
|
decMode = Modes.DecodeMode10(buffer, _dev.ScsiType);
|
||||||
capabilities.ModeSense10Data = buffer;
|
capabilities.ModeSense10Data = buffer;
|
||||||
@@ -474,60 +608,80 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
|
|
||||||
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
|
DicConsole.WriteLine("Querying SCSI MODE SENSE...");
|
||||||
sense = _dev.ModeSense(out buffer, out senseBuffer, _dev.Timeout, out _);
|
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;
|
capabilities.ModeSense6Data = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(decMode.HasValue)
|
if(decMode.HasValue)
|
||||||
{
|
{
|
||||||
capabilities.MediumType = (byte)decMode.Value.Header.MediumType;
|
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;
|
capabilities.Density = (byte)decMode.Value.Header.BlockDescriptors[0].Density;
|
||||||
}
|
}
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (6)...");
|
DicConsole.WriteLine("Trying SCSI READ (6)...");
|
||||||
|
|
||||||
capabilities.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 0, capabilities.BlockSize ?? 512,
|
capabilities.SupportsRead6 = !_dev.Read6(out buffer, out senseBuffer, 0, capabilities.BlockSize ?? 512,
|
||||||
_dev.Timeout, out _);
|
_dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead6);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead6);
|
||||||
capabilities.Read6Data = buffer;
|
capabilities.Read6Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (10)...");
|
DicConsole.WriteLine("Trying SCSI READ (10)...");
|
||||||
|
|
||||||
capabilities.SupportsRead10 = !_dev.Read10(out buffer, out senseBuffer, 0, false, true, false, false, 0,
|
capabilities.SupportsRead10 = !_dev.Read10(out buffer, out senseBuffer, 0, false, true, false, false, 0,
|
||||||
capabilities.BlockSize ?? 512, 0, 1, _dev.Timeout, out _);
|
capabilities.BlockSize ?? 512, 0, 1, _dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead10);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead10);
|
||||||
capabilities.Read10Data = buffer;
|
capabilities.Read10Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (12)...");
|
DicConsole.WriteLine("Trying SCSI READ (12)...");
|
||||||
|
|
||||||
capabilities.SupportsRead12 = !_dev.Read12(out buffer, out senseBuffer, 0, false, true, false, false, 0,
|
capabilities.SupportsRead12 = !_dev.Read12(out buffer, out senseBuffer, 0, false, true, false, false, 0,
|
||||||
capabilities.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
|
capabilities.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead12);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead12);
|
||||||
capabilities.Read12Data = buffer;
|
capabilities.Read12Data = buffer;
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying SCSI READ (16)...");
|
DicConsole.WriteLine("Trying SCSI READ (16)...");
|
||||||
|
|
||||||
capabilities.SupportsRead16 = !_dev.Read16(out buffer, out senseBuffer, 0, false, true, false, 0,
|
capabilities.SupportsRead16 = !_dev.Read16(out buffer, out senseBuffer, 0, false, true, false, 0,
|
||||||
capabilities.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
|
capabilities.BlockSize ?? 512, 0, 1, false, _dev.Timeout, out _);
|
||||||
|
|
||||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead16);
|
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !capabilities.SupportsRead16);
|
||||||
capabilities.Read16Data = buffer;
|
capabilities.Read16Data = buffer;
|
||||||
|
|
||||||
capabilities.LongBlockSize = capabilities.BlockSize;
|
capabilities.LongBlockSize = capabilities.BlockSize;
|
||||||
DicConsole.WriteLine("Trying SCSI READ LONG (10)...");
|
DicConsole.WriteLine("Trying SCSI READ LONG (10)...");
|
||||||
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, _dev.Timeout, out _);
|
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 0xFFFF, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(sense && !_dev.Error)
|
if(sense && !_dev.Error)
|
||||||
{
|
{
|
||||||
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
|
FixedSense? decSense = Sense.DecodeFixed(senseBuffer);
|
||||||
|
|
||||||
if(decSense.HasValue)
|
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)
|
decSense.Value.ASCQ == 0x00)
|
||||||
{
|
{
|
||||||
capabilities.SupportsReadLong = true;
|
capabilities.SupportsReadLong = true;
|
||||||
if(decSense.Value.InformationValid && decSense.Value.ILI)
|
|
||||||
|
if(decSense.Value.InformationValid &&
|
||||||
|
decSense.Value.ILI)
|
||||||
capabilities.LongBlockSize = 0xFFFF - (decSense.Value.Information & 0xFFFF);
|
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;
|
return capabilities;
|
||||||
|
|
||||||
if(capabilities.BlockSize == 512)
|
if(capabilities.BlockSize == 512)
|
||||||
@@ -535,18 +689,25 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
// Long sector sizes for floppies
|
// Long sector sizes for floppies
|
||||||
514,
|
514,
|
||||||
|
|
||||||
// Long sector sizes for SuperDisk
|
// Long sector sizes for SuperDisk
|
||||||
536, 558,
|
536, 558,
|
||||||
|
|
||||||
// Long sector sizes for 512-byte magneto-opticals
|
// Long sector sizes for 512-byte magneto-opticals
|
||||||
600, 610, 630
|
600, 610, 630
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
ushort testSize = (ushort)i;
|
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.SupportsReadLong = true;
|
||||||
capabilities.LongBlockSize = testSize;
|
capabilities.LongBlockSize = testSize;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if(capabilities.BlockSize == 1024)
|
else if(capabilities.BlockSize == 1024)
|
||||||
@@ -554,22 +715,30 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
{
|
{
|
||||||
// Long sector sizes for floppies
|
// Long sector sizes for floppies
|
||||||
1026,
|
1026,
|
||||||
|
|
||||||
// Long sector sizes for 1024-byte magneto-opticals
|
// Long sector sizes for 1024-byte magneto-opticals
|
||||||
1200
|
1200
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
ushort testSize = (ushort)i;
|
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.SupportsReadLong = true;
|
||||||
capabilities.LongBlockSize = testSize;
|
capabilities.LongBlockSize = testSize;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if(capabilities.BlockSize == 2048)
|
else if(capabilities.BlockSize == 2048)
|
||||||
{
|
{
|
||||||
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 2380, _dev.Timeout, out _);
|
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.SupportsReadLong = true;
|
||||||
capabilities.LongBlockSize = 2380;
|
capabilities.LongBlockSize = 2380;
|
||||||
@@ -577,7 +746,9 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
else if(capabilities.BlockSize == 4096)
|
else if(capabilities.BlockSize == 4096)
|
||||||
{
|
{
|
||||||
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 4760, _dev.Timeout, out _);
|
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.SupportsReadLong = true;
|
||||||
capabilities.LongBlockSize = 4760;
|
capabilities.LongBlockSize = 4760;
|
||||||
@@ -585,7 +756,9 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
else if(capabilities.BlockSize == 8192)
|
else if(capabilities.BlockSize == 8192)
|
||||||
{
|
{
|
||||||
sense = _dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, 9424, _dev.Timeout, out _);
|
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.SupportsReadLong = true;
|
||||||
capabilities.LongBlockSize = 9424;
|
capabilities.LongBlockSize = 9424;
|
||||||
|
|||||||
@@ -36,17 +36,13 @@ using DiscImageChef.Console;
|
|||||||
|
|
||||||
namespace DiscImageChef.Core.Devices.Report
|
namespace DiscImageChef.Core.Devices.Report
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>Implements creating a device report for a SecureDigital or MultiMediaCard flash card</summary>
|
||||||
/// Implements creating a device report for a SecureDigital or MultiMediaCard flash card
|
|
||||||
/// </summary>
|
|
||||||
public partial class DeviceReport
|
public partial class DeviceReport
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>Creates a device report for a SecureDigital or MultiMediaCard flash card</summary>
|
||||||
/// Creates a device report for a SecureDigital or MultiMediaCard flash card
|
|
||||||
/// </summary>
|
|
||||||
public MmcSd MmcSdReport()
|
public MmcSd MmcSdReport()
|
||||||
{
|
{
|
||||||
MmcSd report = new MmcSd();
|
var report = new MmcSd();
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying to get CID...");
|
DicConsole.WriteLine("Trying to get CID...");
|
||||||
bool sense = _dev.ReadCid(out byte[] cid, out _, _dev.Timeout, out _);
|
bool sense = _dev.ReadCid(out byte[] cid, out _, _dev.Timeout, out _);
|
||||||
@@ -65,6 +61,7 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
cid[12] = 0;
|
cid[12] = 0;
|
||||||
cid[13] = 0;
|
cid[13] = 0;
|
||||||
cid[14] = 0;
|
cid[14] = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case DeviceType.MMC:
|
case DeviceType.MMC:
|
||||||
// Clear serial number and manufacturing date
|
// Clear serial number and manufacturing date
|
||||||
@@ -73,12 +70,14 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
cid[12] = 0;
|
cid[12] = 0;
|
||||||
cid[13] = 0;
|
cid[13] = 0;
|
||||||
cid[14] = 0;
|
cid[14] = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
report.CID = cid;
|
report.CID = cid;
|
||||||
}
|
}
|
||||||
else DicConsole.WriteLine("Could not read CID...");
|
else
|
||||||
|
DicConsole.WriteLine("Could not read CID...");
|
||||||
|
|
||||||
DicConsole.WriteLine("Trying to get CSD...");
|
DicConsole.WriteLine("Trying to get CSD...");
|
||||||
sense = _dev.ReadCsd(out byte[] csd, out _, _dev.Timeout, out _);
|
sense = _dev.ReadCsd(out byte[] csd, out _, _dev.Timeout, out _);
|
||||||
@@ -88,21 +87,25 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
DicConsole.WriteLine("CSD obtained correctly...");
|
DicConsole.WriteLine("CSD obtained correctly...");
|
||||||
report.CSD = csd;
|
report.CSD = csd;
|
||||||
}
|
}
|
||||||
else DicConsole.WriteLine("Could not read CSD...");
|
else
|
||||||
|
DicConsole.WriteLine("Could not read CSD...");
|
||||||
|
|
||||||
sense = true;
|
sense = true;
|
||||||
byte[] ocr = null;
|
byte[] ocr = null;
|
||||||
DicConsole.WriteLine("Trying to get OCR...");
|
DicConsole.WriteLine("Trying to get OCR...");
|
||||||
|
|
||||||
switch(_dev.Type)
|
switch(_dev.Type)
|
||||||
{
|
{
|
||||||
case DeviceType.MMC:
|
case DeviceType.MMC:
|
||||||
{
|
{
|
||||||
sense = _dev.ReadOcr(out ocr, out _, _dev.Timeout, out _);
|
sense = _dev.ReadOcr(out ocr, out _, _dev.Timeout, out _);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DeviceType.SecureDigital:
|
case DeviceType.SecureDigital:
|
||||||
{
|
{
|
||||||
sense = _dev.ReadSdocr(out ocr, out _, _dev.Timeout, out _);
|
sense = _dev.ReadSdocr(out ocr, out _, _dev.Timeout, out _);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -112,7 +115,8 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
DicConsole.WriteLine("OCR obtained correctly...");
|
DicConsole.WriteLine("OCR obtained correctly...");
|
||||||
report.OCR = ocr;
|
report.OCR = ocr;
|
||||||
}
|
}
|
||||||
else DicConsole.WriteLine("Could not read OCR...");
|
else
|
||||||
|
DicConsole.WriteLine("Could not read OCR...");
|
||||||
|
|
||||||
switch(_dev.Type)
|
switch(_dev.Type)
|
||||||
{
|
{
|
||||||
@@ -126,7 +130,8 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
DicConsole.WriteLine("Extended CSD obtained correctly...");
|
DicConsole.WriteLine("Extended CSD obtained correctly...");
|
||||||
report.ExtendedCSD = ecsd;
|
report.ExtendedCSD = ecsd;
|
||||||
}
|
}
|
||||||
else DicConsole.WriteLine("Could not read Extended CSD...");
|
else
|
||||||
|
DicConsole.WriteLine("Could not read Extended CSD...");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -140,7 +145,8 @@ namespace DiscImageChef.Core.Devices.Report
|
|||||||
DicConsole.WriteLine("SCR obtained correctly...");
|
DicConsole.WriteLine("SCR obtained correctly...");
|
||||||
report.SCR = scr;
|
report.SCR = scr;
|
||||||
}
|
}
|
||||||
else DicConsole.WriteLine("Could not read SCR...");
|
else
|
||||||
|
DicConsole.WriteLine("Could not read SCR...");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,30 +34,18 @@ using DiscImageChef.CommonTypes.Metadata;
|
|||||||
|
|
||||||
namespace DiscImageChef.Core.Devices.Report
|
namespace DiscImageChef.Core.Devices.Report
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>Implements creating a report for a USB device</summary>
|
||||||
/// Implements creating a report for a USB device
|
|
||||||
/// </summary>
|
|
||||||
public partial class DeviceReport
|
public partial class DeviceReport
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>Fills a device report with parameters specific to a USB device</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>
|
|
||||||
public Usb UsbReport()
|
public Usb UsbReport()
|
||||||
{
|
{
|
||||||
Usb usbReport = new Usb
|
var usbReport = new Usb
|
||||||
{
|
{
|
||||||
Manufacturer = _dev.UsbManufacturerString,
|
Manufacturer = _dev.UsbManufacturerString, Product = _dev.UsbProductString,
|
||||||
Product = _dev.UsbProductString,
|
ProductID = _dev.UsbProductId, VendorID = _dev.UsbVendorId, Descriptors = _dev.UsbDescriptors
|
||||||
ProductID = _dev.UsbProductId,
|
|
||||||
VendorID = _dev.UsbVendorId
|
|
||||||
};
|
};
|
||||||
|
|
||||||
usbReport.Descriptors = _dev.UsbDescriptors;
|
|
||||||
|
|
||||||
return usbReport;
|
return usbReport;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1261,8 +1261,7 @@ namespace DiscImageChef.Commands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(
|
if(report.SCSI.ReadCapabilities.SupportsReadLong == true &&
|
||||||
report.SCSI.ReadCapabilities.SupportsReadLong == true &&
|
|
||||||
report.SCSI.ReadCapabilities.LongBlockSize !=
|
report.SCSI.ReadCapabilities.LongBlockSize !=
|
||||||
report.SCSI.ReadCapabilities.BlockSize)
|
report.SCSI.ReadCapabilities.BlockSize)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user