mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
* DiscImageChef.Decoders/SCSI/Modes.cs:
Polished some bugs and typos and format * DiscImageChef.Devices/Device/ScsiCommands.cs: Corrected math typo. * DiscImageChef/Commands/DeviceInfo.cs: Added MODE SENSE to device information.
This commit is contained in:
@@ -1,3 +1,8 @@
|
|||||||
|
2015-10-31 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
|
* SCSI/Modes.cs:
|
||||||
|
Polished some bugs and typos and format
|
||||||
|
|
||||||
2015-10-31 Natalia Portillo <claunia@claunia.com>
|
2015-10-31 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
* SCSI/Modes.cs:
|
* SCSI/Modes.cs:
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,8 @@
|
|||||||
|
2015-10-31 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
|
* Device/ScsiCommands.cs:
|
||||||
|
Corrected math typo.
|
||||||
|
|
||||||
2015-10-24 Natalia Portillo <claunia@claunia.com>
|
2015-10-24 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
* Enums.cs:
|
* Enums.cs:
|
||||||
|
|||||||
@@ -357,7 +357,7 @@ namespace DiscImageChef.Devices
|
|||||||
if (sense)
|
if (sense)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
ushort modeLength = (ushort)(((int)buffer[0] << 8) + buffer[1]);
|
ushort modeLength = (ushort)(((int)buffer[0] << 8) + buffer[1] + 2);
|
||||||
buffer = new byte[modeLength];
|
buffer = new byte[modeLength];
|
||||||
cdb[7] = (byte)((buffer.Length & 0xFF00) >> 8);
|
cdb[7] = (byte)((buffer.Length & 0xFF00) >> 8);
|
||||||
cdb[8] = (byte)(buffer.Length & 0xFF);
|
cdb[8] = (byte)(buffer.Length & 0xFF);
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
2015-10-31 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
|
* Commands/DeviceInfo.cs:
|
||||||
|
Added MODE SENSE to device information.
|
||||||
|
|
||||||
2015-10-24 Natalia Portillo <claunia@claunia.com>
|
2015-10-24 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
* DiscImageChef.csproj:
|
* DiscImageChef.csproj:
|
||||||
|
|||||||
@@ -139,7 +139,8 @@ namespace DiscImageChef.Commands
|
|||||||
if (dev.Type != DeviceType.ATAPI)
|
if (dev.Type != DeviceType.ATAPI)
|
||||||
DicConsole.WriteLine("SCSI device");
|
DicConsole.WriteLine("SCSI device");
|
||||||
|
|
||||||
DicConsole.WriteLine(Decoders.SCSI.Inquiry.Prettify(inqBuf));
|
Decoders.SCSI.Inquiry.SCSIInquiry? inq = Decoders.SCSI.Inquiry.Decode(inqBuf);
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Inquiry.Prettify(inq));
|
||||||
|
|
||||||
bool scsi83 = false;
|
bool scsi83 = false;
|
||||||
string scsiSerial = null;
|
string scsiSerial = null;
|
||||||
@@ -151,31 +152,34 @@ namespace DiscImageChef.Commands
|
|||||||
{
|
{
|
||||||
byte[] pages = Decoders.SCSI.EVPD.DecodePage00(inqBuf);
|
byte[] pages = Decoders.SCSI.EVPD.DecodePage00(inqBuf);
|
||||||
|
|
||||||
foreach (byte page in pages)
|
if (pages != null)
|
||||||
{
|
{
|
||||||
if (page >= 0x01 && page <= 0x7F)
|
foreach (byte page in pages)
|
||||||
{
|
{
|
||||||
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
|
if (page >= 0x01 && page <= 0x7F)
|
||||||
if (!sense)
|
|
||||||
{
|
{
|
||||||
if (sb == null)
|
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
|
||||||
sb = new StringBuilder();
|
if (!sense)
|
||||||
sb.AppendFormat("Page 0x{0:X2}: ", Decoders.SCSI.EVPD.DecodeASCIIPage(inqBuf)).AppendLine();
|
{
|
||||||
|
if (sb == null)
|
||||||
|
sb = new StringBuilder();
|
||||||
|
sb.AppendFormat("Page 0x{0:X2}: ", Decoders.SCSI.EVPD.DecodeASCIIPage(inqBuf)).AppendLine();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
else if (page == 0x80)
|
||||||
else if (page == 0x80)
|
|
||||||
{
|
|
||||||
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
|
|
||||||
if (!sense)
|
|
||||||
{
|
{
|
||||||
scsi83 = true;
|
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
|
||||||
scsiSerial = Decoders.SCSI.EVPD.DecodePage80(inqBuf);
|
if (!sense)
|
||||||
|
{
|
||||||
|
scsi83 = true;
|
||||||
|
scsiSerial = Decoders.SCSI.EVPD.DecodePage80(inqBuf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (page != 0x00)
|
||||||
|
DicConsole.DebugWriteLine("Device-Info command", "Found undecoded SCSI VPD page 0x{0:X2}", page);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (page != 0x00)
|
|
||||||
DicConsole.DebugWriteLine("Device-Info command", "Found undecoded SCSI VPD page 0x{0:X2}", page);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -189,6 +193,258 @@ namespace DiscImageChef.Commands
|
|||||||
DicConsole.WriteLine(sb.ToString());
|
DicConsole.WriteLine(sb.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
byte[] modeBuf;
|
||||||
|
double duration;
|
||||||
|
Decoders.SCSI.Modes.DecodedMode? decMode = null;
|
||||||
|
Decoders.SCSI.PeripheralDeviceTypes devType = (DiscImageChef.Decoders.SCSI.PeripheralDeviceTypes)inq.Value.PeripheralDeviceType;
|
||||||
|
|
||||||
|
sense = dev.ModeSense10(out modeBuf, out senseBuf, false, true, ScsiModeSensePageControl.Current, 0x3F, 0xFF, dev.Timeout, out duration);
|
||||||
|
if (sense)
|
||||||
|
{
|
||||||
|
sense = dev.ModeSense10(out modeBuf, out senseBuf, false, true, ScsiModeSensePageControl.Current, 0x3F, 0x00, dev.Timeout, out duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sense)
|
||||||
|
{
|
||||||
|
decMode = Decoders.SCSI.Modes.DecodeMode10(modeBuf, devType);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sense = dev.ModeSense6(out modeBuf, out senseBuf, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, dev.Timeout, out duration);
|
||||||
|
if(sense)
|
||||||
|
sense = dev.ModeSense6(out modeBuf, out senseBuf, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, dev.Timeout, out duration);
|
||||||
|
if(sense)
|
||||||
|
sense = dev.ModeSense(out modeBuf, out senseBuf, 15000, out duration);
|
||||||
|
|
||||||
|
if(!sense)
|
||||||
|
decMode = Decoders.SCSI.Modes.DecodeMode6(modeBuf, devType);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (decMode.HasValue)
|
||||||
|
{
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModeHeader(decMode.Value.Header, devType));
|
||||||
|
|
||||||
|
if (decMode.Value.Pages != null)
|
||||||
|
{
|
||||||
|
foreach (Decoders.SCSI.Modes.ModePage page in decMode.Value.Pages)
|
||||||
|
{
|
||||||
|
//DicConsole.WriteLine("Page {0:X2}h subpage {1:X2}h is {2} bytes long", page.Page, page.Subpage, page.PageResponse.Length);
|
||||||
|
switch (page.Page)
|
||||||
|
{
|
||||||
|
case 0x00:
|
||||||
|
{
|
||||||
|
if (devType == DiscImageChef.Decoders.SCSI.PeripheralDeviceTypes.MultiMediaDevice && page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_00_SFF(page.PageResponse));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (page.Subpage != 0)
|
||||||
|
DicConsole.WriteLine("Found unknown vendor mode page {0:X2}h subpage {1:X2}h", page.Page, page.Subpage);
|
||||||
|
else
|
||||||
|
DicConsole.WriteLine("Found unknown vendor mode page {0:X2}h", page.Page);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x01:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
{
|
||||||
|
if (devType == DiscImageChef.Decoders.SCSI.PeripheralDeviceTypes.MultiMediaDevice)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_01_MMC(page.PageResponse));
|
||||||
|
else
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_01(page.PageResponse));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x02:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_02(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x03:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_03(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x04:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_04(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x05:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_05(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x06:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_06(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x07:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
{
|
||||||
|
if (devType == DiscImageChef.Decoders.SCSI.PeripheralDeviceTypes.MultiMediaDevice)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_07_MMC(page.PageResponse));
|
||||||
|
else
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_07(page.PageResponse));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x08:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_08(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0A:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_0A(page.PageResponse));
|
||||||
|
else if (page.Subpage == 1)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_0A_S01(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0B:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_0B(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0D:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_0D(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0E:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_0E(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0F:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_0F(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x10:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
{
|
||||||
|
if (devType == DiscImageChef.Decoders.SCSI.PeripheralDeviceTypes.SequentialAccess)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_10_SSC(page.PageResponse));
|
||||||
|
else
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_10(page.PageResponse));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x1A:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_1A(page.PageResponse));
|
||||||
|
else if (page.Subpage == 1)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_1A_S01(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x1B:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_1B(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x1C:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
{
|
||||||
|
if (devType == DiscImageChef.Decoders.SCSI.PeripheralDeviceTypes.MultiMediaDevice)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_1C_SFF(page.PageResponse));
|
||||||
|
else
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_1C(page.PageResponse));
|
||||||
|
}
|
||||||
|
else if (page.Subpage == 1)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_1C_S01(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x2A:
|
||||||
|
{
|
||||||
|
if (page.Subpage == 0)
|
||||||
|
DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_2A(page.PageResponse));
|
||||||
|
else
|
||||||
|
goto default;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (page.Subpage != 0)
|
||||||
|
DicConsole.WriteLine("Found unknown mode page {0:X2}h subpage {1:X2}h", page.Page, page.Subpage);
|
||||||
|
else
|
||||||
|
DicConsole.WriteLine("Found unknown mode page {0:X2}h", page.Page);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|||||||
Reference in New Issue
Block a user