From 44ad09d431e88b49a105b5a557054268b8c85e4e Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 13 Oct 2016 06:18:12 +0100 Subject: [PATCH] Added EVPD page 81h, implemented operating definition page. --- ChangeLog | 6 +++ SCSI/EVPD.cs | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++ SCSI/Enums.cs | 9 ++++ 3 files changed, 142 insertions(+) diff --git a/ChangeLog b/ChangeLog index 1b28cd4a2..be020ff00 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-10-13 Natalia Portillo + + * EVPD.cs: + * Enums.cs: Added EVPD page 81h, implemented operating + definition page. + 2016-10-13 Natalia Portillo * EVPD.cs: diff --git a/SCSI/EVPD.cs b/SCSI/EVPD.cs index 9b52f459c..b570be327 100644 --- a/SCSI/EVPD.cs +++ b/SCSI/EVPD.cs @@ -107,6 +107,133 @@ namespace DiscImageChef.Decoders.SCSI return StringHandlers.CToString(ascii); } + #region EVPD Page 0x81: Implemented operating definition page + + /// + /// Implemented operating definition page + /// Page code 0x81 + /// + public struct Page_81 + { + /// + /// 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 byte PageLength; + /// + /// Current operating definition + /// + public ScsiDefinitions Current; + /// + /// Default operating definition + /// + public ScsiDefinitions Default; + /// + /// Support operating definition list + /// + public ScsiDefinitions[] Supported; + } + + public static Page_81? DecodePage_81(byte[] pageResponse) + { + if(pageResponse == null) + return null; + + if(pageResponse[1] != 0x81) + return null; + + if(pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 6) + return null; + + Page_81 decoded = new Page_81(); + + decoded.PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5); + decoded.PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F); + decoded.PageLength = (byte)(pageResponse[3] + 4); + decoded.Current = (ScsiDefinitions)(pageResponse[4] & 0x7F); + decoded.Default = (ScsiDefinitions)(pageResponse[5] & 0x7F); + + int position = 6; + List definitions = new List(); + + while(position < pageResponse.Length) + { + ScsiDefinitions definition = (ScsiDefinitions)(pageResponse[position] & 0x7F); + position++; + definitions.Add(definition); + } + + decoded.Supported = definitions.ToArray(); + + return decoded; + } + + public static string PrettifyPage_81(byte[] pageResponse) + { + return PrettifyPage_81(DecodePage_81(pageResponse)); + } + + public static string DefinitionToString(ScsiDefinitions definition) + { + switch(definition) + { + case ScsiDefinitions.Current: + return ""; + case ScsiDefinitions.CCS: + return "CCS"; + case ScsiDefinitions.SCSI1: + return "SCSI-1"; + case ScsiDefinitions.SCSI2: + return "SCSI-2"; + case ScsiDefinitions.SCSI3: + return "SCSI-3"; + default: + return string.Format("Unknown definition code {0}", (byte)definition); + } + } + + public static string PrettifyPage_81(Page_81? modePage) + { + if(!modePage.HasValue) + return null; + + Page_81 page = modePage.Value; + StringBuilder sb = new StringBuilder(); + + sb.AppendLine("SCSI Implemented operating definitions:"); + + sb.AppendFormat("\tDefault operating definition: {0}", DefinitionToString(page.Current)).AppendLine(); + sb.AppendFormat("\tCurrent operating definition: {0}", DefinitionToString(page.Current)).AppendLine(); + + if(page.Supported.Length == 0) + { + sb.AppendLine("\tThere are no supported definitions"); + return sb.ToString(); + } + + sb.AppendLine("\tSupported operating definitions:"); + foreach(ScsiDefinitions definition in page.Supported) + sb.AppendFormat("\t\t{0}", DefinitionToString(definition)).AppendLine(); + + return sb.ToString(); + } + + #endregion EVPD Page 0x81: Implemented operating definition page + /// /// Decodes VPD page 0x82: ASCII implemented operating definition /// diff --git a/SCSI/Enums.cs b/SCSI/Enums.cs index bf43ac0ef..c23a10d8a 100644 --- a/SCSI/Enums.cs +++ b/SCSI/Enums.cs @@ -303,5 +303,14 @@ namespace DiscImageChef.Decoders.SCSI /// NoProtocol = 15 } + + public enum ScsiDefinitions : byte + { + Current = 0, + SCSI1 = 1, + CCS = 2, + SCSI2 = 3, + SCSI3 = 4 + } }