Refactor.

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

View File

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