mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Refactor.
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user