/*************************************************************************** The Disc Image Chef ---------------------------------------------------------------------------- Filename : SCSI.cs Version : 1.0 Author(s) : Natalia Portillo Component : Decoders. Revision : $Revision$ Last change by : $Author$ Date : $Date$ --[ Description ] ---------------------------------------------------------- Decodes SCSI structures. --[ License ] -------------------------------------------------------------- This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ---------------------------------------------------------------------------- Copyright (C) 2011-2014 Claunia.com ****************************************************************************/ //$Id$ using System; using System.Text; namespace DiscImageChef.Decoders { /// /// Information from the following standards: /// T10/995-D revision 10 /// T10/1236-D revision 20 /// T10/1416-D revision 23 /// public static class SCSI { #region Enumerations enum SCSIPeripheralQualifiers : byte { /// /// Peripheral qualifier: Device is connected and supported /// SCSIPQSupported = 0x00, /// /// Peripheral qualifier: Device is supported but not connected /// SCSIPQUnconnected = 0x01, /// /// Peripheral qualifier: Reserved value /// SCSIPQReserved = 0x02, /// /// Peripheral qualifier: Device is connected but unsupported /// SCSIPQUnsupported = 0x03, /// /// Peripheral qualifier: Vendor values: 0x04, 0x05, 0x06 and 0x07 /// SCSIPQVendorMask = 0x04 } enum SCSIPeripheralDeviceTypes : byte { /// /// Direct-access device /// SCSIPDTDirectAccess = 0x00, /// /// Sequential-access device /// SCSIPDTSequentialAccess = 0x01, /// /// Printer device /// SCSIPDTPrinterDevice = 0x02, /// /// Processor device /// SCSIPDTProcessorDevice = 0x03, /// /// Write-once device /// SCSIPDTWriteOnceDevice = 0x04, /// /// CD-ROM/DVD/etc device /// SCSIPDTMultiMediaDevice = 0x05, /// /// Scanner device /// SCSIPDTScannerDevice = 0x06, /// /// Optical memory device /// SCSIPDTOpticalDevice = 0x07, /// /// Medium change device /// SCSIPDTMediumChangerDevice = 0x08, /// /// Communications device /// SCSIPDTCommsDevice = 0x09, /// /// Graphics arts pre-press device (defined in ASC IT8) /// SCSIPDTPrePressDevice1 = 0x0A, /// /// Graphics arts pre-press device (defined in ASC IT8) /// SCSIPDTPrePressDevice2 = 0x0B, /// /// Array controller device /// SCSIPDTArrayControllerDevice = 0x0C, /// /// Enclosure services device /// SCSIPDTEnclosureServiceDevice = 0x0D, /// /// Simplified direct-access device /// SCSIPDTSimplifiedDevice = 0x0E, /// /// Optical card reader/writer device /// SCSIPDTOCRWDevice = 0x0F, /// /// Bridging Expanders /// SCSIPDTBridgingExpander = 0x10, /// /// Object-based Storage Device /// SCSIPDTObjectDevice = 0x11, /// /// Automation/Drive Interface /// SCSIPDTADCDevice = 0x12, /// /// Well known logical unit /// SCSIPDTWellKnownDevice = 0x1E, /// /// Unknown or no device type /// SCSIPDTUnknownDevice = 0x1F } enum SCSIANSIVersions : byte { /// /// Device does not claim conformance to any ANSI version /// SCSIANSINoVersion = 0x00, /// /// Device complies with an obsolete ANSI standard /// SCSIANSIObsolete = 0x01, /// /// Device complies with ANSI X3.131:1994 /// SCSIANSI1994Version = 0x02, /// /// Device complies with ANSI X3.301:1997 /// SCSIANSI1997Version = 0x03, /// /// Device complies with ANSI X3.351:2001 /// SCSIANSI2001Version = 0x04, /// /// Device complies with SPC3, T10, 2005. /// SCSIANSI2005Version = 0x05 } enum SCSIECMAVersions : byte { /// /// Device does not claim conformance to any ECMA version /// SCSIECMANoVersion = 0x00, /// /// Device complies with an obsolete ECMA standard /// SCSIECMAObsolete = 0x01 } enum SCSIISOVersions : byte { /// /// Device does not claim conformance to any ISO/IEC version /// SCSIISONoVersion = 0x00, /// /// Device complies with ISO/IEC 9316:1995 /// SCSIISO1995Version = 0x02 } enum SCSISPIClocking : byte { /// /// Supports only ST /// SCSIClockingST = 0x00, /// /// Supports only DT /// SCSIClockingDT = 0x01, /// /// Reserved value /// SCSIClockingReserved = 0x02, /// /// Supports ST and DT /// SCSIClockingSTandDT = 0x03, } enum SCSIVersionDescriptorStandardMask : ushort { NoStandard = 0x0000, SAM = 0x0020, SAM2 = 0x0040, SAM3 = 0x0060, SAM4 = 0x0080, SPC = 0x0120, MMC = 0x0140, SCC = 0x0160, SBC = 0x0180, SMC = 0x01A0, SES = 0x01C0, SCC2 = 0x01E0, SSC = 0x0200, RBC = 0x0220, MMC2 = 0x0240, SPC2 = 0x0260, OCRW = 0x0280, MMC3 = 0x02A0, RMC = 0x02C0, SMC2 = 0x02E0, SPC3 = 0x0300, SBC2 = 0x0320, OSD = 0x0340, SSC2 = 0x0360, BCC = 0x0380, MMC4 = 0x03A0, ADC = 0x03C0, SES2 = 0x03E0, SSC3 = 0x0400, MMC5 = 0x0420, OSD2 = 0x0440, SPC4 = 0x0460, SMC3 = 0x0480, ADC2 = 0x04A0, SSA_TL2 = 0x0820, SSA_TL1 = 0x0840, SSA_S3P = 0x0860, SSA_S2P = 0x0880, SIP = 0x08A0, FCP = 0x08C0, SBP2 = 0x08E0, FCP2 = 0x0900, SST = 0x0920, SRP = 0x0940, iSCSI = 0x0960, SBP3 = 0x0980, ADP = 0x09C0, ADT = 0x09E0, FCP3 = 0x0A00, ADT2 = 0x0A20, SPI = 0x0AA0, Fast20 = 0xAC0, SPI2 = 0x0AE0, SPI3 = 0x0B00, EPI = 0x0B20, SPI4 = 0x0B40, SPI5 = 0x0B60, SAS = 0x0BE0, SAS11 = 0x0C00, FC_PH = 0x0D20, FC_AL = 0x0D40, FC_AL2 = 0x0D60, FC_PH3 = 0x0D80, FC_FS = 0x0DA0, FC_PI = 0x0DC0, FC_PI2 = 0x0DE0, FC_FS2 = 0x0E00, FC_LS = 0x0E20, FC_SP = 0x0E40, FC_DA = 0x12E0, FC_Tape = 0x1300, FC_FLA = 0x1320, FC_PLDA = 0x1340, SSA_PH2 = 0x1360, SSA_PH3 = 0x1380, IEEE1394 = 0x14A0, IEEE1394a = 0x14C0, IEEE1394b = 0x14E0, ATA_ATAPI6 = 0x15E0, ATA_ATAPI7 = 0x1600, ATA_ATAPI8 = 0x1620, USB = 0x1720, SAT = 0x1EA0 } enum SCSIVersionDescriptorSAMMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/0994 revision 18 /// T10_0994_r18 = 0x001B, /// /// ANSI X3.270:1996 /// ANSI_1996 = 0x001C } enum SCSIVersionDescriptorSAM2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1157-D revision 23 /// T10_1157_r23 = 0x0014, /// /// T10/1157-D revision 24 /// T10_1157_r24 = 0x0015, /// /// ANSI INCITS 366-2003 /// ANSI_2003 = 0x001C } enum SCSIVersionDescriptorSAM3Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1561-D revision 7 /// T10_1561_r07 = 0x0002, /// /// T10/1561-D revision 13 /// T10_1561_r13 = 0x0015, /// /// T10/1157-D revision 14 /// T10_1561_r14 = 0x0016, /// /// ANSI INCITS 402-2005 /// ANSI_2005 = 0x0017 } enum SCSIVersionDescriptorSPCMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/0995 revision 11a /// T10_0995_r11a = 0x001B, /// /// ANSI X3.301:1997 /// ANSI_1997 = 0x001C } enum SCSIVersionDescriptorMMCMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1048 revision 10a /// T10_1048_r10a = 0x001B, /// /// ANSI X3.304:1997 /// ANSI_1997 = 0x001C } enum SCSIVersionDescriptorSCCMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1047 revision 06c /// T10_1048_r06c = 0x001B, /// /// ANSI X3.276:1997 /// ANSI_1997 = 0x001C } enum SCSIVersionDescriptorSBCMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/0996 revision 08c /// T10_0996_r08c = 0x001B, /// /// ANSI NCITS.306:1998 /// ANSI_1998 = 0x001C } enum SCSIVersionDescriptorSMCMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/0999 revision 10a /// T10_0999_r10a = 0x001B, /// /// ANSI NCITS.314:1998 /// ANSI_1998 = 0x001C } enum SCSIVersionDescriptorSESMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1212 revision 08b /// T10_1212_r08b = 0x001B, /// /// ANSI NCITS.305:1998 /// ANSI_1998 = 0x001C, /// /// T10/1212 revision 08b with ANSI NCITS.305/AM1:2000 /// T10_1212_r08b_2000 = 0x001D, /// /// ANSI NCITS.305:1998 with ANSI NCITS.305/AM1:2000 /// ANSI_1998_2000 = 0x001E } enum SCSIVersionDescriptorSCC2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1125 revision 04 /// T10_1125_r04 = 0x001B, /// /// ANSI NCITS.318:1998 /// ANSI_1998 = 0x001C } enum SCSIVersionDescriptorSSCMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/0997 revision 17 /// T10_0997_r17 = 0x0001, /// /// T10/0997 revision 22 /// T10_0997_r22 = 0x0007, /// /// ANSI NCITS.335:2000 /// ANSI_2000 = 0x001C } enum SCSIVersionDescriptorRBCMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1240 revision 10a /// T10_1240_r10a = 0x0018, /// /// ANSI NCITS.330:2000 /// ANSI_2000 = 0x001C } enum SCSIVersionDescriptorMMC2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1228 revision 11 /// T10_1228_r11 = 0x0015, /// /// T10/1228 revision 11a /// T10_1228_r11a = 0x001B, /// /// ANSI NCITS.333:2000 /// ANSI_2000 = 0x001C } enum SCSIVersionDescriptorSPC2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1236 revision 12 /// T10_1236_r12 = 0x0007, /// /// T10/1236 revision 18 /// T10_1236_r18 = 0x0009, /// /// T10/1236 revision 19 /// T10_1236_r19 = 0x0015, /// /// T10/1236 revision 20 /// T10_1236_r20 = 0x0016, /// /// ANSI INCITS 351-2001 /// ANSI_2001 = 0x0017, } enum SCSIVersionDescriptorOCRWMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// ISO/IEC 14776-381 /// ISO14776_381 = 0x001E } enum SCSIVersionDescriptorMMC3Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1363-D revision 9 /// T10_1363_r09 = 0x0015, /// /// T10/1363-D revision 10g /// T10_1363_r10g = 0x0016, /// /// ANSI INCITS 360-2002 /// ANSI_2001 = 0x0018 } enum SCSIVersionDescriptorSMC2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1383-D revision 5 /// T10_1383_r05 = 0x0015, /// /// T10/1383-D revision 6 /// T10_1383_r06 = 0x001C, /// /// T10/1363-D revision 7 /// T10_1383_r07 = 0x001D, /// /// ANSI INCITS 382-2004 /// ANSI_2004 = 0x001E } enum SCSIVersionDescriptorSPC3Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1416-D revision 7 /// T10_1416_r07 = 0x0001, /// /// T10/1416-D revision 21 /// T10_1416_r21 = 0x0007, /// /// T10/1416-D revision 22 /// T10_1416_r22 = 0x000F } enum SCSIVersionDescriptorSBC2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1383 revision 5 /// T10_1383_r05 = 0x0002, /// /// T10/1383 revision 6 /// T10_1383_r06 = 0x0004, /// /// T10/1383 revision 7 /// T10_1383_r07 = 0x001B, /// /// ANSI INCITS 405-2005 /// ANSI_2005 = 0x001D } enum SCSIVersionDescriptorOSDMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1355 revision 0 /// T10_1355_r0 = 0x0001, /// /// T10/1355 revision 7a /// T10_1355_r7a = 0x0002, /// /// T10/1355 revision 8 /// T10_1355_r8 = 0x0003, /// /// T10/1355 revision 9 /// T10_1355_r9 = 0x0004, /// /// T10/1355 revision 10 /// T10_1355_r10 = 0x0015, /// /// ANSI INCITS 400-2004 /// ANSI_2004 = 0x0016 } enum SCSIVersionDescriptorSSC2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1434-D revision 7 /// T10_1434_r07 = 0x0014, /// /// T10/1434-D revision 9 /// T10_1434_r09 = 0x0015, /// /// ANSI INCITS 380-2003 /// ANSI_2003 = 0x001D } enum SCSIVersionDescriptorMMC4Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1545-D revision 5 /// T10_1545_r5 = 0x0010, /// /// T10/1545-D revision 3 /// T10_1545_r3 = 0x001D, /// /// T10/1545-D revision 3d /// T10_1545_r3d = 0x001E, /// /// ANSI INCITS 401-2005 /// ANSI_2005 = 0x001F } enum SCSIVersionDescriptorADCMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1558-D revision 6 /// T10_1558_r6 = 0x0015, /// /// T10/1558-D revision 7 /// T10_1558_r7 = 0x0016, /// /// ANSI INCITS 403-2005 /// ANSI_2005 = 0x0017 } enum SCSIVersionDescriptorSSA_TL2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10.1/1147 revision 05b /// T10_1147_r05b = 0x001B, /// /// ANSI NCITS.308:1998 /// ANSI_1998 = 0x001C } enum SCSIVersionDescriptorSSA_TL1Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10.1/0989 revision 10b /// T10_0989_r10b = 0x001B, /// /// ANSI X3.295:1996 /// ANSI_1996 = 0x001C } enum SCSIVersionDescriptorSSA_S3PMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10.1/1051 revision 05b /// T10_1051_r05b = 0x001B, /// /// ANSI NCITS.309:1998 /// ANSI_1998 = 0x001C } enum SCSIVersionDescriptorSSA_S2PMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10.1/1121 revision 07b /// T10_1121_r07b = 0x001B, /// /// ANSI X3.294:1996 /// ANSI_1996 = 0x001C } enum SCSIVersionDescriptorSIPMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/0856 revision 10 /// T10_0856_r10 = 0x001B, /// /// ANSI X3.292:1997 /// ANSI_1997 = 0x001C } enum SCSIVersionDescriptorFCPMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/0993 revision 12 /// T10_0993_r12 = 0x001B, /// /// ANSI X3.269:1996 /// ANSI_1996 = 0x001C } enum SCSIVersionDescriptorSBP2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1155 revision 04 /// T10_1155_r04 = 0x001B, /// /// ANSI NCITS.325:1999 /// ANSI_1999 = 0x001C } enum SCSIVersionDescriptorFCP2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1144-D revision 4 /// T10_1144_r4 = 0x0001, /// /// T10/1144-D revision 7 /// T10_1144_r7 = 0x0015, /// /// T10/1144-D revision 7a /// T10_1144_r7a = 0x0016, /// /// ANSI INCITS 350-2003 /// ANSI_2003 = 0x0017, /// /// T10/1144-D revision 8 /// T10_1144_r8 = 0x0018 } enum SCSIVersionDescriptorSSTMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1380-D revision 8b /// T10_1380_r8b = 0x0015 } enum SCSIVersionDescriptorSRPMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1415-D revision 10 /// T10_1415_r10 = 0x0014, /// /// T10/1415-D revision 16a /// T10_1415_r16a = 0x0015, /// /// ANSI INCITS 365-2002 /// ANSI_2003 = 0x001C } enum SCSIVersionDescriptorSBP3Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1467-D revision 1f /// T10_1467_r1f = 0x0002, /// /// T10/1467-D revision 3 /// T10_1467_r3 = 0x0014, /// /// T10/1467-D revision 4 /// T10_1467_r4 = 0x001A, /// /// T10/1467-D revision 5 /// T10_1467_r5 = 0x001B, /// /// ANSI INCITS 375-2004 /// ANSI_2004 = 0x001C } enum SCSIVersionDescriptorADTMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1557-D revision 11 /// T10_1557_r11 = 0x0019, /// /// T10/1557-D revision 14 /// T10_1557_r14 = 0x001A, /// /// ANSI INCITS 406-2005 /// ANSI_2005 = 0x001D } enum SCSIVersionDescriptorFCP3Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1560-D revision 4 /// T10_1560_r4 = 0x000F } enum SCSIVersionDescriptorSPIMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/0855 revision 15a /// T10_0855_r15a = 0x0019, /// /// ANSI X3.253:1995 /// ANSI_1995 = 0x001A, /// /// T10/0855 revision 15a with SPI Amnd revision 3a /// T10_0855_r15a_Amnd_3a = 0x001B, /// /// ANSI X3.253:1995 with SPI Amnd ANSI X3.253/AM1:1998 /// ANSI_1995_1998 = 0x001C } enum SCSIVersionDescriptorFast20Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1071 revision 06 /// T10_1071_r06 = 0x001B, /// /// ANSI X3.277:1996 /// ANSI_1996 = 0x001C } enum SCSIVersionDescriptorSPI2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1142 revision 20b /// T10_1142_r20b = 0x001B, /// /// ANSI X3.302:1999 /// ANSI_1999 = 0x001C } enum SCSIVersionDescriptorSPI3Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1302-D revision 10 /// T10_1302D_r10 = 0x0018, /// /// T10/1302-D revision 13a /// T10_1302D_r13a = 0x0019, /// /// T10/1302-D revision 14 /// T10_1302D_r14 = 0x001A, /// /// ANSI NCITS.336:2000 /// ANSI_2000 = 0x001C } enum SCSIVersionDescriptorEPIMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1134 revision 16 /// T10_1134_r16 = 0x001B, /// /// ANSI NCITS TR-23:1999 /// ANSI_1999 = 0x001C } enum SCSIVersionDescriptorSPI4Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1365-D revision 7 /// T10_1365_r7 = 0x0014, /// /// T10/1365-D revision 9 /// T10_1365_r9 = 0x0015, /// /// ANSI INCITS 362-2002 /// ANSI_2002 = 0x0016, /// /// T10/1365-D revision 10 /// T10_1365_r10 = 0x0019 } enum SCSIVersionDescriptorSPI5Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1525-D revision 3 /// T10_1525_r3 = 0x0019, /// /// T10/1525-D revision 5 /// T10_1525_r5 = 0x001A, /// /// T10/1525-D revision 6 /// T10_1525_r6 = 0x001B, /// /// ANSI INCITS 367-2003 /// ANSI_2003 = 0x001C } enum SCSIVersionDescriptorSASMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1562-D revision 01 /// T10_1562_r01 = 0x0001, /// /// T10/1562-D revision 03 /// T10_1562_r03 = 0x0015, /// /// T10/1562-D revision 04 /// T10_1562_r04 = 0x001A, /// /// T10/1562-D revision 04 /// T10_1562_r04bis = 0x001B, /// /// T10/1562-D revision 05 /// T10_1562_r05 = 0x001C, /// /// ANSI INCITS 376-2003 /// ANSI_2003 = 0x001D } enum SCSIVersionDescriptorSAS11Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10/1601-D revision 9 /// T10_1601_r9 = 0x0007, /// /// T10/1601-D revision 10 /// T10_1601_r10 = 0x000F } enum SCSIVersionDescriptorFCPHMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// ANSI X3.230:1994 /// ANSI_1994 = 0x001B, /// /// ANSI X3.230:1994 with Amnd 1 ANSI X3.230/AM1:1996 /// ANSI_1994_1996 = 0x001C } enum SCSIVersionDescriptorFCALMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// ANSI X3.272:1996 /// ANSI_1996 = 0x001C } enum SCSIVersionDescriptorFCAL2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T11/1133 revision 7.0 /// T11_1133_r70 = 0x0001, /// /// ANSI NCITS.332:1999 /// ANSI_1999 = 0x001C, /// /// ANSI INCITS 332-1999 with Amnd 1 AM1-2002 /// ANSI_1999_2002 = 0x001D } enum SCSIVersionDescriptorFCPH3Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// ANSI X3.303-1998 /// ANSI_1998 = 0x001C } enum SCSIVersionDescriptorFCFSMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T11/1331 revision 1.2 /// T11_1331_r12 = 0x0017, /// /// T11/1331 revision 1.7 /// T11_1331_r17 = 0x0018, /// /// ANSI INCITS 373-2003 /// ANSI_2003 = 0x001C } enum SCSIVersionDescriptorFCPIMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// ANSI INCITS 352-2002 /// ANSI_2002 = 0x001C } enum SCSIVersionDescriptorFCPI2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T11/1506-D revision 5.0 /// T11_1506_r50 = 0x0002 } enum SCSIVersionDescriptorFCSPMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T11/1570-D revision 1.6 /// T11_1570_r16 = 0x0002 } enum SCSIVersionDescriptorFCDAMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T11/1513-DT revision 3.1 /// T11_1513_r31 = 0x0002 } enum SCSIVersionDescriptorFCTapeMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T11/1315 revision 1.16 /// T11_1315_r116 = 0x0001, /// /// T11/1315 revision 1.17 /// T11_1315_r117 = 0x001B, /// /// ANSI NCITS TR-24:1999 /// ANSI_1999 = 0x001C } enum SCSIVersionDescriptorFCFLAMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T11/1235 revision 7 /// T11_1235_r7 = 0x001B, /// /// ANSI NCITS TR-20:1998 /// ANSI_1998 = 0x001C } enum SCSIVersionDescriptorFCPLDAMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T11/1162 revision 2.1 /// T11_1162_r21 = 0x001B, /// /// ANSI NCITS TR-19:1998 /// ANSI_1998 = 0x001C } enum SCSIVersionDescriptorSSAPH2Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10.1/1145 revision 09c /// T10_1145_r09c = 0x001B, /// /// ANSI X3.293:1996 /// ANSI_1996 = 0x001C } enum SCSIVersionDescriptorSSAPH3Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T10.1/1146 revision 05b /// T10_1146_r05b = 0x001B, /// /// ANSI NCITS.307:1998 /// ANSI_1998 = 0x001C } enum SCSIVersionDescriptorIEEE1394Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// ANSI IEEE 1394:1995 /// ANSI_1995 = 0x001D } enum SCSIVersionDescriptorATA6Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// ANSI INCITS 361-2002 /// ANSI_2002 = 0x001D } enum SCSIVersionDescriptorATA7Mask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// T13/1532-D revision 3 /// T13_1532_r3 = 0x0002, /// /// ANSI INCITS 397-2005 /// ANSI_2005 = 0x001C } enum SCSIVersionDescriptorATA8Mask : ushort { /// /// ATA8-AAM Architecture Model (no version claimed) /// ATA8_AAM = 0x0000, /// /// ATA8-PT Parallel Transport (no version claimed) /// ATA8_PT = 0x0001, /// /// ATA8-AST Serial Transport (no version claimed) /// ATA8_AST = 0x0002, /// /// ATA8-ACS ATA/ATAPI Command Set (no version claimed) /// ATA8_ACS = 0x0003 } enum SCSIVersionDescriptorUSBMask : ushort { /// /// No revision of the standard is claimed /// NoVersion = 0x0000, /// /// Universal Serial Bus Specification, Revision 1.1 /// USB11 = 0x0008, /// /// Universal Serial Bus Specification, Revision 2.0 /// USB20 = 0x0009, /// /// USB Mass Storage Class Bulk-Only Transport, Revision 1.0 /// USB_MSC_BULK = 0x0010 } enum SCSITGPSValues : byte { /// /// Assymetrical access not supported /// NotSupported = 0x00, /// /// Only implicit assymetrical access is supported /// OnlyImplicit = 0x01, /// /// Only explicit assymetrical access is supported /// OnlyExplicit = 0x02, /// /// Both implicit and explicit assymetrical access are supported /// Both = 0x03 } #endregion Enumerations #region Private methods static string PrettifySCSIVendorString(string SCSIVendorString) { switch (SCSIVendorString) { case "3M": return "3M Company"; case "ACL": return "Automated Cartridge Librarys, Inc."; case "ADAPTEC": return "Adaptec"; case "ADSI": return "Adaptive Data Systems, Inc. (a Western Digital subsidiary)"; case "ADTX": return "ADTX Co., Ltd."; case "AERONICS": return "Aeronics, Inc."; case "AGFA": return "AGFA"; case "AMCODYNE": return "Amcodyne"; case "ANAMATIC": return "Anamartic Limited (England)"; case "ANCOT": return "ANCOT Corp."; case "ANRITSU": return "Anritsu Corporation"; case "APPLE": return "Apple Computer, Inc."; case "ARCHIVE": return "Archive"; case "ASACA": return "ASACA Corp."; case "ASPEN": return "Aspen Peripherals"; case "AST": return "AST Research"; case "ASTK": return "Alcatel STK A/S"; case "AT&T": return "AT&T"; case "ATARI": return "Atari Corporation"; case "ATG CYG": return "ATG Cygnet Inc."; case "ATTO": return "ATTO Technology Inc."; case "ATX": return "Alphatronix"; case "AVR": return "Advanced Vision Research"; case "BALLARD": return "Ballard Synergy Corp."; case "BERGSWD": return "Berg Software Design"; case "BEZIER": return "Bezier Systems, Inc."; case "BULL": return "Bull Peripherals Corp."; case "BUSLOGIC": return "BusLogic Inc."; case "BiT": return "BiT Microsystems"; case "BoxHill": return "Box Hill Systems Corporation"; case "CALIPER": return "Caliper (California Peripheral Corp.)"; case "CAST": return "Advanced Storage Tech"; case "CDC": return "Control Data or MPI"; case "CDP": return "Columbia Data Products"; case "CHEROKEE": return "Cherokee Data Systems"; case "CHINON": return "Chinon"; case "CIE&YED": return "YE Data, C.Itoh Electric Corp."; case "CIPHER": return "Cipher Data Products"; case "CIRRUSL": return "Cirrus Logic Inc."; case "CMD": return "CMD Technology Inc."; case "CNGR SFW": return "Congruent Software, Inc."; case "COGITO": return "Cogito"; case "COMPAQ": return "Compaq Computer Corporation"; case "COMPORT": return "Comport Corp."; case "COMPSIG": return "Computer Signal Corporation"; case "CONNER": return "Conner Peripherals"; case "CORE": return "Core International, Inc."; case "CPU TECH": return "CPU Technology, Inc."; case "CREO": return "Creo Products Inc."; case "CROSFLD": return "Crosfield Electronics"; case "CSM, INC": return "Computer SM, Inc."; case "CalComp": return "CalComp, A Lockheed Company"; case "Ciprico": return "Ciprico, Inc."; case "DATABOOK": return "Databook, Inc."; case "DATACOPY": return "Datacopy Corp."; case "DATAPT": return "Datapoint Corp."; case "DEC": return "Digital Equipment"; case "DELPHI": return "Delphi Data Div. of Sparks Industries, Inc."; case "DENON": return "Denon/Nippon Columbia"; case "DenOptix": return "DenOptix, Inc."; case "DEST": return "DEST Corp."; case "DGC": return "Data General Corp."; case "DIGIDATA": return "Digi-Data Corporation"; case "DILOG": return "Distributed Logic Corp."; case "DISC": return "Document Imaging Systems Corp."; case "DPT": return "Distributed Processing Technology"; case "DSI": return "Data Spectrum, Inc."; case "DSM": return "Deterner Steuerungs- und Maschinenbau GmbH & Co."; case "DTC QUME": return "Data Technology Qume"; case "DXIMAGIN": return "DX Imaging"; case "Digital": return "Digital Equipment Corporation"; case "ECMA": return "European Computer Manufacturers Association"; case "Elms": return "Elms Systems Corporation"; case "EMC": return "EMC Corp."; case "EMULEX": return "Emulex"; case "EPSON": return "Epson"; case "Eris/RSI": return "RSI Systems, Inc."; case "EXABYTE": return "Exabyte Corp."; case "FILENET": return "FileNet Corp."; case "FRAMDRV": return "FRAMEDRIVE Corp."; case "FUJI": return "Fuji Electric Co., Ltd. (Japan)"; case "FUJITSU": return "Fujitsu"; case "FUNAI": return "Funai Electric Co., Ltd."; case "FUTURED": return "Future Domain Corp."; case "GIGATAPE": return "GIGATAPE GmbH"; case "GIGATRND": return "GigaTrend Incorporated"; case "GOULD": return "Gould"; case "Gen_Dyn": return "General Dynamics"; case "Goidelic": return "Goidelic Precision, Inc."; case "HITACHI": return "Hitachi America Ltd or Nissei Sangyo America Ltd"; case "HONEYWEL": return "Honeywell Inc."; case "HP": return "Hewlett Packard"; case "i-cubed": return "i-cubed ltd."; case "IBM": return "International Business Machines"; case "ICL": return "ICL"; case "IDE": return "International Data Engineering, Inc."; case "IGR": return "Intergraph Corp."; case "IMPLTD": return "Integrated Micro Products Ltd."; case "IMPRIMIS": return "Imprimis Technology Inc."; case "INSITE": return "Insite Peripherals"; case "INTEL": return "INTEL Corporation"; case "IOC": return "I/O Concepts, Inc."; case "IOMEGA": return "Iomega"; case "ISi": return "Information Storage inc."; case "ISO": return "International Standards Organization"; case "ITC": return "International Tapetronics Corporation"; case "JPC Inc.": return "JPC Inc."; case "JVC": return "JVC Information Products Co."; case "KENNEDY": return "Kennedy Company"; case "KENWOOD": return "KENWOOD Corporation"; case "KODAK": return "Eastman Kodak"; case "KONAN": return "Konan"; case "KONICA": return "Konica Japan"; case "LAPINE": return "Lapine Technology"; case "LASERDRV": return "LaserDrive Limited"; case "LASERGR": return "Lasergraphics, Inc."; case "LION": return "Lion Optics Corporation"; case "LMS": return "Laser Magnetic Storage International Company"; case "MATSHITA": return "Matsushita"; case "MAXSTRAT": return "Maximum Strategy, Inc."; case "MAXTOR": return "Maxtor Corp."; case "MDI": return "Micro Design International, Inc."; case "MEADE": return "Meade Instruments Corporation"; case "MELA": return "Mitsubishi Electronics America"; case "MELCO": return "Mitsubishi Electric (Japan)"; case "MEMREL": return "Memrel Corporation"; case "MEMTECH": return "MemTech Technology"; case "MERIDATA": return "Oy Meridata Finland Ltd."; case "METRUM": return "Metrum, Inc."; case "MICROBTX": return "Microbotics Inc."; case "MICROP": return "Micropolis"; case "MICROTEK": return "Microtek Storage Corp"; case "MINSCRIB": return "Miniscribe"; case "MITSUMI": return "Mitsumi Electric Co., Ltd."; case "MOTOROLA": return "Motorola"; case "MST": return "Morning Star Technologies, Inc."; case "MTNGATE": return "MountainGate Data Systems"; case "MaxOptix": return "Maxoptix Corp."; case "Minitech": return "Minitech (UK) Limited"; case "Minolta": return "Minolta Corporation"; case "NAI": return "North Atlantic Industries"; case "NAKAMICH": return "Nakamichi Corporation"; case "NCL": return "NCL America"; case "NCR": return "NCR Corporation"; case "NEC": return "NEC"; case "NISCA": return "NISCA Inc."; case "NKK": return "NKK Corp."; case "NRC": return "Nakamichi Corporation"; case "NSM": return "NSM Jukebox GmbH"; case "NT": return "Northern Telecom"; case "NatInst": return "National Instruments"; case "NatSemi": return "National Semiconductor Corp."; case "OAI": return "Optical Access International"; case "OCE": return "Oce Graphics"; case "OKI": return "OKI Electric Industry Co.,Ltd (Japan)"; case "OMI": return "Optical Media International"; case "OMNIS": return "OMNIS Company (FRANCE)"; case "OPTIMEM": return "Cipher/Optimem"; case "OPTOTECH": return "Optotech"; case "ORCA": return "Orca Technology"; case "OSI": return "Optical Storage International"; case "OTL": return "OTL Engineering"; case "PASCOsci": return "Pasco Scientific"; case "PERTEC": return "Pertec Peripherals Corporation"; case "PFTI": return "Performance Technology Inc."; case "PFU": return "PFU Limited"; case "PIONEER": return "Pioneer Electronic Corp."; case "PLASMON": return "Plasmon Data"; case "PRAIRIE": return "PrairieTek"; case "PREPRESS": return "PrePRESS Solutions"; case "PRESOFT": return "PreSoft Architects"; case "PRESTON": return "Preston Scientific"; case "PRIAM": return "Priam"; case "PRIMAGFX": return "Primagraphics Ltd"; case "PTI": return "Peripheral Technology Inc."; case "QIC": return "Quarter-Inch Cartridge Drive Standards, Inc."; case "QUALSTAR": return "Qualstar"; case "QUANTUM": return "Quantum Corp."; case "QUANTEL": return "Quantel Ltd."; case "R-BYTE": return "R-Byte, Inc."; case "RACALREC": return "Racal Recorders"; case "RADSTONE": return "Radstone Technology"; case "RGI": return "Raster Graphics, Inc."; case "RICOH": return "Ricoh"; case "RODIME": return "Rodime"; case "RTI": return "Reference Technology"; case "SAMSUNG": return "Samsung Electronics Co., Ltd."; case "SANKYO": return "Sankyo Seiki"; case "SANYO": return "SANYO Electric Co., Ltd."; case "SCREEN": return "Dainippon Screen Mfg. Co., Ltd."; case "SEAGATE": return "Seagate"; case "SEQUOIA": return "Sequoia Advanced Technologies, Inc."; case "SIEMENS": return "Siemens"; case "SII": return "Seiko Instruments Inc."; case "SMS": return "Scientific Micro Systems/OMTI"; case "SNYSIDE": return "Sunnyside Computing Inc."; case "SONIC": return "Sonic Solutions"; case "SONY": return "Sony Corporation Japan"; case "SPECIAL": return "Special Computing Co."; case "SPECTRA": return "Spectra Logic, a Division of Western Automation Labs, Inc."; case "SPERRY": return "Sperry (now Unisys Corp.)"; case "STK": return "Storage Technology Corporation"; case "StrmLgc": return "StreamLogic Corp."; case "SUMITOMO": return "Sumitomo Electric Industries, Ltd."; case "SUN": return "Sun Microsystems, Inc."; case "SYMBIOS": return "Symbios Logic Inc."; case "SYSGEN": return "Sysgen"; case "Shinko": return "Shinko Electric Co., Ltd."; case "SyQuest": return "SyQuest Technology, Inc."; case "T-MITTON": return "Transmitton England"; case "TALARIS": return "Talaris Systems, Inc."; case "TALLGRAS": return "Tallgrass Technologies"; case "TANDBERG": return "Tandberg Data A/S"; case "TANDON": return "Tandon"; case "TEAC": return "TEAC Japan"; case "TECOLOTE": return "Tecolote Designs"; case "TEGRA": return "Tegra Varityper"; case "TENTIME": return "Laura Technologies, Inc."; case "TI-DSG": return "Texas Instruments"; case "TOSHIBA": return "Toshiba Japan"; case "Tek": return "Tektronix"; case "ULTRA": return "UltraStor Corporation"; case "UNISYS": return "Unisys"; case "USCORE": return "Underscore, Inc."; case "USDC": return "US Design Corp."; case "VERBATIM": return "Verbatim Corporation"; case "VEXCEL": return "VEXCEL IMAGING GmbH"; case "VICOMSL1": return "Vicom Systems, Inc."; case "VRC": return "Vermont Research Corp."; case "WANGTEK": return "Wangtek"; case "WDIGTL": return "Western Digital"; case "WEARNES": return "Wearnes Technology Corporation"; case "WangDAT": return "WangDAT"; case "X3": return "Accredited Standards Committee X3, Information Technology"; case "XEBEC": return "Xebec Corporation"; case "Acuid": return "Acuid Corporation Ltd."; case "AcuLab": return "AcuLab, Inc. (Tulsa, OK)"; case "ADIC": return "Advanced Digital Information Corporation"; case "ADVA": return "ADVA Optical Networking AG"; case "Ancor": return "Ancor Communications, Inc."; case "ANDATACO": return "Andataco (now nStor)"; case "ARK": return "ARK Research Corporation"; case "ARTECON": return "Artecon Inc. (Obs. - now Dot Hill)"; case "ASC": return "Advanced Storage Concepts, Inc."; case "BHTi": return "Breece Hill Technologies"; case "BITMICRO": return "BiT Microsystems, Inc."; case "BNCHMARK": return "Benchmark Tape Systems Corporation"; case "BREA": return "BREA Technologies, Inc."; case "BROCADE": return "Brocade Communications Systems, Incorporated"; case "CenData": return "Central Data Corporation"; case "Cereva": return "Cereva Networks Inc."; case "CISCO": return "Cisco Systems, Inc."; case "CNSi": return "Chaparral Network Storage, Inc."; case "COMPTEX": return "Comptex Pty Limited"; case "CPL": return "Cross Products Ltd"; case "CROSSRDS": return "Crossroads Systems, Inc."; case "Data Com": return "Data Com Information Systems Pty. Ltd."; case "DataCore": return "DataCore Software Corporation"; case "DDN": return "DataDirect Networks, Inc."; case "DEI": return "Digital Engineering, Inc."; case "DELL": return "Dell Computer Corporation"; case "DigiIntl": return "Digi International"; case "DotHill": return "Dot Hill Systems Corp."; case "ECCS": return "ECCS, Inc."; case "EMASS": return "EMASS, Inc."; case "EMTEC": return "EMTEC Magnetics"; case "EuroLogc": return "Eurologic Systems Limited"; case "FFEILTD": return "FujiFilm Electonic Imaging Ltd"; case "FUJIFILM": return "Fuji Photo Film, Co., Ltd."; case "G&D": return "Giesecke & Devrient GmbH"; case "GENSIG": return "General Signal Networks"; case "Global": return "Global Memory Test Consortium"; case "GoldStar": return "LG Electronics Inc."; case "HAGIWARA": return "Hagiwara Sys-Com Co., Ltd."; case "ICP": return "ICP vortex Computersysteme GmbH"; case "IMATION": return "Imation"; case "Indigita": return "Indigita Corporation"; case "INITIO": return "Initio Corporation"; case "IVIVITY": return "iVivity, Inc."; case "Kyocera": return "Kyocera Corporation"; case "LG": return "LG Electronics Inc."; case "LGE": return "LG Electronics Inc."; case "LSI": return "LSI Logic Corp."; case "LSILOGIC": return "LSI Logic Storage Systems, Inc."; case "LTO-CVE": return "Linear Tape - Open, Compliance Verification Entity"; case "MAXELL": return "Hitachi Maxell, Ltd."; case "McDATA": return "McDATA Corporation"; case "MEII": return "Mountain Engineering II, Inc."; case "MOSAID": return "Mosaid Technologies Inc."; case "MPM": return "Mitsubishi Paper Mills, Ltd."; case "NCITS": return "National Committee for Information Technology Standards"; case "NEXSAN": return "Nexsan Technologies, Ltd."; case "NISHAN": return "Nishan Systems Inc."; case "NSD": return "Nippon Systems Development Co.,Ltd."; case "nStor": return "nStor Technologies, Inc."; case "NUCONNEX": return "NuConnex"; case "NUSPEED": return "NuSpeed, Inc."; case "ORANGE": return "Orange Micro, Inc."; case "PATHLGHT": return "Pathlight Technology, Inc."; case "PICO": return "Packard Instrument Company"; case "PROCOM": return "Procom Technology"; case "RHAPSODY": return "Rhapsody Networks, Inc."; case "RHS": return "Racal-Heim Systems GmbH"; case "SAN": return "Storage Area Networks, Ltd."; case "SCInc.": return "Storage Concepts, Inc."; case "SDI": return "Storage Dimensions, Inc."; case "SDS": return "Solid Data Systems"; case "SPD": return "Storage Products Distribution, Inc."; case "Sterling": return "Sterling Diagnostic Imaging, Inc."; case "STOR": return "StorageNetworks, Inc."; case "STORAPP": return "StorageApps, Inc."; case "STORM": return "Storm Technology, Inc."; case "TDK": return "TDK Corporation"; case "TMS": return "Texas Memory Systems, Inc."; case "TRIPACE": return "Tripace"; case "VDS": return "Victor Data Systems Co., Ltd."; case "VIXEL": return "Vixel Corporation"; case "WSC0001": return "Wisecom, Inc."; case "Mendocin": return "Mendocino Software"; case "0B4C": return "MOOSIK Ltd."; case "2AI": return "2AI (Automatisme et Avenir Informatique)"; case "3PARdata": return "3PARdata, Inc."; case "A-Max": return "A-Max Technology Co., Ltd"; case "Acer": return "Acer, Inc."; case "AIPTEK": return "AIPTEK International Inc."; case "AMCC": return "Applied Micro Circuits Corporation"; case "Amphenol": return "Amphenol"; case "andiamo": return "Andiamo Systems, Inc."; case "ANTONIO": return "Antonio Precise Products Manufactory Ltd."; case "ARIO": return "Ario Data Networks, Inc."; case "ARISTOS": return "Aristos Logic Corp."; case "ATA": return "SCSI / ATA Translator Software (Organization Not Specified)"; case "ATL": return "Quantum|ATL Products"; case "AVC": return "AVC Technology Ltd"; case "Barco": return "Barco"; case "BAROMTEC": return "Barom Technologies Co., Ltd."; case "BDT": return "Buero- und Datentechnik GmbH & Co.KG"; case "BENQ": return "BENQ Corporation."; case "BIR": return "Bio-Imaging Research, Inc."; case "BlueArc": return "BlueArc Corporation"; case "Broadcom": return "Broadcom Corporation"; case "CAMBEX": return "Cambex Corporation"; case "CAMEOSYS": return "Cameo Systems Inc."; case "CANDERA": return "Candera Inc."; case "CAPTION": return "CAPTION BANK"; case "CATALYST": return "Catalyst Enterprises"; case "CERTANCE": return "Certance"; case "CLOVERLF": return "Cloverleaf Communications, Inc"; case "CMTechno": return "CMTech"; case "CNT": return "Computer Network Technology"; case "COBY": return "Coby Electronics Corporation, USA"; case "COMPELNT": return "Compellent Technologies, Inc."; case "COPANSYS": return "COPAN SYSTEMS INC"; case "COWON": return "COWON SYSTEMS, Inc."; case "CSCOVRTS": return "Cisco - Veritas"; case "CYBERNET": return "Cybernetics"; case "Cygnal": return "Dekimo"; case "DALSEMI": return "Dallas Semiconductor"; case "DANGER": return "Danger Inc."; case "DAT-MG": return "DAT Manufacturers Group"; case "DNS": return "Data and Network Security"; case "DP": return "Dell, Inc."; case "DSC": return "DigitalStream Corporation"; case "elipsan": return "Elipsan UK Ltd."; case "ENERGY-B": return "Energybeam Corporation"; case "ENGENIO": return "Engenio Information Technologies, Inc."; case "EQLOGIC": return "EqualLogic"; case "evolve": return "Evolution Technologies, Inc"; case "EXATEL": return "Exatelecom Co., Ltd."; case "EXAVIO": return "Exavio, Inc."; case "FALCON": return "FalconStor, Inc."; case "Fibxn": return "Fiberxon, Inc."; case "FID": return "First International Digital, Inc."; case "FREECION": return "Nable Communications, Inc."; case "Gadzoox": return "Gadzoox Networks, Inc."; case "GDI": return "Generic Distribution International"; case "Generic": return "Generic Technology Co., Ltd."; case "HAPP3": return "Inventec Multimedia and Telecom co., ltd"; case "Heydays": return "Mazo Technology Co., Ltd."; case "HI-TECH": return "HI-TECH Software Pty. Ltd."; case "HPQ": return "Hewlett Packard"; case "HYUNWON": return "HYUNWON inc"; case "IET": return "ISCSI ENTERPRISE TARGET"; case "IFT": return "Infortrend Technology, Inc."; case "INCIPNT": return "Incipient Technologies Inc."; case "INCITS": return "InterNational Committee for Information Technology"; case "INRANGE": return "INRANGE Technologies Corporation"; case "integrix": return "Integrix, Inc."; case "iqstor": return "iQstor Networks, Inc."; case "IVMMLTD": return "InnoVISION Multimedia Ltd."; case "JETWAY": return "Jetway Information Co., Ltd"; case "KASHYA": return "Kashya, Inc."; case "KSCOM": return "KSCOM Co. Ltd.,"; case "KUDELSKI": return "Nagravision SA - Kudelski Group"; case "LEFTHAND": return "LeftHand Networks"; case "Lexar": return "Lexar Media, Inc."; case "LUXPRO": return "Luxpro Corporation"; case "Malakite": return "Malachite Technologies (New VID is: Sandial)"; case "MaXXan": return "MaXXan Systems, Inc."; case "MAYCOM": return "maycom Co., Ltd."; case "MBEAT": return "K-WON C&C Co.,Ltd"; case "MCC": return "Measurement Computing Corporation"; case "MHTL": return "Matsunichi Hi-Tech Limited"; case "MICROLIT": return "Microlite Corporation"; case "MKM": return "Mitsubishi Kagaku Media Co., LTD."; case "MP-400": return "Daiwa Manufacturing Limited"; case "MPEYE": return "Touchstone Technology Co., Ltd"; case "MPMan": return "MPMan.com, Inc."; case "MSFT": return "Microsoft Corporation"; case "MSI": return "Micro-Star International Corp."; case "MTI": return "MTI Technology Corporation"; case "MXI": return "Memory Experts International"; case "nac": return "nac Image Technology Inc."; case "NAGRA": return "Nagravision SA - Kudelski Group"; case "Neartek": return "Neartek, Inc."; case "NETAPP": return "Network Appliance"; case "Netcom": return "Netcom Storage"; case "NHR": return "NH Research, Inc."; case "NVIDIA": return "NVIDIA Corporation"; case "Olidata": return "Olidata S.p.A."; case "OMNIFI": return "Rockford Corporation - Omnifi Media"; case "Packard": return "Parkard Bell"; case "PARALAN": return "Paralan Corporation"; case "PerStor": return "Perstor"; case "PHILIPS": return "Philips Electronics"; case "Pillar": return "Pillar Data Systems"; case "PIVOT3": return "Pivot3, Inc."; case "PROSTOR": return "ProStor Systems, Inc."; case "PTICO": return "Pacific Technology International"; case "QLogic": return "QLogic Corporation"; case "Realm": return "Realm Systems"; case "Revivio": return "Revivio, Inc."; case "SANRAD": return "SANRAD Inc."; case "SC.Net": return "StorageConnections.Net"; case "SCIENTEK": return "SCIENTEK CORP"; case "SEAC": return "SeaChange International, Inc."; case "SEAGRAND": return "SEAGRAND In Japan"; case "SigmaTel": return "SigmaTel, Inc."; case "SLI": return "Sierra Logic, Inc."; case "SoniqCas": return "SoniqCast"; case "STONEFLY": return "StoneFly Networks, Inc."; case "STORCOMP": return "Storage Computer Corporation"; case "SUNCORP": return "SunCorporation"; case "suntx": return "Suntx System Co., Ltd"; case "SYMANTEC": return "Symantec Corporation"; case "T11": return "INCITS Technical Committee T11"; case "TANDEM": return "Tandem (now HP)"; case "TGEGROUP": return "TGE Group Co.,LTD."; case "Tite": return "Tite Technology Limited"; case "TOLISGRP": return "The TOLIS Group"; case "TROIKA": return "Troika Networks, Inc."; case "TRULY": return "TRULY Electronics MFG. LTD."; case "UDIGITAL": return "United Digital Limited"; case "VERITAS": return "VERITAS Software Corporation"; case "VicomSys": return "Vicom Systems, Inc."; case "VIDEXINC": return "Videx, Inc."; case "VITESSE": return "Vitesse Semiconductor Corporation"; case "VMAX": return "VMAX Technologies Corp."; case "Vobis": return "Vobis Microcomputer AG"; case "Waitec": return "Waitec NV"; case "Wasabi": return "Wasabi Systems"; case "WAVECOM": return "Wavecom"; case "WD": return "Western Digital Technologies Inc."; case "WDC": return "Western Digital Technologies inc."; case "Xerox": return "Xerox Corporation"; case "XIOtech": return "XIOtech Corporation"; case "XIRANET": return "Xiranet Communications GmbH"; case "XYRATEX": return "Xyratex"; case "YINHE": return "NUDT Computer Co."; case "YIXUN": return "Yixun Electronic Co.,Ltd."; case "YOTTA": return "YottaYotta, Inc."; case "Zarva": return "Zarva Digital Technology Co., Ltd."; case "ZETTA": return "Zetta Systems, Inc."; default: return SCSIVendorString; } } #endregion Private methods #region Public methods public static SCSIInquiry? DecodeSCSIInquiry(byte[] SCSIInquiryResponse) { if (SCSIInquiryResponse == null) return null; if (SCSIInquiryResponse.Length < 36) { //if (MainClass.isDebug) Console.WriteLine("DEBUG (SCSI INQUIRY Decoder): INQUIRY response is less than minimum of 36 bytes, decoded data can be incorrect, proceeding anyway."); //else return null; } if (SCSIInquiryResponse.Length != SCSIInquiryResponse[4] + 4) { //if (MainClass.isDebug) Console.WriteLine("DEBUG (SCSI INQUIRY Decoder): INQUIRY response length ({0} bytes) is different than specified in length field ({1} bytes), decoded data can be incorrect, proceeding anyway.", SCSIInquiryResponse.Length, SCSIInquiryResponse[4] + 4); //else return null; } SCSIInquiry decoded = new SCSIInquiry(); if (SCSIInquiryResponse.Length >= 1) { decoded.PeripheralQualifier = (byte)((SCSIInquiryResponse[0] & 0xE0) >> 5); decoded.PeripheralDeviceType = (byte)(SCSIInquiryResponse[0] & 0x1F); } if (SCSIInquiryResponse.Length >= 2) { decoded.RMB = Convert.ToBoolean((SCSIInquiryResponse[1] & 0x80)); decoded.Reserved1 = (byte)(SCSIInquiryResponse[1] & 0x7F); } if (SCSIInquiryResponse.Length >= 3) { decoded.ISOVersion = (byte)((SCSIInquiryResponse[2] & 0xC0) >> 6); decoded.ECMAVersion = (byte)((SCSIInquiryResponse[2] & 0x38) >> 3); decoded.ANSIVersion = (byte)(SCSIInquiryResponse[2] & 0x07); } if (SCSIInquiryResponse.Length >= 4) { decoded.AERC = Convert.ToBoolean((SCSIInquiryResponse[3] & 0x80)); decoded.TrmTsk = Convert.ToBoolean((SCSIInquiryResponse[3] & 0x40)); decoded.NormACA = Convert.ToBoolean((SCSIInquiryResponse[3] & 0x20)); decoded.HiSup = Convert.ToBoolean((SCSIInquiryResponse[3] & 0x10)); decoded.ResponseDataFormat = (byte)(SCSIInquiryResponse[3] & 0x07); } if (SCSIInquiryResponse.Length >= 5) decoded.AdditionalLength = SCSIInquiryResponse[4]; if (SCSIInquiryResponse.Length >= 6) { decoded.SCCS = Convert.ToBoolean((SCSIInquiryResponse[5] & 0x80)); decoded.ACC = Convert.ToBoolean((SCSIInquiryResponse[5] & 0x40)); decoded.TPGS = (byte)((SCSIInquiryResponse[5] & 0x30) >> 4); decoded.ThreePC = Convert.ToBoolean((SCSIInquiryResponse[5] & 0x08)); decoded.Reserved2 = (byte)((SCSIInquiryResponse[5] & 0x06) >> 1); decoded.Protect = Convert.ToBoolean((SCSIInquiryResponse[5] & 0x01)); } if (SCSIInquiryResponse.Length >= 7) { decoded.BQue = Convert.ToBoolean((SCSIInquiryResponse[6] & 0x80)); decoded.EncServ = Convert.ToBoolean((SCSIInquiryResponse[6] & 0x40)); decoded.VS1 = Convert.ToBoolean((SCSIInquiryResponse[6] & 0x20)); decoded.MultiP = Convert.ToBoolean((SCSIInquiryResponse[6] & 0x10)); decoded.MChngr = Convert.ToBoolean((SCSIInquiryResponse[6] & 0x08)); decoded.ACKREQQ = Convert.ToBoolean((SCSIInquiryResponse[6] & 0x04)); decoded.Addr32 = Convert.ToBoolean((SCSIInquiryResponse[6] & 0x02)); decoded.Addr16 = Convert.ToBoolean((SCSIInquiryResponse[6] & 0x01)); } if (SCSIInquiryResponse.Length >= 8) { decoded.RelAddr = Convert.ToBoolean((SCSIInquiryResponse[7] & 0x80)); decoded.WBus32 = Convert.ToBoolean((SCSIInquiryResponse[7] & 0x40)); decoded.WBus16 = Convert.ToBoolean((SCSIInquiryResponse[7] & 0x20)); decoded.Sync = Convert.ToBoolean((SCSIInquiryResponse[7] & 0x10)); decoded.Linked = Convert.ToBoolean((SCSIInquiryResponse[7] & 0x08)); decoded.TranDis = Convert.ToBoolean((SCSIInquiryResponse[7] & 0x04)); decoded.CmdQue = Convert.ToBoolean((SCSIInquiryResponse[7] & 0x02)); decoded.VS2 = Convert.ToBoolean((SCSIInquiryResponse[7] & 0x01)); } if (SCSIInquiryResponse.Length >= 16) { decoded.VendorIdentification = new byte[8]; Array.Copy(SCSIInquiryResponse, 8, decoded.VendorIdentification, 0, 8); } if (SCSIInquiryResponse.Length >= 32) { decoded.ProductIdentification = new byte[16]; Array.Copy(SCSIInquiryResponse, 16, decoded.ProductIdentification, 0, 16); } if (SCSIInquiryResponse.Length >= 36) { decoded.ProductRevisionLevel = new byte[4]; Array.Copy(SCSIInquiryResponse, 32, decoded.ProductRevisionLevel, 0, 4); } if (SCSIInquiryResponse.Length >= 56) { decoded.VendorSpecific = new byte[20]; Array.Copy(SCSIInquiryResponse, 36, decoded.VendorSpecific, 0, 20); } if (SCSIInquiryResponse.Length >= 57) { decoded.Reserved3 = (byte)((SCSIInquiryResponse[56] & 0xF0) >> 4); decoded.Clocking = (byte)((SCSIInquiryResponse[56] & 0x0C) >> 2); decoded.QAS = Convert.ToBoolean((SCSIInquiryResponse[56] & 0x02)); decoded.IUS = Convert.ToBoolean((SCSIInquiryResponse[56] & 0x01)); } if (SCSIInquiryResponse.Length >= 58) decoded.Reserved4 = SCSIInquiryResponse[57]; if (SCSIInquiryResponse.Length >= 74) { decoded.VersionDescriptors = new ushort[8]; BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; for (int i = 0; i < 8; i++) { decoded.VersionDescriptors[i] = BigEndianBitConverter.ToUInt16(SCSIInquiryResponse, 58 + (i * 2)); } } if (SCSIInquiryResponse.Length >= 75 && SCSIInquiryResponse.Length < 96) { decoded.Reserved5 = new byte[SCSIInquiryResponse.Length - 74]; Array.Copy(SCSIInquiryResponse, 74, decoded.Reserved5, 0, SCSIInquiryResponse.Length - 74); } if (SCSIInquiryResponse.Length >= 96) { decoded.Reserved5 = new byte[22]; Array.Copy(SCSIInquiryResponse, 74, decoded.Reserved5, 0, 22); } if (SCSIInquiryResponse.Length > 96) { decoded.VendorSpecific2 = new byte[SCSIInquiryResponse.Length - 96]; Array.Copy(SCSIInquiryResponse, 96, decoded.Reserved5, 0, SCSIInquiryResponse.Length - 96); } return decoded; } public static string PrettifySCSIInquiry(SCSIInquiry? SCSIInquiryResponse) { if (SCSIInquiryResponse == null) return null; SCSIInquiry response = SCSIInquiryResponse.Value; StringBuilder sb = new StringBuilder(); sb.AppendFormat("Device vendor: {0}", PrettifySCSIVendorString(StringHandlers.SpacePaddedToString(response.VendorIdentification))).AppendLine(); sb.AppendFormat("Device name: {0}", StringHandlers.SpacePaddedToString(response.ProductIdentification)).AppendLine(); sb.AppendFormat("Device release level: {0}", StringHandlers.SpacePaddedToString(response.ProductRevisionLevel)).AppendLine(); switch ((SCSIPeripheralQualifiers)response.PeripheralQualifier) { case SCSIPeripheralQualifiers.SCSIPQSupported: sb.AppendLine("Device is connected and supported."); break; case SCSIPeripheralQualifiers.SCSIPQUnconnected: sb.AppendLine("Device is supported but not connected."); break; case SCSIPeripheralQualifiers.SCSIPQReserved: sb.AppendLine("Reserved value set in Peripheral Qualifier field."); break; case SCSIPeripheralQualifiers.SCSIPQUnsupported: sb.AppendLine("Device is connected but unsupported."); break; default: sb.AppendFormat("Vendor value {0} set in Peripheral Qualifier field.", response.PeripheralQualifier).AppendLine(); break; } switch ((SCSIPeripheralDeviceTypes)response.PeripheralDeviceType) { case SCSIPeripheralDeviceTypes.SCSIPDTDirectAccess: //0x00, sb.AppendLine("Direct-access device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTSequentialAccess: //0x01, sb.AppendLine("Sequential-access device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTPrinterDevice: //0x02, sb.AppendLine("Printer device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTProcessorDevice: //0x03, sb.AppendLine("Processor device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTWriteOnceDevice: //0x04, sb.AppendLine("Write-once device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTMultiMediaDevice: //0x05, sb.AppendLine("CD-ROM/DVD/etc device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTScannerDevice: //0x06, sb.AppendLine("Scanner device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTOpticalDevice: //0x07, sb.AppendLine("Optical memory device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTMediumChangerDevice: //0x08, sb.AppendLine("Medium change device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTCommsDevice: //0x09, sb.AppendLine("Communications device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTPrePressDevice1: //0x0A, sb.AppendLine("Graphics arts pre-press device (defined in ASC IT8)"); break; case SCSIPeripheralDeviceTypes.SCSIPDTPrePressDevice2: //0x0B, sb.AppendLine("Graphics arts pre-press device (defined in ASC IT8)"); break; case SCSIPeripheralDeviceTypes.SCSIPDTArrayControllerDevice: //0x0C, sb.AppendLine("Array controller device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTEnclosureServiceDevice: //0x0D, sb.AppendLine("Enclosure services device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTSimplifiedDevice: //0x0E, sb.AppendLine("Simplified direct-access device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTOCRWDevice: //0x0F, sb.AppendLine("Optical card reader/writer device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTBridgingExpander: //0x10, sb.AppendLine("Bridging Expanders"); break; case SCSIPeripheralDeviceTypes.SCSIPDTObjectDevice: //0x11, sb.AppendLine("Object-based Storage Device"); break; case SCSIPeripheralDeviceTypes.SCSIPDTADCDevice: //0x12, sb.AppendLine("Automation/Drive Interface"); break; case SCSIPeripheralDeviceTypes.SCSIPDTWellKnownDevice: //0x1E, sb.AppendLine("Well known logical unit"); break; case SCSIPeripheralDeviceTypes.SCSIPDTUnknownDevice: //0x1F sb.AppendLine("Unknown or no device type"); break; default: sb.AppendFormat("Unknown device type field value 0x{0:X2}", response.PeripheralDeviceType).AppendLine(); break; } switch ((SCSIANSIVersions)response.ANSIVersion) { case SCSIANSIVersions.SCSIANSINoVersion: sb.AppendLine("Device does not claim to comply with any SCSI ANSI standard"); break; case SCSIANSIVersions.SCSIANSIObsolete: sb.AppendLine("Device claims to comply with an obsolete SCSI ANSI standard"); break; case SCSIANSIVersions.SCSIANSI1994Version: sb.AppendLine("Device claims to comply with ANSI X3.131:1994"); break; case SCSIANSIVersions.SCSIANSI1997Version: sb.AppendLine("Device claims to comply with ANSI X3.301:1997"); break; case SCSIANSIVersions.SCSIANSI2001Version: sb.AppendLine("Device claims to comply with ANSI X3.351:2001"); break; case SCSIANSIVersions.SCSIANSI2005Version: sb.AppendLine("Device claims to comply with ANSI X3.???:2005"); break; default: sb.AppendFormat("Device claims to comply with unknown SCSI ANSI standard value 0x{0:X2})", response.ANSIVersion).AppendLine(); break; } switch ((SCSIECMAVersions)response.ECMAVersion) { case SCSIECMAVersions.SCSIECMANoVersion: sb.AppendLine("Device does not claim to comply with any SCSI ECMA standard"); break; case SCSIECMAVersions.SCSIECMAObsolete: sb.AppendLine("Device claims to comply with an obsolete SCSI ECMA standard"); break; default: sb.AppendFormat("Device claims to comply with unknown SCSI ECMA standard value 0x{0:X2})", response.ECMAVersion).AppendLine(); break; } switch ((SCSIISOVersions)response.ISOVersion) { case SCSIISOVersions.SCSIISONoVersion: sb.AppendLine("Device does not claim to comply with any SCSI ISO/IEC standard"); break; case SCSIISOVersions.SCSIISO1995Version: sb.AppendLine("Device claims to comply with ISO/IEC 9316:1995"); break; default: sb.AppendFormat("Device claims to comply with unknown SCSI ISO/IEC standard value 0x{0:X2})", response.ISOVersion).AppendLine(); break; } if (response.RMB) sb.AppendLine("Device is removable"); if (response.AERC) sb.AppendLine("Device supports Asynchronous Event Reporting Capability"); if (response.TrmTsk) sb.AppendLine("Device supports TERMINATE TASK command"); if (response.NormACA) sb.AppendLine("Device supports setting Normal ACA"); if (response.HiSup) sb.AppendLine("Device supports LUN hierarchical addressing"); if (response.SCCS) sb.AppendLine("Device contains an embedded storage array controller"); if (response.ACC) sb.AppendLine("Device contains an Access Control Coordinator"); if (response.ThreePC) sb.AppendLine("Device supports third-party copy commands"); if (response.Protect) sb.AppendLine("Device supports protection information"); if (response.BQue) sb.AppendLine("Device supports basic queueing"); if (response.EncServ) sb.AppendLine("Device contains an embedded enclosure services component"); if (response.MultiP) sb.AppendLine("Multi-port device"); if (response.MChngr) sb.AppendLine("Device contains or is attached to a medium changer"); if (response.ACKREQQ) sb.AppendLine("Device supports request and acknowledge handshakes"); if (response.Addr32) sb.AppendLine("Device supports 32-bit wide SCSI addresses"); if (response.Addr16) sb.AppendLine("Device supports 16-bit wide SCSI addresses"); if (response.RelAddr) sb.AppendLine("Device supports relative addressing"); if (response.WBus32) sb.AppendLine("Device supports 32-bit wide data transfers"); if (response.WBus16) sb.AppendLine("Device supports 16-bit wide data transfers"); if (response.Sync) sb.AppendLine("Device supports synchronous data transfer"); if (response.Linked) sb.AppendLine("Device supports linked commands"); if (response.TranDis) sb.AppendLine("Device supports CONTINUE TASK and TARGET TRANSFER DISABLE commands"); if (response.QAS) sb.AppendLine("Device supports Quick Arbitration and Selection"); if (response.CmdQue) sb.AppendLine("Device supports TCQ queue"); if (response.IUS) sb.AppendLine("Device supports information unit transfers"); //if (MainClass.isDebug) { if (response.VS1) sb.AppendLine("Vendor specific bit 5 on byte 6 of INQUIRY response is set"); if (response.VS2) sb.AppendLine("Vendor specific bit 0 on byte 7 of INQUIRY response is set"); } switch ((SCSITGPSValues)response.TPGS) { case SCSITGPSValues.NotSupported: sb.AppendLine("Device does not support assymetrical access"); break; case SCSITGPSValues.OnlyImplicit: sb.AppendLine("Device only supports implicit assymetrical access"); break; case SCSITGPSValues.OnlyExplicit: sb.AppendLine("Device only supports explicit assymetrical access"); break; case SCSITGPSValues.Both: sb.AppendLine("Device supports implicit and explicit assymetrical access"); break; default: sb.AppendFormat("Unknown value in TPGS field 0x{0:X2}", response.TPGS).AppendLine(); break; } switch ((SCSISPIClocking)response.Clocking) { case SCSISPIClocking.SCSIClockingST: sb.AppendLine("Device supports only ST clocking"); break; case SCSISPIClocking.SCSIClockingDT: sb.AppendLine("Device supports only DT clocking"); break; case SCSISPIClocking.SCSIClockingReserved: sb.AppendLine("Reserved value 0x02 found in SPI clocking field"); break; case SCSISPIClocking.SCSIClockingSTandDT: sb.AppendLine("Device supports ST and DT clocking"); break; default: sb.AppendFormat("Unknown value in SPI clocking field 0x{0:X2}", response.Clocking).AppendLine(); break; } foreach (UInt16 VersionDescriptor in response.VersionDescriptors) { switch (VersionDescriptor & 0xFFE0) { case (int)SCSIVersionDescriptorStandardMask.NoStandard: //0x0000 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device claims no standard"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of no standard", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SAM: //0x0020 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSAMMask.NoVersion: sb.AppendLine("Device complies with standard SAM, no version"); break; case (int)SCSIVersionDescriptorSAMMask.T10_0994_r18: sb.AppendLine("Device complies with T10/0994 revision 18 (SAM)"); break; case (int)SCSIVersionDescriptorSAMMask.ANSI_1996: sb.AppendLine("Device complies with ANSI X3.270:1996 (SAM)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SAM", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SAM2: //0x0040 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSAM2Mask.NoVersion: sb.AppendLine("Device complies with standard SAM-2, no version"); break; case (int)SCSIVersionDescriptorSAM2Mask.T10_1157_r23: sb.AppendLine("Device complies with T10/1157-D revision 23 (SAM-2)"); break; case (int)SCSIVersionDescriptorSAM2Mask.T10_1157_r24: sb.AppendLine("Device complies with T10/1157-D revision 24 (SAM-2)"); break; case (int)SCSIVersionDescriptorSAM2Mask.ANSI_2003: sb.AppendLine("Device complies with ANSI INCITS 366-2003 (SAM-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SAM-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SAM3: //0x0060 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSAM3Mask.NoVersion: sb.AppendLine("Device complies with standard SAM-3, no version"); break; case (int)SCSIVersionDescriptorSAM3Mask.T10_1561_r07: sb.AppendLine("Device complies with T10/1561-D revision 7 (SAM-3)"); break; case (int)SCSIVersionDescriptorSAM3Mask.T10_1561_r13: sb.AppendLine("Device complies with T10/1561-D revision 13 (SAM-3)"); break; case (int)SCSIVersionDescriptorSAM3Mask.T10_1561_r14: sb.AppendLine("Device complies with T10/1157-D revision 14 (SAM-3)"); break; case (int)SCSIVersionDescriptorSAM3Mask.ANSI_2005: sb.AppendLine("Device complies with ANSI INCITS 402-2005 (SAM-3)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SAM-3", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SAM4: //0x0080 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard SAM-4, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SAM-4", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SPC: //0x0120 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSPCMask.NoVersion: sb.AppendLine("Device complies with standard SPC, no version"); break; case (int)SCSIVersionDescriptorSPCMask.T10_0995_r11a: sb.AppendLine("Device complies with T10/0995 revision 11a (SPC)"); break; case (int)SCSIVersionDescriptorSPCMask.ANSI_1997: sb.AppendLine("Device complies with ANSI X3.301:1997 (SPC)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SPC", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.MMC: //0x0140 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorMMCMask.NoVersion: sb.AppendLine("Device complies with standard MMC, no version"); break; case (int)SCSIVersionDescriptorMMCMask.T10_1048_r10a: sb.AppendLine("Device complies with T10/1048 revision 10a (MMC)"); break; case (int)SCSIVersionDescriptorMMCMask.ANSI_1997: sb.AppendLine("Device complies with ANSI X3.304:1997 (MMC)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard MMC", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SCC: //0x0160 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSCCMask.NoVersion: sb.AppendLine("Device complies with standard SCC, no version"); break; case (int)SCSIVersionDescriptorSCCMask.T10_1048_r06c: sb.AppendLine("Device complies with T10/1047 revision 06c (SCC)"); break; case (int)SCSIVersionDescriptorSCCMask.ANSI_1997: sb.AppendLine("Device complies with ANSI X3.276:1997 (SCC)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SCC", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SBC: //0x0180 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSBCMask.NoVersion: sb.AppendLine("Device complies with standard SBC, no version"); break; case (int)SCSIVersionDescriptorSBCMask.T10_0996_r08c: sb.AppendLine("Device complies with T10/0996 revision 08c (SBC)"); break; case (int)SCSIVersionDescriptorSBCMask.ANSI_1998: sb.AppendLine("Device complies with ANSI NCITS.306:1998 (SBC)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SBC", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SMC: //0x01A0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSMCMask.NoVersion: sb.AppendLine("Device complies with standard SMC, no version"); break; case (int)SCSIVersionDescriptorSMCMask.T10_0999_r10a: sb.AppendLine("Device complies with T10/0999 revision 10a (SMC)"); break; case (int)SCSIVersionDescriptorSMCMask.ANSI_1998: sb.AppendLine("Device complies with ANSI NCITS.314:1998 (SMC)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SMC", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SES: //0x01C0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSESMask.NoVersion: sb.AppendLine("Device complies with standard SES, no version"); break; case (int)SCSIVersionDescriptorSESMask.T10_1212_r08b: sb.AppendLine("Device complies with T10/1212 revision 08b (SES)"); break; case (int)SCSIVersionDescriptorSESMask.ANSI_1998: sb.AppendLine("Device complies with ANSI NCITS.305:1998 (SES)"); break; case (int)SCSIVersionDescriptorSESMask.T10_1212_r08b_2000: sb.AppendLine("Device complies with T10/1212 revision 08b with ANSI NCITS.305/AM1:2000 (SES)"); break; case (int)SCSIVersionDescriptorSESMask.ANSI_1998_2000: sb.AppendLine("Device complies with ANSI NCITS.305:1998 with ANSI NCITS.305/AM1:2000 (SES)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SES", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SCC2: //0x01E0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSCC2Mask.NoVersion: sb.AppendLine("Device complies with standard SCC-2, no version"); break; case (int)SCSIVersionDescriptorSCC2Mask.T10_1125_r04: sb.AppendLine("Device complies with T10/1125 revision 04 (SCC-2)"); break; case (int)SCSIVersionDescriptorSCC2Mask.ANSI_1998: sb.AppendLine("Device complies with ANSI NCITS.318:1998 (SCC-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SCC-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SSC: //0x0200 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSSCMask.NoVersion: sb.AppendLine("Device complies with standard SSC, no version"); break; case (int)SCSIVersionDescriptorSSCMask.T10_0997_r17: sb.AppendLine("Device complies with T10/0997 revision 17 (SSC)"); break; case (int)SCSIVersionDescriptorSSCMask.T10_0997_r22: sb.AppendLine("Device complies with T10/0997 revision 22 (SSC)"); break; case (int)SCSIVersionDescriptorSSCMask.ANSI_2000: sb.AppendLine("Device complies with ANSI NCITS.335:2000 (SSC)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SSC", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.RBC: //0x0220 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorRBCMask.NoVersion: sb.AppendLine("Device complies with standard RBC, no version"); break; case (int)SCSIVersionDescriptorRBCMask.T10_1240_r10a: sb.AppendLine("Device complies with T10/1240 revision 10a (RBC)"); break; case (int)SCSIVersionDescriptorRBCMask.ANSI_2000: sb.AppendLine("Device complies with ANSI NCITS.330:2000 (RBC)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard RBC", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.MMC2: //0x0240 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorMMC2Mask.NoVersion: sb.AppendLine("Device complies with standard MMC-2, no version"); break; case (int)SCSIVersionDescriptorMMC2Mask.T10_1228_r11: sb.AppendLine("Device complies with T10/1228 revision 11 (MMC-2)"); break; case (int)SCSIVersionDescriptorMMC2Mask.T10_1228_r11a: sb.AppendLine("Device complies with T10/1228 revision 11a (MMC-2)"); break; case (int)SCSIVersionDescriptorMMC2Mask.ANSI_2000: sb.AppendLine("Device complies with ANSI NCITS.333:2000 (MMC-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard MMC-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SPC2: //0x0260 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSPC2Mask.NoVersion: sb.AppendLine("Device complies with standard SPC-2, no version"); break; case (int)SCSIVersionDescriptorSPC2Mask.T10_1236_r12: sb.AppendLine("Device complies with T10/1236 revision 12 (SPC-2)"); break; case (int)SCSIVersionDescriptorSPC2Mask.T10_1236_r18: sb.AppendLine("Device complies with T10/1236 revision 18 (SPC-2)"); break; case (int)SCSIVersionDescriptorSPC2Mask.T10_1236_r19: sb.AppendLine("Device complies with T10/1236 revision 19 (SPC-2)"); break; case (int)SCSIVersionDescriptorSPC2Mask.T10_1236_r20: sb.AppendLine("Device complies with T10/1236 revision 20 (SPC-2)"); break; case (int)SCSIVersionDescriptorSPC2Mask.ANSI_2001: sb.AppendLine("Device complies with ANSI INCITS 351-2001 (SPC-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SPC-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.OCRW: //0x0280 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorOCRWMask.NoVersion: sb.AppendLine("Device complies with standard OCRW, no version"); break; case (int)SCSIVersionDescriptorOCRWMask.ISO14776_381: sb.AppendLine("Device complies with ISO/IEC 14776-381 (OCRW)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard OCRW", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.MMC3: //0x02A0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorMMC3Mask.NoVersion: sb.AppendLine("Device complies with standard MMC-3, no version"); break; case (int)SCSIVersionDescriptorMMC3Mask.T10_1363_r09: sb.AppendLine("Device complies with T10/1363-D revision 9 (MMC-3)"); break; case (int)SCSIVersionDescriptorMMC3Mask.T10_1363_r10g: sb.AppendLine("Device complies with T10/1363-D revision 10g (MMC-3)"); break; case (int)SCSIVersionDescriptorMMC3Mask.ANSI_2001: sb.AppendLine("Device complies with ANSI INCITS 360-2002 (MMC-3)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard MMC-3", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.RMC: //0x02C0 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard "); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard ", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SMC2: //0x02E0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSMC2Mask.NoVersion: sb.AppendLine("Device complies with standard SMC-2, no version"); break; case (int)SCSIVersionDescriptorSMC2Mask.T10_1383_r05: sb.AppendLine("Device complies with T10/1383-D revision 5 (SMC-2)"); break; case (int)SCSIVersionDescriptorSMC2Mask.T10_1383_r06: sb.AppendLine("Device complies with T10/1383-D revision 6 (SMC-2)"); break; case (int)SCSIVersionDescriptorSMC2Mask.T10_1383_r07: sb.AppendLine("Device complies with T10/1383-D revision 7 (SMC-2)"); break; case (int)SCSIVersionDescriptorSMC2Mask.ANSI_2004: sb.AppendLine("Device complies with ANSI_2004 (SMC-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SMC-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SPC3: //0x0300 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSPC3Mask.NoVersion: sb.AppendLine("Device complies with standard SPC-3, no version"); break; case (int)SCSIVersionDescriptorSPC3Mask.T10_1416_r07: sb.AppendLine("Device complies with T10/1416-D revision 7 (SPC-3)"); break; case (int)SCSIVersionDescriptorSPC3Mask.T10_1416_r21: sb.AppendLine("Device complies with T10/1416-D revision 21 (SPC-3)"); break; case (int)SCSIVersionDescriptorSPC3Mask.T10_1416_r22: sb.AppendLine("Device complies with T10/1416-D revision 22 (SPC-3)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SPC-3", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SBC2: //0x0320 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSBC2Mask.NoVersion: sb.AppendLine("Device complies with standard SBC-2, no version"); break; case (int)SCSIVersionDescriptorSBC2Mask.T10_1383_r05: sb.AppendLine("Device complies with T10/1383 revision 5 (SBC-2)"); break; case (int)SCSIVersionDescriptorSBC2Mask.T10_1383_r06: sb.AppendLine("Device complies with T10/1383 revision 6 (SBC-2)"); break; case (int)SCSIVersionDescriptorSBC2Mask.T10_1383_r07: sb.AppendLine("Device complies with T10/1383 revision 7 (SBC-2)"); break; case (int)SCSIVersionDescriptorSBC2Mask.ANSI_2005: sb.AppendLine("Device complies with ANSI INCITS 405-2005 (SBC-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SBC-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.OSD: //0x0340 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorOSDMask.NoVersion: sb.AppendLine("Device complies with standard OSD, no version"); break; case (int)SCSIVersionDescriptorOSDMask.T10_1355_r0: sb.AppendLine("Device complies with T10/1355 revision 0 (OSD)"); break; case (int)SCSIVersionDescriptorOSDMask.T10_1355_r7a: sb.AppendLine("Device complies with T10/1355 revision 7a (OSD)"); break; case (int)SCSIVersionDescriptorOSDMask.T10_1355_r8: sb.AppendLine("Device complies with T10/1355 revision 8 (OSD)"); break; case (int)SCSIVersionDescriptorOSDMask.T10_1355_r9: sb.AppendLine("Device complies with T10/1355 revision 9 (OSD)"); break; case (int)SCSIVersionDescriptorOSDMask.T10_1355_r10: sb.AppendLine("Device complies with T10/1355 revision 10 (OSD)"); break; case (int)SCSIVersionDescriptorOSDMask.ANSI_2004: sb.AppendLine("Device complies with ANSI INCITS 400-2004 (OSD)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard OSD", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SSC2: //0x0360 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSSC2Mask.NoVersion: sb.AppendLine("Device complies with standard SSC-2, no version"); break; case (int)SCSIVersionDescriptorSSC2Mask.T10_1434_r07: sb.AppendLine("Device complies with T10/1434-D revision 7 (SSC-2)"); break; case (int)SCSIVersionDescriptorSSC2Mask.T10_1434_r09: sb.AppendLine("Device complies with T10/1434-D revision 9 (SSC-2)"); break; case (int)SCSIVersionDescriptorSSC2Mask.ANSI_2003: sb.AppendLine("Device complies with ANSI INCITS 380-2003 (SSC-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SSC-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.BCC: //0x0380 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard BCC, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard BCC", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.MMC4: //0x03A0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorMMC4Mask.NoVersion: sb.AppendLine("Device complies with standard MMC-4, no version"); break; case (int)SCSIVersionDescriptorMMC4Mask.T10_1545_r5: sb.AppendLine("Device complies with T10/1545-D revision 5 (MMC-4)"); break; case (int)SCSIVersionDescriptorMMC4Mask.T10_1545_r3: sb.AppendLine("Device complies with T10/1545-D revision 3 (MMC-4)"); break; case (int)SCSIVersionDescriptorMMC4Mask.T10_1545_r3d: sb.AppendLine("Device complies with T10/1545-D revision 3d (MMC-4)"); break; case (int)SCSIVersionDescriptorMMC4Mask.ANSI_2005: sb.AppendLine("Device complies with ANSI INCITS 401-2005 (MMC-4)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard MMC-4", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.ADC: //0x03C0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorADCMask.NoVersion: sb.AppendLine("Device complies with standard ADC, no version"); break; case (int)SCSIVersionDescriptorADCMask.T10_1558_r6: sb.AppendLine("Device complies with T10/1558-D revision 6 (ADC)"); break; case (int)SCSIVersionDescriptorADCMask.T10_1558_r7: sb.AppendLine("Device complies with T10/1558-D revision 7 (ADC)"); break; case (int)SCSIVersionDescriptorADCMask.ANSI_2005: sb.AppendLine("Device complies with ANSI INCITS 403-2005 (ADC)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard ADC", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SES2: //0x03E0 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard SES-2, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SES-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SSC3: //0x0400 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard SSC-3, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SSC-3", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.MMC5: //0x0420 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard MMC-5, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard MMC-5", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.OSD2: //0x0440 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard OSD-2, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard OSD-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SPC4: //0x0460 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard SPC-4, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SPC-4", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SMC3: //0x0480 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard SMC-3, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SMC-3", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.ADC2: //0x04A0 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard ADC-2, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard ADC-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SSA_TL2: //0x0820 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSSA_TL2Mask.NoVersion: sb.AppendLine("Device complies with standard SSA-TL2, no version"); break; case (int)SCSIVersionDescriptorSSA_TL2Mask.T10_1147_r05b: sb.AppendLine("Device complies with T10.1/1147 revision 05b (SSA-TL2)"); break; case (int)SCSIVersionDescriptorSSA_TL2Mask.ANSI_1998: sb.AppendLine("Device complies with ANSI NCITS.308:1998 (SSA-TL2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SSA-TL2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SSA_TL1: //0x0840 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSSA_TL1Mask.NoVersion: sb.AppendLine("Device complies with standard SSA-TL1, no version"); break; case (int)SCSIVersionDescriptorSSA_TL1Mask.T10_0989_r10b: sb.AppendLine("Device complies with T10.1/0989 revision 10b (SSA-TL1)"); break; case (int)SCSIVersionDescriptorSSA_TL1Mask.ANSI_1996: sb.AppendLine("Device complies with ANSI X3.295:1996 (SSA-TL1)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SSA-TL1", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SSA_S3P: //0x0860 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSSA_S3PMask.NoVersion: sb.AppendLine("Device complies with standard SSA-S3P, no version"); break; case (int)SCSIVersionDescriptorSSA_S3PMask.T10_1051_r05b: sb.AppendLine("Device complies with T10.1/1051 revision 05b (SSA-S3P)"); break; case (int)SCSIVersionDescriptorSSA_S3PMask.ANSI_1998: sb.AppendLine("Device complies with ANSI NCITS.309:1998 (SSA-S3P)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SSA-S3P", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SSA_S2P: //0x0880 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSSA_S2PMask.NoVersion: sb.AppendLine("Device complies with standard SSA-S2P, no version"); break; case (int)SCSIVersionDescriptorSSA_S2PMask.T10_1121_r07b: sb.AppendLine("Device complies with T10.1/1121 revision 07b (SSA-S2P)"); break; case (int)SCSIVersionDescriptorSSA_S2PMask.ANSI_1996: sb.AppendLine("Device complies with ANSI X3.294:1996 (SSA-S2P)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SSA-S2P", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SIP: //0x08A0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSIPMask.NoVersion: sb.AppendLine("Device complies with standard SIP, no version"); break; case (int)SCSIVersionDescriptorSIPMask.T10_0856_r10: sb.AppendLine("Device complies with T10/0856 revision 10 (SIP)"); break; case (int)SCSIVersionDescriptorSIPMask.ANSI_1997: sb.AppendLine("Device complies with ANSI X3.292:1997 (SIP)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SIP", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FCP: //0x08C0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCPMask.NoVersion: sb.AppendLine("Device complies with standard FCP, no version"); break; case (int)SCSIVersionDescriptorFCPMask.T10_0993_r12: sb.AppendLine("Device complies with T10/0993 revision 12 (FCP)"); break; case (int)SCSIVersionDescriptorFCPMask.ANSI_1996: sb.AppendLine("Device complies with ANSI X3.269:1996 (FCP)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FCP", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SBP2: //0x08E0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSBP2Mask.NoVersion: sb.AppendLine("Device complies with standard SBP-2, no version"); break; case (int)SCSIVersionDescriptorSBP2Mask.T10_1155_r04: sb.AppendLine("Device complies with T10/1155 revision 04 (SBP-2)"); break; case (int)SCSIVersionDescriptorSBP2Mask.ANSI_1999: sb.AppendLine("Device complies with ANSI NCITS.325:1999 (SBP-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SBP-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FCP2: //0x0900 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCP2Mask.NoVersion: sb.AppendLine("Device complies with standard FCP-2, no version"); break; case (int)SCSIVersionDescriptorFCP2Mask.T10_1144_r4: sb.AppendLine("Device complies with T10/1144-D revision 4 (FCP-2)"); break; case (int)SCSIVersionDescriptorFCP2Mask.T10_1144_r7: sb.AppendLine("Device complies with T10/1144-D revision 7 (FCP-2)"); break; case (int)SCSIVersionDescriptorFCP2Mask.T10_1144_r7a: sb.AppendLine("Device complies with T10/1144-D revision 7a (FCP-2)"); break; case (int)SCSIVersionDescriptorFCP2Mask.ANSI_2003: sb.AppendLine("Device complies with ANSI INCITS 350-2003 (FCP-2)"); break; case (int)SCSIVersionDescriptorFCP2Mask.T10_1144_r8: sb.AppendLine("Device complies with T10/1144-D revision 8 (FCP-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FCP-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SST: //0x0920 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSSTMask.NoVersion: sb.AppendLine("Device complies with standard SST, no version"); break; case (int)SCSIVersionDescriptorSSTMask.T10_1380_r8b: sb.AppendLine("Device complies with T10/1380-D revision 8b (SST)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SST", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SRP: //0x0940 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSRPMask.NoVersion: sb.AppendLine("Device complies with standard SRP, no version"); break; case (int)SCSIVersionDescriptorSRPMask.T10_1415_r10: sb.AppendLine("Device complies with T10/1415-D revision 10 (SRP)"); break; case (int)SCSIVersionDescriptorSRPMask.T10_1415_r16a: sb.AppendLine("Device complies with T10/1415-D revision 16a (SRP)"); break; case (int)SCSIVersionDescriptorSRPMask.ANSI_2003: sb.AppendLine("Device complies with ANSI INCITS 365-2002 (SRP)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SRP", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.iSCSI: //0x0960 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard iSCSI, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard iSCSI", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SBP3: //0x0980 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSBP3Mask.NoVersion: sb.AppendLine("Device complies with standard SBP-3, no version"); break; case (int)SCSIVersionDescriptorSBP3Mask.T10_1467_r1f: sb.AppendLine("Device complies with T10/1467-D revision 1f (SBP-3)"); break; case (int)SCSIVersionDescriptorSBP3Mask.T10_1467_r3: sb.AppendLine("Device complies with T10/1467-D revision 3 (SBP-3)"); break; case (int)SCSIVersionDescriptorSBP3Mask.T10_1467_r4: sb.AppendLine("Device complies with T10/1467-D revision 4 (SBP-3)"); break; case (int)SCSIVersionDescriptorSBP3Mask.T10_1467_r5: sb.AppendLine("Device complies with T10/1467-D revision 5 (SBP-3)"); break; case (int)SCSIVersionDescriptorSBP3Mask.ANSI_2004: sb.AppendLine("Device complies with ANSI INCITS 375-2004 (SBP-3)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SBP-3", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.ADP: //0x09C0 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard ADP, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard ADP", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.ADT: //0x09E0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorADTMask.NoVersion: sb.AppendLine("Device complies with standard ADT, no version"); break; case (int)SCSIVersionDescriptorADTMask.T10_1557_r11: sb.AppendLine("Device complies with T10/1557-D revision 11 (ADT)"); break; case (int)SCSIVersionDescriptorADTMask.T10_1557_r14: sb.AppendLine("Device complies with T10/1557-D revision 14 (ADT)"); break; case (int)SCSIVersionDescriptorADTMask.ANSI_2005: sb.AppendLine("Device complies with ANSI INCITS 406-2005 (ADT)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard ADT", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FCP3: //0x0A00 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCP3Mask.NoVersion: sb.AppendLine("Device complies with standard FCP-3, no version"); break; case (int)SCSIVersionDescriptorFCP3Mask.T10_1560_r4: sb.AppendLine("Device complies with T10/1560-D revision 4 (FCP-3)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FCP-3", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.ADT2: //0x0A20 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard ADT-2, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard ADT-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SPI: //0x0AA0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSPIMask.NoVersion: sb.AppendLine("Device complies with standard SPI, no version"); break; case (int)SCSIVersionDescriptorSPIMask.T10_0855_r15a: sb.AppendLine("Device complies with T10/0855 revision 15a (SPI)"); break; case (int)SCSIVersionDescriptorSPIMask.ANSI_1995: sb.AppendLine("Device complies with ANSI X3.253:1995 (SPI)"); break; case (int)SCSIVersionDescriptorSPIMask.T10_0855_r15a_Amnd_3a: sb.AppendLine("Device complies with T10/0855 revision 15a with SPI Amnd revision 3a (SPI)"); break; case (int)SCSIVersionDescriptorSPIMask.ANSI_1995_1998: sb.AppendLine("Device complies with ANSI X3.253:1995 with SPI Amnd ANSI X3.253/AM1:1998 (SPI)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SPI", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.Fast20: //0xAC0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFast20Mask.NoVersion: sb.AppendLine("Device complies with standard Fast-20, no version"); break; case (int)SCSIVersionDescriptorFast20Mask.T10_1071_r06: sb.AppendLine("Device complies with T10/1071 revision 06 (Fast-20)"); break; case (int)SCSIVersionDescriptorFast20Mask.ANSI_1996: sb.AppendLine("Device complies with ANSI X3.277:1996 (Fast-20)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard Fast-20", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SPI2: //0x0AE0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSPI2Mask.NoVersion: sb.AppendLine("Device complies with standard SPI-2, no version"); break; case (int)SCSIVersionDescriptorSPI2Mask.T10_1142_r20b: sb.AppendLine("Device complies with T10/1142 revision 20b (SPI-2)"); break; case (int)SCSIVersionDescriptorSPI2Mask.ANSI_1999: sb.AppendLine("Device complies with ANSI X3.302:1999 (SPI-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SPI-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SPI3: //0x0B00 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSPI3Mask.NoVersion: sb.AppendLine("Device complies with standard SPI-3, no version"); break; case (int)SCSIVersionDescriptorSPI3Mask.T10_1302D_r10: sb.AppendLine("Device complies with T10/1302-D revision 10 (SPI-3)"); break; case (int)SCSIVersionDescriptorSPI3Mask.T10_1302D_r13a: sb.AppendLine("Device complies with T10/1302-D revision 13a (SPI-3)"); break; case (int)SCSIVersionDescriptorSPI3Mask.T10_1302D_r14: sb.AppendLine("Device complies with T10/1302-D revision 14 (SPI-3)"); break; case (int)SCSIVersionDescriptorSPI3Mask.ANSI_2000: sb.AppendLine("Device complies with ANSI NCITS.336:2000 (SPI-3)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SPI-3", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.EPI: //0x0B20 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorEPIMask.NoVersion: sb.AppendLine("Device complies with standard EPI, no version"); break; case (int)SCSIVersionDescriptorEPIMask.T10_1134_r16: sb.AppendLine("Device complies with T10/1134 revision 16 (EPI)"); break; case (int)SCSIVersionDescriptorEPIMask.ANSI_1999: sb.AppendLine("Device complies with ANSI NCITS TR-23:1999 (EPI)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard EPI", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SPI4: //0x0B40 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSPI4Mask.NoVersion: sb.AppendLine("Device complies with standard SPI-4, no version"); break; case (int)SCSIVersionDescriptorSPI4Mask.T10_1365_r7: sb.AppendLine("Device complies with T10/1365-D revision 7 (SPI-4)"); break; case (int)SCSIVersionDescriptorSPI4Mask.T10_1365_r9: sb.AppendLine("Device complies with T10/1365-D revision 9 (SPI-4)"); break; case (int)SCSIVersionDescriptorSPI4Mask.ANSI_2002: sb.AppendLine("Device complies with ANSI INCITS 362-2002 (SPI-4)"); break; case (int)SCSIVersionDescriptorSPI4Mask.T10_1365_r10: sb.AppendLine("Device complies with T10/1365-D revision 10 (SPI-4)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SPI-4", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SPI5: //0x0B40 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSPI5Mask.NoVersion: sb.AppendLine("Device complies with standard SPI-5, no version"); break; case (int)SCSIVersionDescriptorSPI5Mask.T10_1525_r3: sb.AppendLine("Device complies with T10/1525-D revision 3 (SPI-5)"); break; case (int)SCSIVersionDescriptorSPI5Mask.T10_1525_r5: sb.AppendLine("Device complies with T10/1525-D revision 5 (SPI-5)"); break; case (int)SCSIVersionDescriptorSPI5Mask.T10_1525_r6: sb.AppendLine("Device complies with T10/1525-D revision 6 (SPI-5)"); break; case (int)SCSIVersionDescriptorSPI5Mask.ANSI_2003: sb.AppendLine("Device complies with ANSI INCITS 367-2003 (SPI-5)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SPI-5", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SAS: //0x0BE0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSASMask.NoVersion: sb.AppendLine("Device complies with standard (SAS)"); break; case (int)SCSIVersionDescriptorSASMask.T10_1562_r01: sb.AppendLine("Device complies with T10/1562-D revision 01 (SAS)"); break; case (int)SCSIVersionDescriptorSASMask.T10_1562_r03: sb.AppendLine("Device complies with T10/1562-D revision 03 (SAS)"); break; case (int)SCSIVersionDescriptorSASMask.T10_1562_r04: case (int)SCSIVersionDescriptorSASMask.T10_1562_r04bis: sb.AppendLine("Device complies with T10/1562-D revision 04 (SAS)"); break; case (int)SCSIVersionDescriptorSASMask.T10_1562_r05: sb.AppendLine("Device complies with T10/1562-D revision 05 (SAS)"); break; case (int)SCSIVersionDescriptorSASMask.ANSI_2003: sb.AppendLine("Device complies with ANSI INCITS 376-2003 (SAS)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SAS", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SAS11: //0x0C00 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSAS11Mask.NoVersion: sb.AppendLine("Device complies with standard SAS 1.1, no version"); break; case (int)SCSIVersionDescriptorSAS11Mask.T10_1601_r9: sb.AppendLine("Device complies with T10/1601-D revision 9 (SAS 1.1)"); break; case (int)SCSIVersionDescriptorSAS11Mask.T10_1601_r10: sb.AppendLine("Device complies with T10/1601-D revision 10 (SAS 1.1)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SAS 1.1", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_PH: //0x0D20 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCPHMask.NoVersion: sb.AppendLine("Device complies with standard FC-PH, no version"); break; case (int)SCSIVersionDescriptorFCPHMask.ANSI_1994: sb.AppendLine("Device complies with ANSI X3.230:1994 (FC-PH)"); break; case (int)SCSIVersionDescriptorFCPHMask.ANSI_1994_1996: sb.AppendLine("Device complies with ANSI X3.230:1994 with Amnd 1 ANSI X3.230/AM1:1996 (FC-PH)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-PH", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_AL: //0x0D40 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCALMask.NoVersion: sb.AppendLine("Device complies with standard FC-AL, no version"); break; case (int)SCSIVersionDescriptorFCALMask.ANSI_1996: sb.AppendLine("Device complies with ANSI X3.272:1996 (FC-AL)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-AL", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_AL2: //0x0D60 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCAL2Mask.NoVersion: sb.AppendLine("Device complies with standard FC-AL-2, no version"); break; case (int)SCSIVersionDescriptorFCAL2Mask.T11_1133_r70: sb.AppendLine("Device complies with T11/1133 revision 7.0 (FC-AL-2)"); break; case (int)SCSIVersionDescriptorFCAL2Mask.ANSI_1999: sb.AppendLine("Device complies with ANSI NCITS.332:1999 (FC-AL-2)"); break; case (int)SCSIVersionDescriptorFCAL2Mask.ANSI_1999_2002: sb.AppendLine("Device complies with ANSI INCITS 332-1999 with Amnd 1 AM1-2002 (FC-AL-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-AL-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_PH3: //0x0D80 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCPH3Mask.NoVersion: sb.AppendLine("Device complies with standard FC-PH-3, no version"); break; case (int)SCSIVersionDescriptorFCPH3Mask.ANSI_1998: sb.AppendLine("Device complies with ANSI X3.303-1998 (FC-PH-3)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-PH-3", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_FS: //0x0DA0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCFSMask.NoVersion: sb.AppendLine("Device complies with standard FC-FS, no version"); break; case (int)SCSIVersionDescriptorFCFSMask.T11_1331_r12: sb.AppendLine("Device complies with T11/1331 revision 1.2 (FC-FS)"); break; case (int)SCSIVersionDescriptorFCFSMask.T11_1331_r17: sb.AppendLine("Device complies with T11/1331 revision 1.7 (FC-FS)"); break; case (int)SCSIVersionDescriptorFCFSMask.ANSI_2003: sb.AppendLine("Device complies with ANSI INCITS 373-2003 (FC-FS)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-FS", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_PI: //0x0DC0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCPIMask.NoVersion: sb.AppendLine("Device complies with standard FC-PI, no version"); break; case (int)SCSIVersionDescriptorFCPIMask.ANSI_2002: sb.AppendLine("Device complies with ANSI INCITS 352-2002 (FC-PI)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-PI", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_PI2: //0x0DE0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCPI2Mask.NoVersion: sb.AppendLine("Device complies with standard FC-PI-2, no version"); break; case (int)SCSIVersionDescriptorFCPI2Mask.T11_1506_r50: sb.AppendLine("Device complies with T11/1506-D revision 5.0 (FC-PI-2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-PI-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_FS2: //0x0E00 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard FC-FS-2, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-FS-2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_LS: //0x0E20 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard FC-LS, no version"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-LS", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_SP: //0x0E40 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCSPMask.NoVersion: sb.AppendLine("Device complies with standard FC-SP, no version"); break; case (int)SCSIVersionDescriptorFCSPMask.T11_1570_r16: sb.AppendLine("Device complies with T11/1570-D revision 1.6 (FC-SP)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-SP", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_DA: //0x12E0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCDAMask.NoVersion: sb.AppendLine("Device complies with standard FC-DA, no version"); break; case (int)SCSIVersionDescriptorFCDAMask.T11_1513_r31: sb.AppendLine("Device complies with T11/1513-DT revision 3.1 (FC-DA)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-DA", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_Tape: //0x1300 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCTapeMask.NoVersion: sb.AppendLine("Device complies with standard FC-Tape, no version"); break; case (int)SCSIVersionDescriptorFCTapeMask.T11_1315_r116: sb.AppendLine("Device complies with T11/1315 revision 1.16 (FC-Tape)"); break; case (int)SCSIVersionDescriptorFCTapeMask.T11_1315_r117: sb.AppendLine("Device complies with T11/1315 revision 1.17 (FC-Tape)"); break; case (int)SCSIVersionDescriptorFCTapeMask.ANSI_1999: sb.AppendLine("Device complies with ANSI NCITS TR-24:1999 (FC-Tape)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-Tape", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_FLA: //0x1320 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCFLAMask.NoVersion: sb.AppendLine("Device complies with standard FC-FLA, no version"); break; case (int)SCSIVersionDescriptorFCFLAMask.T11_1235_r7: sb.AppendLine("Device complies with T11/1235 revision 7 (FC-FLA)"); break; case (int)SCSIVersionDescriptorFCFLAMask.ANSI_1998: sb.AppendLine("Device complies with ANSI NCITS TR-20:1998 (FC-FLA)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-FLA", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.FC_PLDA: //0x1340 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorFCPLDAMask.NoVersion: sb.AppendLine("Device complies with standard FC-PLDA, no version"); break; case (int)SCSIVersionDescriptorFCPLDAMask.T11_1162_r21: sb.AppendLine("Device complies with T11/1162 revision 2.1 (FC-PLDA)"); break; case (int)SCSIVersionDescriptorFCPLDAMask.ANSI_1998: sb.AppendLine("Device complies with ANSI NCITS TR-19:1998 (FC-PLDA)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard FC-PLDA", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SSA_PH2: //0x1360 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSSAPH2Mask.NoVersion: sb.AppendLine("Device complies with standard SSA-PH2, no version"); break; case (int)SCSIVersionDescriptorSSAPH2Mask.T10_1145_r09c: sb.AppendLine("Device complies with T10.1/1145 revision 09c (SSA-PH2)"); break; case (int)SCSIVersionDescriptorSSAPH2Mask.ANSI_1996: sb.AppendLine("Device complies with ANSI X3.293:1996 (SSA-PH2)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SSA-PH2", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SSA_PH3: //0x1380 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorSSAPH3Mask.NoVersion: sb.AppendLine("Device complies with standard SSA-PH3, no version"); break; case (int)SCSIVersionDescriptorSSAPH3Mask.T10_1146_r05b: sb.AppendLine("Device complies with T10.1/1146 revision 05b (SSA-PH3)"); break; case (int)SCSIVersionDescriptorSSAPH3Mask.ANSI_1998: sb.AppendLine("Device complies with ANSI NCITS.307:1998 (SSA-PH3)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SSA-PH3", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.IEEE1394: //0x14A0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorIEEE1394Mask.NoVersion: sb.AppendLine("Device complies with standard IEEE-1394, no version"); break; case (int)SCSIVersionDescriptorIEEE1394Mask.ANSI_1995: sb.AppendLine("Device complies with ANSI IEEE 1394:1995"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard IEEE-1394", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.IEEE1394a: //0x14C0 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard IEEE-1394a"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard IEEE-1394a", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.IEEE1394b: //0x14E0 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard IEEE-1394b"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard IEEE-1394b", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.ATA_ATAPI6: //0x15E0 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorATA6Mask.NoVersion: sb.AppendLine("Device complies with standard ATA/ATAPI-6, no version"); break; case (int)SCSIVersionDescriptorATA6Mask.ANSI_2002: sb.AppendLine("Device complies with ANSI INCITS 361-2002 (ATA/ATAPI-6)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard ATA/ATAPI-6)", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.ATA_ATAPI7: //0x1600 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorATA7Mask.NoVersion: sb.AppendLine("Device complies with standard ATA/ATAPI-7, no version"); break; case (int)SCSIVersionDescriptorATA7Mask.T13_1532_r3: sb.AppendLine("Device complies with T13/1532-D revision 3 (ATA/ATAPI-7)"); break; case (int)SCSIVersionDescriptorATA7Mask.ANSI_2005: sb.AppendLine("Device complies with ANSI INCITS 397-2005 (ATA/ATAPI-7)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard ATA/ATAPI-7", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.ATA_ATAPI8: //0x1620 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorATA8Mask.ATA8_AAM: sb.AppendLine("Device complies with standard ATA8-AAM Architecture Model (no version claimed)"); break; case (int)SCSIVersionDescriptorATA8Mask.ATA8_PT: sb.AppendLine("Device complies with standard ATA8-PT Parallel Transport (no version claimed)"); break; case (int)SCSIVersionDescriptorATA8Mask.ATA8_AST: sb.AppendLine("Device complies with standard ATA8-AST Serial Transport (no version claimed)"); break; case (int)SCSIVersionDescriptorATA8Mask.ATA8_ACS: sb.AppendLine("Device complies with standard ATA8-ACS ATA/ATAPI Command Set (no version claimed)"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard ATA/ATAPI-8", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.USB: //0x1720 switch (VersionDescriptor & 0x001F) { case (int)SCSIVersionDescriptorUSBMask.NoVersion: sb.AppendLine("Device complies with Universal Serial Bus specification, no revision claimed"); break; case (int)SCSIVersionDescriptorUSBMask.USB11: sb.AppendLine("Device complies with Universal Serial Bus Specification, Revision 1.1"); break; case (int)SCSIVersionDescriptorUSBMask.USB20: sb.AppendLine("Device complies with Universal Serial Bus Specification, Revision 2.0"); break; case (int)SCSIVersionDescriptorUSBMask.USB_MSC_BULK: sb.AppendLine("Device complies with Universal Serial Bus Mass Storage Class Bulk-Only Transport, Revision 1.0"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard ", VersionDescriptor & 0x001F).AppendLine(); break; } break; case (int)SCSIVersionDescriptorStandardMask.SAT: //0x1EA0 switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendLine("Device complies with standard SAT"); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of standard SAT", VersionDescriptor & 0x001F).AppendLine(); break; } break; default: switch (VersionDescriptor & 0x001F) { case 0x00: sb.AppendFormat("Device complies with unknown standard 0x:{0:X4}", VersionDescriptor & 0x001F).AppendLine(); break; default: sb.AppendFormat("Device claims unknown version 0x{0:X2} of unknown standard 0x:{1:X4}", VersionDescriptor & 0x001F, VersionDescriptor & 0x001F).AppendLine(); break; } break; } } //if (MainClass.isDebug) { sb.AppendFormat("DEBUG (SCSIInquiry Decoder): Reserved byte 1, bits 6 to 0 = 0x{0:X2}", response.Reserved1).AppendLine(); sb.AppendFormat("DEBUG (SCSIInquiry Decoder): Reserved byte 5, bits 2 to 1 = 0x{0:X2}", response.Reserved2).AppendLine(); sb.AppendFormat("DEBUG (SCSIInquiry Decoder): Reserved byte 56, bits 7 to 4 = 0x{0:X2}", response.Reserved3).AppendLine(); sb.AppendFormat("DEBUG (SCSIInquiry Decoder): Reserved byte 57 = 0x{0:X2}", response.Reserved4).AppendLine(); if (response.Reserved5 != null) { sb.AppendLine("DEBUG (SCSIInquiry Decoder): Reserved bytes 74 to 95"); sb.AppendLine("============================================================"); sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.Reserved5, 60)); sb.AppendLine("============================================================"); } if (response.VendorSpecific != null) { sb.AppendLine("DEBUG (SCSIInquiry Decoder): Vendor-specific bytes 36 to 55"); sb.AppendLine("============================================================"); sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.VendorSpecific, 60)); sb.AppendLine("============================================================"); } if (response.VendorSpecific2 != null) { sb.AppendFormat("DEBUG (SCSIInquiry Decoder): Vendor-specific bytes 96 to {0}", response.AdditionalLength+4).AppendLine(); sb.AppendLine("============================================================"); sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.VendorSpecific2, 60)); sb.AppendLine("============================================================"); } } return sb.ToString(); } public static string PrettifySCSIInquiry(byte[] SCSIInquiryResponse) { SCSIInquiry? decoded = DecodeSCSIInquiry(SCSIInquiryResponse); return PrettifySCSIInquiry(decoded); } #endregion Public methods #region Public structures // SCSI INQUIRY command response public struct SCSIInquiry { /// /// Peripheral qualifier /// Byte 0, bits 7 to 5 /// public byte PeripheralQualifier; /// /// Peripheral device type /// Byte 0, bits 4 to 0 /// public byte PeripheralDeviceType; /// /// Removable device /// Byte 1, bit 7 /// public bool RMB; /// /// Reserved /// Byte 1, bits 6 to 0 /// public byte Reserved1; /// /// ISO/IEC SCSI Standard Version /// Byte 2, bits 7 to 6, mask = 0xC0, >> 6 /// public byte ISOVersion; /// /// ECMA SCSI Standard Version /// Byte 2, bits 5 to 3, mask = 0x38, >> 3 /// public byte ECMAVersion; /// /// ANSI SCSI Standard Version /// Byte 2, bits 2 to 0, mask = 0x07 /// public byte ANSIVersion; /// /// Asynchronous Event Reporting Capability supported /// Byte 3, bit 7 /// public bool AERC; /// /// Device supports TERMINATE TASK command /// Byte 3, bit 6 /// public bool TrmTsk; /// /// Supports setting Normal ACA /// Byte 3, bit 5 /// public bool NormACA; /// /// Supports LUN hierarchical addressing /// Byte 3, bit 4 /// public bool HiSup; /// /// Responde data format /// Byte 3, bit 3 to 0 /// public byte ResponseDataFormat; /// /// Lenght of total INQUIRY response minus 4 /// Byte 4 /// public byte AdditionalLength; /// /// Device contains an embedded storage array controller /// Byte 5, bit 7 /// public bool SCCS; /// /// Device contains an Access Control Coordinator /// Byte 5, bit 6 /// public bool ACC; /// /// Supports asymetrical logical unit access /// Byte 5, bits 5 to 4 /// public byte TPGS; /// /// Supports third-party copy commands /// Byte 5, bit 3 /// public bool ThreePC; /// /// Reserved /// Byte 5, bits 2 to 1 /// public byte Reserved2; /// /// Supports protection information /// Byte 5, bit 0 /// public bool Protect; /// /// Supports basic queueing /// Byte 6, bit 7 /// public bool BQue; /// /// Device contains an embedded enclosure services component /// Byte 6, bit 6 /// public bool EncServ; /// /// Vendor-specific /// Byte 6, bit 5 /// public bool VS1; /// /// Multi-port device /// Byte 6, bit 4 /// public bool MultiP; /// /// Device contains or is attached to a medium changer /// Byte 6, bit 3 /// public bool MChngr; /// /// Device supports request and acknowledge handshakes /// Byte 6, bit 2 /// public bool ACKREQQ; /// /// Supports 32-bit wide SCSI addresses /// Byte 6, bit 1 /// public bool Addr32; /// /// Supports 16-bit wide SCSI addresses /// Byte 6, bit 0 /// public bool Addr16; /// /// Device supports relative addressing /// Byte 7, bit 7 /// public bool RelAddr; /// /// Supports 32-bit wide data transfers /// Byte 7, bit 6 /// public bool WBus32; /// /// Supports 16-bit wide data transfers /// Byte 7, bit 5 /// public bool WBus16; /// /// Supports synchronous data transfer /// Byte 7, bit 4 /// public bool Sync; /// /// Supports linked commands /// Byte 7, bit 3 /// public bool Linked; /// /// Supports CONTINUE TASK and TARGET TRANSFER DISABLE commands /// Byte 7, bit 2 /// public bool TranDis; /// /// Supports TCQ queue /// Byte 7, bit 1 /// public bool CmdQue; /// /// Vendor-specific /// Byte 7, bit 0 /// public bool VS2; /// /// Vendor identification /// Bytes 8 to 15 /// public byte[] VendorIdentification; /// /// Product identification /// Bytes 16 to 31 /// public byte[] ProductIdentification; /// /// Product revision level /// Bytes 32 to 35 /// public byte[] ProductRevisionLevel; /// /// Vendor-specific data /// Bytes 36 to 55 /// public byte[] VendorSpecific; /// /// Byte 56, bits 7 to 4 /// public byte Reserved3; /// /// Supported SPI clocking /// Byte 56, bits 3 to 2 /// public byte Clocking; /// /// Device supports Quick Arbitration and Selection /// Byte 56, bit 1 /// public bool QAS; /// /// Supports information unit transfers /// Byte 56, bit 0 /// public bool IUS; /// /// Reserved /// Byte 57 /// public byte Reserved4; /// /// Array of version descriptors /// Bytes 58 to 73 /// public UInt16[] VersionDescriptors; /// /// Reserved /// Bytes 74 to 95 /// public byte[] Reserved5; /// /// Reserved /// Bytes 96 to end /// public byte[] VendorSpecific2; } #endregion Public structures } }