diff --git a/DiscImageChef.Decoders/ChangeLog b/DiscImageChef.Decoders/ChangeLog index 76338ef1..0dabc3c1 100644 --- a/DiscImageChef.Decoders/ChangeLog +++ b/DiscImageChef.Decoders/ChangeLog @@ -1,3 +1,7 @@ +2016-10-13 Natalia Portillo + + * EVPD.cs: Added EVPD page B0h. + 2016-10-13 Natalia Portillo * EVPD.cs: diff --git a/DiscImageChef.Decoders/SCSI/EVPD.cs b/DiscImageChef.Decoders/SCSI/EVPD.cs index 5dd0ac09..cf421008 100644 --- a/DiscImageChef.Decoders/SCSI/EVPD.cs +++ b/DiscImageChef.Decoders/SCSI/EVPD.cs @@ -2113,6 +2113,81 @@ namespace DiscImageChef.Decoders.SCSI #endregion EVPD Page 0xC1 (IBM): Drive Serial Numbers page + #region EVPD Page 0xB0: Sequential-access device capabilities page + + /// + /// Sequential-access device capabilities page + /// Page code 0xB0 + /// + public struct Page_B0 + { + /// + /// The peripheral qualifier. + /// + public PeripheralQualifiers PeripheralQualifier; + /// + /// The type of the peripheral device. + /// + public PeripheralDeviceTypes PeripheralDeviceType; + /// + /// The page code. + /// + public byte PageCode; + /// + /// The length of the page. + /// + public ushort PageLength; + public bool WORM; + } + + public static Page_B0? DecodePage_B0(byte[] pageResponse) + { + if(pageResponse == null) + return null; + + if(pageResponse[1] != 0xB0) + return null; + + if((pageResponse[2] << 8) + pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 5) + return null; + + Page_B0 decoded = new Page_B0(); + + decoded.PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5); + decoded.PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F); + decoded.PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4); + + decoded.WORM = (pageResponse[4] & 0x01) == 0x01; + + return decoded; + } + + public static string PrettifyPage_B0(byte[] pageResponse) + { + return PrettifyPage_B0(DecodePage_B0(pageResponse)); + } + + public static string PrettifyPage_B0(Page_B0? modePage) + { + if(!modePage.HasValue) + return null; + + Page_B0 page = modePage.Value; + StringBuilder sb = new StringBuilder(); + + sb.AppendLine("SCSI Sequential-access Device Capabilities:"); + + if(page.WORM) + sb.AppendLine("\tDevice supports WORM media"); + + return sb.ToString(); + } + + #endregion EVPD Page 0xB0: Sequential-access device capabilities page + } } diff --git a/DiscImageChef/ChangeLog b/DiscImageChef/ChangeLog index 84c37774..36263398 100644 --- a/DiscImageChef/ChangeLog +++ b/DiscImageChef/ChangeLog @@ -1,3 +1,8 @@ +2016-10-13 Natalia Portillo + + * Commands/DeviceInfo.cs: + Added EVPD page B0h. + 2016-10-13 Natalia Portillo * Commands/DeviceInfo.cs: diff --git a/DiscImageChef/Commands/DeviceInfo.cs b/DiscImageChef/Commands/DeviceInfo.cs index 47ed4ebe..7baf7f3f 100644 --- a/DiscImageChef/Commands/DeviceInfo.cs +++ b/DiscImageChef/Commands/DeviceInfo.cs @@ -301,6 +301,15 @@ namespace DiscImageChef.Commands doWriteFile(options.OutputPrefix, string.Format("_scsi_evpd_{0:X2}h.bin", page), string.Format("SCSI INQUIRY EVPD {0:X2}h", page), inqBuf); } } + else if(page == 0xB0) + { + sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page); + if(!sense) + { + DicConsole.WriteLine("{0}", Decoders.SCSI.EVPD.PrettifyPage_B0(inqBuf)); + doWriteFile(options.OutputPrefix, string.Format("_scsi_evpd_{0:X2}h.bin", page), string.Format("SCSI INQUIRY EVPD {0:X2}h", page), inqBuf); + } + } else if(page == 0xC0 && StringHandlers.CToString(inq.Value.VendorIdentification).ToLowerInvariant().Trim() == "quantum") { sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);