Files
Aaru/SCSI/EVPD.cs

2386 lines
97 KiB
C#
Raw Normal View History

2017-05-19 20:28:49 +01:00
// /***************************************************************************
2020-02-27 12:31:23 +00:00
// Aaru Data Preservation Suite
2015-10-19 04:32:16 +01:00
// ----------------------------------------------------------------------------
//
// Filename : EVPD.cs
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
// Author(s) : Natalia Portillo <claunia@claunia.com>
2015-10-19 04:32:16 +01:00
//
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
// Component : Device structures decoders.
2015-10-19 04:32:16 +01:00
//
// --[ Description ] ----------------------------------------------------------
//
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
// Decodes SCSI EVPDs.
2015-10-19 04:32:16 +01:00
//
// --[ License ] --------------------------------------------------------------
//
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
2015-10-19 04:32:16 +01:00
// License, or (at your option) any later version.
//
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
// This library 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
// Lesser General Public License for more details.
2015-10-19 04:32:16 +01:00
//
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
2015-10-19 04:32:16 +01:00
//
// ----------------------------------------------------------------------------
2020-01-03 17:51:28 +00:00
// Copyright © 2011-2020 Natalia Portillo
2015-10-19 04:32:16 +01:00
// ****************************************************************************/
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
2015-10-19 04:32:16 +01:00
using System;
2016-10-13 04:55:00 +01:00
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
2016-10-13 20:28:08 +01:00
using System.Linq;
2016-10-16 07:29:19 +01:00
using System.Text;
using System.Text.RegularExpressions;
2020-02-27 00:33:24 +00:00
using Aaru.CommonTypes.Structs.Devices.ATA;
using Aaru.CommonTypes.Structs.Devices.SCSI;
2015-10-19 04:32:16 +01:00
2020-02-27 00:33:24 +00:00
namespace Aaru.Decoders.SCSI
2015-10-19 04:32:16 +01:00
{
2019-11-25 00:54:38 +00:00
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
SuppressMessage("ReSharper", "MemberCanBePrivate.Global"), SuppressMessage("ReSharper", "NotAccessedField.Global"),
SuppressMessage("ReSharper", "UnassignedField.Global")]
2015-10-19 04:32:16 +01:00
public static class EVPD
{
2019-11-25 00:54:38 +00:00
/// <summary>Decodes VPD page 0x00: Supported VPD pages</summary>
2015-10-19 04:32:16 +01:00
/// <returns>A byte array containing all supported VPD pages.</returns>
/// <param name="page">Page 0x00.</param>
public static byte[] DecodePage00(byte[] page)
{
2019-11-25 00:54:38 +00:00
if(page?[1] != 0)
return null;
2015-10-19 04:32:16 +01:00
2019-11-25 00:54:38 +00:00
if(page.Length != page[3] + 4)
return null;
2015-10-19 04:32:16 +01:00
byte[] decoded = new byte[page.Length - 4];
Array.Copy(page, 4, decoded, 0, page.Length - 4);
return decoded;
}
2019-11-25 00:54:38 +00:00
/// <summary>Decides VPD pages 0x01 to 0x7F: ASCII Information</summary>
2015-10-19 04:32:16 +01:00
/// <returns>An ASCII string with the contents of the page.</returns>
/// <param name="page">Page 0x01-0x7F.</param>
public static string DecodeASCIIPage(byte[] page)
{
2019-11-25 00:54:38 +00:00
if(page == null)
return null;
2015-10-19 04:32:16 +01:00
2019-11-25 00:54:38 +00:00
if(page[1] == 0 ||
page[1] > 0x7F)
return null;
2015-10-19 04:32:16 +01:00
2019-11-25 00:54:38 +00:00
if(page.Length != page[3] + 4)
return null;
2015-10-19 04:32:16 +01:00
byte[] ascii = new byte[page[4]];
Array.Copy(page, 5, ascii, 0, page[4]);
return StringHandlers.CToString(ascii);
}
2019-11-25 00:54:38 +00:00
/// <summary>Decodes VPD page 0x80: Unit Serial Number</summary>
2015-10-19 04:32:16 +01:00
/// <returns>The unit serial number.</returns>
/// <param name="page">Page 0x80.</param>
public static string DecodePage80(byte[] page)
{
2019-11-25 00:54:38 +00:00
if(page?[1] != 0x80)
return null;
2015-10-19 04:32:16 +01:00
2019-11-25 00:54:38 +00:00
if(page.Length != page[3] + 4)
return null;
2015-10-19 04:32:16 +01:00
byte[] ascii = new byte[page.Length - 4];
Array.Copy(page, 4, ascii, 0, page.Length - 4);
return StringHandlers.CToString(ascii);
}
2016-10-13 04:01:39 +01:00
2019-11-25 00:54:38 +00:00
/// <summary>Decodes VPD page 0x82: ASCII implemented operating definition</summary>
/// <returns>ASCII implemented operating definition.</returns>
/// <param name="page">Page 0x82.</param>
public static string DecodePage82(byte[] page)
{
if(page?[1] != 0x82)
return null;
if(page.Length != page[3] + 4)
return null;
byte[] ascii = new byte[page.Length - 4];
Array.Copy(page, 4, ascii, 0, page.Length - 4);
return StringHandlers.CToString(ascii);
}
#region EVPD Page 0xB1: Manufacturer-assigned Serial Number page
public static string DecodePageB1(byte[] page)
{
if(page?[1] != 0xB1)
return null;
if(page.Length != page[3] + 4)
return null;
byte[] ascii = new byte[page.Length - 4];
Array.Copy(page, 4, ascii, 0, page.Length - 4);
return StringHandlers.CToString(ascii).Trim();
}
#endregion EVPD Page 0xB1: Manufacturer-assigned Serial Number page
#region EVPD Page 0xB2: TapeAlert Supported Flags page
public static ulong DecodePageB2(byte[] page)
{
if(page?[1] != 0xB2)
return 0;
if(page.Length != 12)
return 0;
byte[] bitmap = new byte[8];
Array.Copy(page, 4, bitmap, 0, 8);
return BitConverter.ToUInt64(bitmap.Reverse().ToArray(), 0);
}
#endregion EVPD Page 0xB2: TapeAlert Supported Flags page
#region EVPD Page 0xB3: Automation Device Serial Number page
public static string DecodePageB3(byte[] page)
{
if(page?[1] != 0xB3)
return null;
if(page.Length != page[3] + 4)
return null;
byte[] ascii = new byte[page.Length - 4];
Array.Copy(page, 4, ascii, 0, page.Length - 4);
return StringHandlers.CToString(ascii).Trim();
}
#endregion EVPD Page 0xB3: Automation Device Serial Number page
#region EVPD Page 0xB4: Data Transfer Device Element Address page
public static string DecodePageB4(byte[] page)
{
if(page?[1] != 0xB3)
return null;
if(page.Length != page[3] + 4)
return null;
byte[] element = new byte[page.Length - 4];
var sb = new StringBuilder();
foreach(byte b in element)
sb.AppendFormat("{0:X2}", b);
return sb.ToString();
}
#endregion EVPD Page 0xB4: Data Transfer Device Element Address page
#region EVPD Page 0x81: Implemented operating definition page
2019-11-25 00:54:38 +00:00
/// <summary>Implemented operating definition page Page code 0x81</summary>
public struct Page_81
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
public byte PageLength;
2019-11-25 00:54:38 +00:00
/// <summary>Current operating definition</summary>
public ScsiDefinitions Current;
2019-11-25 00:54:38 +00:00
/// <summary>Default operating definition</summary>
public ScsiDefinitions Default;
2019-11-25 00:54:38 +00:00
/// <summary>Support operating definition list</summary>
public ScsiDefinitions[] Supported;
}
public static Page_81? DecodePage_81(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0x81)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse[3] + 4 != pageResponse.Length)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse.Length < 6)
return null;
2019-11-25 00:54:38 +00:00
var decoded = new Page_81
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
2019-11-25 00:54:38 +00:00
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
PageLength = (byte)(pageResponse[3] + 4), Current = (ScsiDefinitions)(pageResponse[4] & 0x7F),
Default = (ScsiDefinitions)(pageResponse[5] & 0x7F)
};
2018-06-22 08:08:38 +01:00
int position = 6;
List<ScsiDefinitions> definitions = new List<ScsiDefinitions>();
while(position < pageResponse.Length)
{
2019-11-25 00:54:38 +00:00
var definition = (ScsiDefinitions)(pageResponse[position] & 0x7F);
position++;
definitions.Add(definition);
}
decoded.Supported = definitions.ToArray();
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_81(byte[] pageResponse) => PrettifyPage_81(DecodePage_81(pageResponse));
public static string DefinitionToString(ScsiDefinitions definition)
{
switch(definition)
{
2019-11-25 00:54:38 +00:00
case ScsiDefinitions.Current: return"";
case ScsiDefinitions.CCS: return"CCS";
case ScsiDefinitions.SCSI1: return"SCSI-1";
case ScsiDefinitions.SCSI2: return"SCSI-2";
case ScsiDefinitions.SCSI3: return"SCSI-3";
default: return$"Unknown definition code {(byte)definition}";
}
}
public static string PrettifyPage_81(Page_81? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2019-11-25 00:54:38 +00:00
Page_81 page = modePage.Value;
var sb = new StringBuilder();
sb.AppendLine("SCSI Implemented operating definitions:");
sb.AppendFormat("\tDefault operating definition: {0}", DefinitionToString(page.Current)).AppendLine();
sb.AppendFormat("\tCurrent operating definition: {0}", DefinitionToString(page.Current)).AppendLine();
if(page.Supported.Length == 0)
{
sb.AppendLine("\tThere are no supported definitions");
2019-11-25 00:54:38 +00:00
return sb.ToString();
}
sb.AppendLine("\tSupported operating definitions:");
2019-11-25 00:54:38 +00:00
foreach(ScsiDefinitions definition in page.Supported)
sb.AppendFormat("\t\t{0}", DefinitionToString(definition)).AppendLine();
return sb.ToString();
}
#endregion EVPD Page 0x81: Implemented operating definition page
2016-10-13 04:55:00 +01:00
#region EVPD Page 0x83: Device identification page
2016-10-13 05:49:11 +01:00
public enum IdentificationAssociation : byte
{
2019-11-25 00:54:38 +00:00
/// <summary>Identifier field is associated with the addressed logical unit</summary>
LogicalUnit = 0,
/// <summary>Identifier field is associated with the target port</summary>
TargetPort = 1,
/// <summary>Identifier field is associated with the target device that contains the LUN</summary>
2016-10-13 05:49:11 +01:00
TargetDevice = 2
}
2016-10-13 04:55:00 +01:00
public enum IdentificationCodeSet : byte
{
2019-11-25 00:54:38 +00:00
/// <summary>Identifier is binary</summary>
Binary = 1,
/// <summary>Identifier is pure ASCII</summary>
ASCII = 2,
/// <summary>Identifier is in UTF-8</summary>
2016-10-13 05:49:11 +01:00
UTF8 = 3
2016-10-13 04:55:00 +01:00
}
public enum IdentificationTypes : byte
{
2019-11-25 00:54:38 +00:00
/// <summary>No assignment authority was used and there is no guarantee the identifier is unique</summary>
NoAuthority = 0,
/// <summary>Concatenates vendor and product identifier from INQUIRY plus unit serial number from page 80h</summary>
Inquiry = 1,
/// <summary>Identifier is a 64-bit IEEE EUI-64, or extended</summary>
EUI = 2,
/// <summary>Identifier is compatible with 64-bit FC-PH Name_Identifier</summary>
NAA = 3,
/// <summary>Identifier to relative port in device</summary>
Relative = 4,
/// <summary>Identifier to group of target ports in device</summary>
TargetPortGroup = 5,
/// <summary>Identifier to group of target LUNs in device</summary>
LogicalUnitGroup = 6,
/// <summary>MD5 of device identification values</summary>
MD5 = 7,
/// <summary>SCSI name string</summary>
SCSI = 8,
/// <summary>Protocol specific port identifier</summary>
2016-10-13 05:49:11 +01:00
ProtocolSpecific = 9
2016-10-13 04:55:00 +01:00
}
public struct IdentificatonDescriptor
{
2019-11-25 00:54:38 +00:00
/// <summary>Protocol identifier</summary>
2016-10-13 05:49:11 +01:00
public ProtocolIdentifiers ProtocolIdentifier;
2019-11-25 00:54:38 +00:00
/// <summary>Defines how the identifier is stored</summary>
2016-10-13 04:55:00 +01:00
public IdentificationCodeSet CodeSet;
2019-11-25 00:54:38 +00:00
/// <summary>Set if protocol identifier is valid</summary>
2016-10-13 05:49:11 +01:00
public bool PIV;
2019-11-25 00:54:38 +00:00
/// <summary>Identifies which decide the identifier associates with</summary>
2016-10-13 05:49:11 +01:00
public IdentificationAssociation Association;
2019-11-25 00:54:38 +00:00
/// <summary>Defines the type of the identifier</summary>
2016-10-13 04:55:00 +01:00
public IdentificationTypes Type;
2019-11-25 00:54:38 +00:00
/// <summary>Length of the identifier</summary>
2016-10-13 04:55:00 +01:00
public byte Length;
2019-11-25 00:54:38 +00:00
/// <summary>Identifier as a string if applicable</summary>
2016-10-13 04:55:00 +01:00
public string ASCII;
2019-11-25 00:54:38 +00:00
/// <summary>Binary identifier</summary>
2016-10-13 04:55:00 +01:00
public byte[] Binary;
}
2019-11-25 00:54:38 +00:00
/// <summary>Device identification page Page code 0x83</summary>
2016-10-13 04:55:00 +01:00
public struct Page_83
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
2016-10-13 04:55:00 +01:00
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
2016-10-13 04:55:00 +01:00
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
2016-10-13 04:55:00 +01:00
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
2016-10-13 04:55:00 +01:00
public byte PageLength;
2019-11-25 00:54:38 +00:00
/// <summary>The descriptors.</summary>
2016-10-13 04:55:00 +01:00
public IdentificatonDescriptor[] Descriptors;
}
public static Page_83? DecodePage_83(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0x83)
return null;
2016-10-13 04:55:00 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse[3] + 4 != pageResponse.Length)
return null;
2016-10-13 04:55:00 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse.Length < 6)
return null;
2016-10-13 04:55:00 +01:00
2019-11-25 00:54:38 +00:00
var decoded = new Page_83
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2018-06-22 08:08:38 +01:00
PageLength = (byte)(pageResponse[3] + 4)
};
2016-10-13 04:55:00 +01:00
2018-06-22 08:08:38 +01:00
int position = 4;
2016-10-13 04:55:00 +01:00
List<IdentificatonDescriptor> descriptors = new List<IdentificatonDescriptor>();
while(position < pageResponse.Length)
{
2019-11-25 00:54:38 +00:00
var descriptor = new IdentificatonDescriptor
{
ProtocolIdentifier = (ProtocolIdentifiers)((pageResponse[position] & 0xF0) >> 4),
2018-06-22 08:08:38 +01:00
CodeSet = (IdentificationCodeSet)(pageResponse[position] & 0x0F),
PIV = (pageResponse[position + 1] & 0x80) == 0x80,
Association = (IdentificationAssociation)((pageResponse[position + 1] & 0x30) >> 4),
Type = (IdentificationTypes)(pageResponse[position + 1] & 0x0F),
Length = pageResponse[position + 3]
};
2019-11-25 00:54:38 +00:00
2016-10-13 04:55:00 +01:00
descriptor.Binary = new byte[descriptor.Length];
2019-11-25 00:54:38 +00:00
if(descriptor.Length + position + 4 >= pageResponse.Length)
descriptor.Length = (byte)(pageResponse.Length - position - 4);
2019-11-25 00:54:38 +00:00
2016-10-13 04:55:00 +01:00
Array.Copy(pageResponse, position + 4, descriptor.Binary, 0, descriptor.Length);
2019-11-25 00:54:38 +00:00
switch(descriptor.CodeSet)
{
case IdentificationCodeSet.ASCII:
descriptor.ASCII = StringHandlers.CToString(descriptor.Binary);
2019-11-25 00:54:38 +00:00
break;
case IdentificationCodeSet.UTF8:
descriptor.ASCII = Encoding.UTF8.GetString(descriptor.Binary);
2019-11-25 00:54:38 +00:00
break;
default:
descriptor.ASCII = "";
2019-11-25 00:54:38 +00:00
break;
}
2016-10-13 04:55:00 +01:00
position += 4 + descriptor.Length;
2016-10-13 05:49:11 +01:00
descriptors.Add(descriptor);
2016-10-13 04:55:00 +01:00
}
2016-10-13 05:49:11 +01:00
decoded.Descriptors = descriptors.ToArray();
2016-10-13 04:55:00 +01:00
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_83(byte[] pageResponse) => PrettifyPage_83(DecodePage_83(pageResponse));
2016-10-13 04:55:00 +01:00
public static string PrettifyPage_83(Page_83? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2016-10-13 04:55:00 +01:00
2019-11-25 00:54:38 +00:00
Page_83 page = modePage.Value;
var sb = new StringBuilder();
2016-10-13 04:55:00 +01:00
2016-10-13 05:49:11 +01:00
sb.AppendLine("SCSI Device identification:");
2016-10-13 04:55:00 +01:00
if(page.Descriptors.Length == 0)
{
sb.AppendLine("\tThere are no identifiers");
2019-11-25 00:54:38 +00:00
2016-10-13 04:55:00 +01:00
return sb.ToString();
}
foreach(IdentificatonDescriptor descriptor in page.Descriptors)
{
2016-10-13 05:49:11 +01:00
switch(descriptor.Association)
{
case IdentificationAssociation.LogicalUnit:
sb.AppendLine("\tIdentifier belongs to addressed logical unit");
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case IdentificationAssociation.TargetPort:
sb.AppendLine("\tIdentifier belongs to target port");
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case IdentificationAssociation.TargetDevice:
sb.AppendLine("\tIdentifier belongs to target device that contains the addressed logical unit");
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
default:
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tIndentifier has unknown association with code {0}",
(byte)descriptor.Association).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
}
if(descriptor.PIV)
{
2017-12-21 16:07:20 +00:00
string protocol;
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
switch(descriptor.ProtocolIdentifier)
{
case ProtocolIdentifiers.ADT:
protocol = "Automation/Drive Interface Transport";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.ATA:
protocol = "AT Attachment Interface (ATA/ATAPI)";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.FibreChannel:
protocol = "Fibre Channel";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.Firewire:
protocol = "IEEE 1394";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.iSCSI:
protocol = "Internet SCSI";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.NoProtocol:
protocol = "no specific";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.PCIe:
protocol = "PCI Express";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.RDMAP:
protocol = "SCSI Remote Direct Memory Access";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.SAS:
protocol = "Serial Attachment SCSI";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.SCSI:
protocol = "Parallel SCSI";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.SCSIe:
protocol = "SCSI over PCI Express";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.SSA:
protocol = "SSA";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case ProtocolIdentifiers.UAS:
protocol = "USB Attached SCSI";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
default:
protocol = $"unknown code {(byte)descriptor.ProtocolIdentifier}";
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
}
2017-12-19 20:33:03 +00:00
2016-10-13 05:49:11 +01:00
sb.AppendFormat("\tDescriptor referes to {0} protocol", protocol).AppendLine();
}
2016-10-13 04:55:00 +01:00
switch(descriptor.Type)
{
case IdentificationTypes.NoAuthority:
switch(descriptor.CodeSet)
{
case IdentificationCodeSet.ASCII:
case IdentificationCodeSet.UTF8:
sb.AppendFormat("\tVendor descriptor contains: {0}", descriptor.ASCII).AppendLine();
2019-11-25 00:54:38 +00:00
break;
case IdentificationCodeSet.Binary:
sb.AppendFormat("\tVendor descriptor contains binary data (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).AppendLine();
2019-11-25 00:54:38 +00:00
break;
default:
sb.AppendFormat("\tVendor descriptor contains unknown kind {1} of data (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40),
(byte)descriptor.CodeSet).AppendLine();
2019-11-25 00:54:38 +00:00
break;
}
2016-10-13 04:55:00 +01:00
break;
case IdentificationTypes.Inquiry:
switch(descriptor.CodeSet)
{
case IdentificationCodeSet.ASCII:
case IdentificationCodeSet.UTF8:
sb.AppendFormat("\tInquiry descriptor contains: {0}", descriptor.ASCII).AppendLine();
2019-11-25 00:54:38 +00:00
break;
case IdentificationCodeSet.Binary:
sb.AppendFormat("\tInquiry descriptor contains binary data (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).AppendLine();
2019-11-25 00:54:38 +00:00
break;
default:
sb.AppendFormat("\tInquiry descriptor contains unknown kind {1} of data (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40),
(byte)descriptor.CodeSet).AppendLine();
2019-11-25 00:54:38 +00:00
break;
}
2016-10-13 04:55:00 +01:00
break;
case IdentificationTypes.EUI:
2017-12-19 20:33:03 +00:00
if(descriptor.CodeSet == IdentificationCodeSet.ASCII ||
descriptor.CodeSet == IdentificationCodeSet.UTF8)
2016-10-13 05:49:11 +01:00
sb.AppendFormat("\tIEEE EUI-64: {0}", descriptor.ASCII).AppendLine();
else
{
sb.AppendFormat("\tIEEE EUI-64: {0:X2}", descriptor.Binary[0]);
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
for(int i = 1; i < descriptor.Binary.Length; i++)
sb.AppendFormat(":{0:X2}", descriptor.Binary[i]);
2017-12-19 20:33:03 +00:00
2016-10-13 05:49:11 +01:00
sb.AppendLine();
}
2017-12-19 20:33:03 +00:00
2016-10-13 05:49:11 +01:00
break;
case IdentificationTypes.NAA:
2017-12-19 20:33:03 +00:00
if(descriptor.CodeSet == IdentificationCodeSet.ASCII ||
descriptor.CodeSet == IdentificationCodeSet.UTF8)
2016-10-13 05:49:11 +01:00
sb.AppendFormat("\tNAA: {0}", descriptor.ASCII).AppendLine();
2016-10-13 04:55:00 +01:00
else
2016-10-13 05:49:11 +01:00
{
sb.AppendFormat("\tNAA: {0:X2}", descriptor.Binary[0]);
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
for(int i = 1; i < descriptor.Binary.Length; i++)
sb.AppendFormat(":{0:X2}", descriptor.Binary[i]);
2017-12-19 20:33:03 +00:00
2016-10-13 05:49:11 +01:00
sb.AppendLine();
}
2017-12-19 20:33:03 +00:00
2016-10-13 04:55:00 +01:00
break;
2016-10-13 05:49:11 +01:00
case IdentificationTypes.Relative:
2017-12-19 20:33:03 +00:00
if(descriptor.CodeSet == IdentificationCodeSet.ASCII ||
descriptor.CodeSet == IdentificationCodeSet.UTF8)
2016-10-13 05:49:11 +01:00
sb.AppendFormat("\tRelative target port identifier: {0}", descriptor.ASCII).AppendLine();
2016-10-13 04:55:00 +01:00
else
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tRelative target port identifier: {0}",
(descriptor.Binary[2] << 8) + descriptor.Binary[3]).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case IdentificationTypes.TargetPortGroup:
2017-12-19 20:33:03 +00:00
if(descriptor.CodeSet == IdentificationCodeSet.ASCII ||
descriptor.CodeSet == IdentificationCodeSet.UTF8)
2016-10-13 05:49:11 +01:00
sb.AppendFormat("\tTarget group identifier: {0}", descriptor.ASCII).AppendLine();
else
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tTarget group identifier: {0}",
(descriptor.Binary[2] << 8) + descriptor.Binary[3]).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case IdentificationTypes.LogicalUnitGroup:
2017-12-19 20:33:03 +00:00
if(descriptor.CodeSet == IdentificationCodeSet.ASCII ||
descriptor.CodeSet == IdentificationCodeSet.UTF8)
2016-10-13 05:49:11 +01:00
sb.AppendFormat("\tLogical unit group identifier: {0}", descriptor.ASCII).AppendLine();
else
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tLogical unit group identifier: {0}",
(descriptor.Binary[2] << 8) + descriptor.Binary[3]).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case IdentificationTypes.MD5:
2017-12-19 20:33:03 +00:00
if(descriptor.CodeSet == IdentificationCodeSet.ASCII ||
descriptor.CodeSet == IdentificationCodeSet.UTF8)
2016-10-13 05:49:11 +01:00
sb.AppendFormat("\tMD5 logical unit identifier: {0}", descriptor.ASCII).AppendLine();
else
{
sb.AppendFormat("\tMD5 logical unit identifier: {0:x2}", descriptor.Binary[0]);
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
for(int i = 1; i < descriptor.Binary.Length; i++)
sb.AppendFormat("{0:x2}", descriptor.Binary[i]);
2017-12-19 20:33:03 +00:00
2016-10-13 05:49:11 +01:00
sb.AppendLine();
}
2017-12-19 20:33:03 +00:00
2016-10-13 05:49:11 +01:00
break;
case IdentificationTypes.SCSI:
2017-12-19 20:33:03 +00:00
if(descriptor.CodeSet == IdentificationCodeSet.ASCII ||
descriptor.CodeSet == IdentificationCodeSet.UTF8)
2016-10-13 05:49:11 +01:00
sb.AppendFormat("\tSCSI name string identifier: {0}", descriptor.ASCII).AppendLine();
else
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tSCSI name string identifier (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 05:49:11 +01:00
break;
case IdentificationTypes.ProtocolSpecific:
2017-12-19 20:33:03 +00:00
{
if(descriptor.PIV)
switch(descriptor.ProtocolIdentifier)
2016-10-13 05:49:11 +01:00
{
2017-12-19 20:33:03 +00:00
case ProtocolIdentifiers.ADT:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (Automation/Drive Interface Transport) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.ATA:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (ATA/ATAPI) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.FibreChannel:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (Fibre Channel) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.Firewire:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (IEEE 1394) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.iSCSI:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (Internet SCSI) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.NoProtocol:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (unknown) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.PCIe:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (PCI Express) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.RDMAP:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (SCSI Remote Direct Memory Access) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.SAS:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (Serial Attachment SCSI) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.SCSI:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (Parallel SCSI) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.SSA:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (SSA) specific descriptor with unknown format (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.SCSIe:
sb.AppendFormat("\tProtocol (SCSIe) specific descriptor: Routing ID is {0}",
(descriptor.Binary[0] << 8) + descriptor.Binary[1]).AppendLine();
2019-11-25 00:54:38 +00:00
2017-12-19 20:33:03 +00:00
break;
case ProtocolIdentifiers.UAS:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (UAS) specific descriptor: USB address {0} interface {1}",
2018-06-22 08:08:38 +01:00
descriptor.Binary[0] & 0x7F, descriptor.Binary[2]).AppendLine();
2019-11-25 00:54:38 +00:00
2017-12-19 20:33:03 +00:00
break;
default:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("\tProtocol (unknown code {0}) specific descriptor with unknown format (hex): {1}",
2018-06-22 08:08:38 +01:00
(byte)descriptor.ProtocolIdentifier,
2019-11-25 00:54:38 +00:00
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)).
AppendLine();
2017-12-19 20:33:03 +00:00
break;
2016-10-13 05:49:11 +01:00
}
2017-12-19 20:33:03 +00:00
}
2016-10-13 04:55:00 +01:00
break;
default:
switch(descriptor.CodeSet)
{
case IdentificationCodeSet.ASCII:
case IdentificationCodeSet.UTF8:
sb.AppendFormat("\tUnknown descriptor type {1} contains: {0}", descriptor.ASCII,
(byte)descriptor.Type).AppendLine();
2019-11-25 00:54:38 +00:00
break;
case IdentificationCodeSet.Binary:
sb.AppendFormat("\tUnknown descriptor type {1} contains binary data (hex): {0}",
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40),
(byte)descriptor.Type).AppendLine();
2019-11-25 00:54:38 +00:00
break;
default:
2019-11-25 00:54:38 +00:00
sb.
AppendFormat("Inquiry descriptor type {2} contains unknown kind {1} of data (hex): {0}",
2018-06-22 08:08:38 +01:00
PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40),
(byte)descriptor.CodeSet, (byte)descriptor.Type).AppendLine();
2019-11-25 00:54:38 +00:00
break;
}
2016-10-13 04:55:00 +01:00
break;
}
}
return sb.ToString();
}
#endregion EVPD Page 0x83: Device identification page
#region EVPD Page 0x84: Software Interface Identification page
public struct SoftwareIdentifier
{
2019-11-25 00:54:38 +00:00
/// <summary>EUI-48 identifier</summary>
public byte[] Identifier;
}
2019-11-25 00:54:38 +00:00
/// <summary>Software Interface Identification page Page code 0x84</summary>
public struct Page_84
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
public byte PageLength;
2019-11-25 00:54:38 +00:00
/// <summary>The descriptors.</summary>
public SoftwareIdentifier[] Identifiers;
}
public static Page_84? DecodePage_84(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0x84)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse[3] + 4 != pageResponse.Length)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse.Length < 10)
return null;
2019-11-25 00:54:38 +00:00
var decoded = new Page_84
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2018-06-22 08:08:38 +01:00
PageLength = (byte)(pageResponse[3] + 4)
};
2018-06-22 08:08:38 +01:00
int position = 4;
List<SoftwareIdentifier> identifiers = new List<SoftwareIdentifier>();
while(position < pageResponse.Length)
{
2019-11-25 00:54:38 +00:00
var identifier = new SoftwareIdentifier
{
Identifier = new byte[6]
};
Array.Copy(pageResponse, position, identifier.Identifier, 0, 6);
identifiers.Add(identifier);
position += 6;
}
decoded.Identifiers = identifiers.ToArray();
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_84(byte[] pageResponse) => PrettifyPage_84(DecodePage_84(pageResponse));
public static string PrettifyPage_84(Page_84? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2019-11-25 00:54:38 +00:00
Page_84 page = modePage.Value;
var sb = new StringBuilder();
sb.AppendLine("SCSI Software Interface Identifiers:");
if(page.Identifiers.Length == 0)
{
sb.AppendLine("\tThere are no identifiers");
2019-11-25 00:54:38 +00:00
return sb.ToString();
}
foreach(SoftwareIdentifier identifier in page.Identifiers)
{
sb.AppendFormat("\t{0:X2}", identifier.Identifier[0]);
2019-11-25 00:54:38 +00:00
for(int i = 1; i < identifier.Identifier.Length; i++)
2016-10-16 07:29:19 +01:00
sb.AppendFormat(":{0:X2}", identifier.Identifier[i]);
2017-12-19 20:33:03 +00:00
sb.AppendLine();
}
return sb.ToString();
}
#endregion EVPD Page 0x84: Software Interface Identification page
#region EVPD Page 0x85: Management Network Addresses page
public enum NetworkServiceTypes : byte
{
2019-11-25 00:54:38 +00:00
Unspecified = 0, StorageConf = 1, Diagnostics = 2,
Status = 3, Logging = 4, CodeDownload = 5,
CopyService = 6, Administrative = 7
}
public struct NetworkDescriptor
{
2019-11-25 00:54:38 +00:00
/// <summary>Identifies which device the identifier associates with</summary>
public IdentificationAssociation Association;
2019-11-25 00:54:38 +00:00
/// <summary>Defines the type of the identifier</summary>
public NetworkServiceTypes Type;
2019-11-25 00:54:38 +00:00
/// <summary>Length of the identifier</summary>
public ushort Length;
2019-11-25 00:54:38 +00:00
/// <summary>Binary identifier</summary>
public byte[] Address;
}
2019-11-25 00:54:38 +00:00
/// <summary>Device identification page Page code 0x85</summary>
public struct Page_85
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
public ushort PageLength;
2019-11-25 00:54:38 +00:00
/// <summary>The descriptors.</summary>
public NetworkDescriptor[] Descriptors;
}
public static Page_85? DecodePage_85(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0x85)
return null;
2019-11-25 00:54:38 +00:00
if((pageResponse[2] << 8) + pageResponse[3] + 4 != pageResponse.Length)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse.Length < 4)
return null;
2019-11-25 00:54:38 +00:00
var decoded = new Page_85
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2018-06-22 08:08:38 +01:00
PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4)
};
2018-06-22 08:08:38 +01:00
int position = 4;
List<NetworkDescriptor> descriptors = new List<NetworkDescriptor>();
while(position < pageResponse.Length)
{
2019-11-25 00:54:38 +00:00
var descriptor = new NetworkDescriptor
{
Association = (IdentificationAssociation)((pageResponse[position] & 0x60) >> 5),
2018-06-22 08:08:38 +01:00
Type = (NetworkServiceTypes)(pageResponse[position] & 0x1F),
Length = (ushort)((pageResponse[position + 2] << 8) + pageResponse[position + 3])
};
2019-11-25 00:54:38 +00:00
descriptor.Address = new byte[descriptor.Length];
Array.Copy(pageResponse, position + 4, descriptor.Address, 0, descriptor.Length);
position += 4 + descriptor.Length;
descriptors.Add(descriptor);
}
decoded.Descriptors = descriptors.ToArray();
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_85(byte[] pageResponse) => PrettifyPage_85(DecodePage_85(pageResponse));
public static string PrettifyPage_85(Page_85? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2019-11-25 00:54:38 +00:00
Page_85 page = modePage.Value;
var sb = new StringBuilder();
sb.AppendLine("SCSI Management Network Addresses:");
if(page.Descriptors.Length == 0)
{
sb.AppendLine("\tThere are no addresses");
2019-11-25 00:54:38 +00:00
return sb.ToString();
}
foreach(NetworkDescriptor descriptor in page.Descriptors)
{
switch(descriptor.Association)
{
case IdentificationAssociation.LogicalUnit:
sb.AppendLine("\tIdentifier belongs to addressed logical unit");
2019-11-25 00:54:38 +00:00
break;
case IdentificationAssociation.TargetPort:
sb.AppendLine("\tIdentifier belongs to target port");
2019-11-25 00:54:38 +00:00
break;
case IdentificationAssociation.TargetDevice:
sb.AppendLine("\tIdentifier belongs to target device that contains the addressed logical unit");
2019-11-25 00:54:38 +00:00
break;
default:
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tIndentifier has unknown association with code {0}",
(byte)descriptor.Association).AppendLine();
2019-11-25 00:54:38 +00:00
break;
}
switch(descriptor.Type)
{
case NetworkServiceTypes.CodeDownload:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("Address for code download: {0}", StringHandlers.CToString(descriptor.Address)).
AppendLine();
break;
case NetworkServiceTypes.Diagnostics:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("Address for diagnostics: {0}", StringHandlers.CToString(descriptor.Address)).
AppendLine();
break;
case NetworkServiceTypes.Logging:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("Address for logging: {0}", StringHandlers.CToString(descriptor.Address)).
AppendLine();
break;
case NetworkServiceTypes.Status:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("Address for status: {0}", StringHandlers.CToString(descriptor.Address)).
AppendLine();
break;
case NetworkServiceTypes.StorageConf:
2017-12-19 20:33:03 +00:00
sb.AppendFormat("Address for storage configuration service: {0}",
StringHandlers.CToString(descriptor.Address)).AppendLine();
2019-11-25 00:54:38 +00:00
break;
case NetworkServiceTypes.Unspecified:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("Unspecified address: {0}", StringHandlers.CToString(descriptor.Address)).
AppendLine();
break;
2016-10-13 07:02:33 +01:00
case NetworkServiceTypes.CopyService:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("Address for copy service: {0}", StringHandlers.CToString(descriptor.Address)).
AppendLine();
2016-10-13 07:02:33 +01:00
break;
case NetworkServiceTypes.Administrative:
2017-12-19 20:33:03 +00:00
sb.AppendFormat("Address for administrative configuration service: {0}",
StringHandlers.CToString(descriptor.Address)).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 07:02:33 +01:00
break;
default:
2017-12-19 20:33:03 +00:00
sb.AppendFormat("Address of unknown type {1}: {0}",
2019-11-25 00:54:38 +00:00
StringHandlers.CToString(descriptor.Address), (byte)descriptor.Type).
AppendLine();
break;
}
}
return sb.ToString();
}
#endregion EVPD Page 0x85: Management Network Addresses page
#region EVPD Page 0x86: Extended INQUIRY data page
2019-11-25 00:54:38 +00:00
/// <summary>Device identification page Page code 0x86</summary>
public struct Page_86
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
public byte PageLength;
2019-11-25 00:54:38 +00:00
/// <summary>Indicates how a device server activates microcode</summary>
public byte ActivateMicrocode;
2019-11-25 00:54:38 +00:00
/// <summary>Protection types supported by device</summary>
public byte SPT;
2019-11-25 00:54:38 +00:00
/// <summary>Checks logical block guard field</summary>
public bool GRD_CHK;
2019-11-25 00:54:38 +00:00
/// <summary>Checks logical block application tag</summary>
public bool APP_CHK;
2019-11-25 00:54:38 +00:00
/// <summary>Checks logical block reference</summary>
public bool REF_CHK;
2019-11-25 00:54:38 +00:00
/// <summary>Supports unit attention condition sense key specific data</summary>
public bool UASK_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Supports grouping</summary>
public bool GROUP_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Supports priority</summary>
public bool PRIOR_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Supports head of queue</summary>
public bool HEADSUP;
2019-11-25 00:54:38 +00:00
/// <summary>Supports ordered</summary>
public bool ORDSUP;
2019-11-25 00:54:38 +00:00
/// <summary>Supports simple</summary>
public bool SIMPSUP;
2019-11-25 00:54:38 +00:00
/// <summary>Supports marking a block as uncorrectable</summary>
public bool WU_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Supports disabling correction on WRITE LONG</summary>
public bool CRD_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Supports a non-volatile cache</summary>
public bool NV_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Supports a volatile cache</summary>
public bool V_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Disable protection information checks</summary>
public bool NO_PI_CHK;
2019-11-25 00:54:38 +00:00
/// <summary>Protection information interval supported</summary>
public bool P_I_I_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Clears all LUNs unit attention when clearing one</summary>
public bool LUICLR;
2019-11-25 00:54:38 +00:00
/// <summary>Referrals support</summary>
public bool R_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>History snapshots release effects</summary>
public bool HSSRELEF;
2019-11-25 00:54:38 +00:00
/// <summary>Capability based command security</summary>
public bool CBCS;
2019-11-25 00:54:38 +00:00
/// <summary>Indicates how it handles microcode updating with multiple nexuxes</summary>
public byte Nexus;
2019-11-25 00:54:38 +00:00
/// <summary>Time to complete extended self-test</summary>
public ushort ExtendedTestMinutes;
2019-11-25 00:54:38 +00:00
/// <summary>Power on activation support</summary>
public bool POA_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Hard reset actication</summary>
public bool HRA_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Vendor specific activation</summary>
public bool VSA_SUP;
2019-11-25 00:54:38 +00:00
/// <summary>Maximum length in bytes of sense data</summary>
public byte MaximumSenseLength;
}
public static Page_86? DecodePage_86(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0x86)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse[3] + 4 != pageResponse.Length)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse.Length < 64)
return null;
return new Page_86
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2018-06-22 08:08:38 +01:00
PageLength = (byte)(pageResponse[3] + 4),
ActivateMicrocode = (byte)((pageResponse[4] & 0xC0) >> 6),
2019-11-25 00:54:38 +00:00
SPT =
(byte)((pageResponse[4] & 0x38) >> 3),
GRD_CHK = (pageResponse[4] & 0x04) == 0x04,
APP_CHK =
(pageResponse
[4] &
0x02) == 0x02,
REF_CHK = (pageResponse[4] & 0x01) == 0x01,
UASK_SUP =
(pageResponse
[5] &
0x20) == 0x20,
GROUP_SUP = (pageResponse[5] & 0x10) == 0x10,
PRIOR_SUP =
(pageResponse
[5] &
0x08) == 0x08,
HEADSUP = (pageResponse[5] & 0x04) == 0x04,
ORDSUP =
(pageResponse
[5] &
0x02) == 0x02,
SIMPSUP = (pageResponse[5] & 0x01) == 0x01,
WU_SUP =
(pageResponse
[6] &
0x08) == 0x08,
CRD_SUP = (pageResponse[6] & 0x04) == 0x04,
NV_SUP =
(pageResponse
[6] &
0x02) == 0x02,
V_SUP = (pageResponse[6] & 0x01) == 0x01,
NO_PI_CHK =
(pageResponse
[7] &
0x20) == 0x20,
P_I_I_SUP = (pageResponse[7] & 0x10) == 0x10,
LUICLR =
(pageResponse
[7] &
0x01) == 0x01,
R_SUP = (pageResponse[8] & 0x10) == 0x10,
HSSRELEF =
(pageResponse
[8] &
0x02) == 0x02,
CBCS = (pageResponse[8] & 0x01) == 0x01,
Nexus =
(byte)(pageResponse
[9] &
0x0F),
ExtendedTestMinutes = (ushort)((pageResponse[10] << 8) + pageResponse[11]),
POA_SUP = (pageResponse[12] & 0x80) == 0x80,
HRA_SUP = (pageResponse[12] & 0x40) == 0x40,
VSA_SUP = (pageResponse[12] & 0x20) == 0x20, MaximumSenseLength = pageResponse[13]
};
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_86(byte[] pageResponse) => PrettifyPage_86(DecodePage_86(pageResponse));
public static string PrettifyPage_86(Page_86? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2019-11-25 00:54:38 +00:00
Page_86 page = modePage.Value;
var sb = new StringBuilder();
sb.AppendLine("SCSI Extended INQUIRY Data:");
switch(page.PeripheralDeviceType)
{
case PeripheralDeviceTypes.DirectAccess:
case PeripheralDeviceTypes.SCSIZonedBlockDevice:
switch(page.SPT)
{
case 0:
sb.AppendLine("Logical unit supports type 1 protection");
2019-11-25 00:54:38 +00:00
break;
case 1:
sb.AppendLine("Logical unit supports types 1 and 2 protection");
2019-11-25 00:54:38 +00:00
break;
case 2:
sb.AppendLine("Logical unit supports type 2 protection");
2019-11-25 00:54:38 +00:00
break;
case 3:
sb.AppendLine("Logical unit supports types 1 and 3 protection");
2019-11-25 00:54:38 +00:00
break;
case 4:
sb.AppendLine("Logical unit supports type 3 protection");
2019-11-25 00:54:38 +00:00
break;
case 5:
sb.AppendLine("Logical unit supports types 2 and 3 protection");
2019-11-25 00:54:38 +00:00
break;
case 7:
sb.AppendLine("Logical unit supports types 1, 2 and 3 protection");
2019-11-25 00:54:38 +00:00
break;
default:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("Logical unit supports unknown protection defined by code {0}", page.SPT).
AppendLine();
break;
}
break;
case PeripheralDeviceTypes.SequentialAccess when page.SPT == 1:
sb.AppendLine("Logical unit supports logical block protection");
2019-11-25 00:54:38 +00:00
break;
}
2019-11-25 00:54:38 +00:00
if(page.GRD_CHK)
sb.AppendLine("Device checks the logical block guard");
if(page.APP_CHK)
sb.AppendLine("Device checks the logical block application tag");
if(page.REF_CHK)
sb.AppendLine("Device checks the logical block reference tag");
if(page.UASK_SUP)
sb.AppendLine("Device supports unit attention condition sense key specific data");
if(page.GROUP_SUP)
sb.AppendLine("Device supports grouping");
if(page.PRIOR_SUP)
sb.AppendLine("Device supports priority");
if(page.HEADSUP)
sb.AppendLine("Device supports head of queue");
if(page.ORDSUP)
sb.AppendLine("Device supports the ORDERED task attribute");
if(page.SIMPSUP)
sb.AppendLine("Device supports the SIMPLE task attribute");
if(page.WU_SUP)
sb.AppendLine("Device supports marking a block as uncorrectable with WRITE LONG");
if(page.CRD_SUP)
sb.AppendLine("Device supports disabling correction with WRITE LONG");
if(page.NV_SUP)
sb.AppendLine("Device has a non-volatile cache");
if(page.V_SUP)
sb.AppendLine("Device has a volatile cache");
if(page.NO_PI_CHK)
sb.AppendLine("Device has disabled protection information checks");
if(page.P_I_I_SUP)
sb.AppendLine("Device supports protection information intervals");
if(page.LUICLR)
sb.AppendLine("Device clears any unit attention condition in all LUNs after reporting for any LUN");
2019-11-25 00:54:38 +00:00
if(page.R_SUP)
sb.AppendLine("Device supports referrals");
if(page.HSSRELEF)
sb.AppendLine("Devoce implements alternate reset handling");
if(page.CBCS)
sb.AppendLine("Device supports capability-based command security");
if(page.POA_SUP)
sb.AppendLine("Device supports power-on activation for new microcode");
if(page.HRA_SUP)
sb.AppendLine("Device supports hard reset activation for new microcode");
if(page.VSA_SUP)
sb.AppendLine("Device supports vendor specific activation for new microcode");
if(page.ExtendedTestMinutes > 0)
2017-12-19 20:33:03 +00:00
sb.AppendFormat("Extended self-test takes {0} to complete",
TimeSpan.FromMinutes(page.ExtendedTestMinutes)).AppendLine();
if(page.MaximumSenseLength > 0)
2019-11-25 00:54:38 +00:00
sb.AppendFormat("Device supports a maximum of {0} bytes for sense data", page.MaximumSenseLength).
AppendLine();
return sb.ToString();
}
#endregion EVPD Page 0x86: Extended INQUIRY data page
#region EVPD Page 0x89: ATA Information page
2019-11-25 00:54:38 +00:00
/// <summary>ATA Information page Page code 0x89</summary>
public struct Page_89
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
public ushort PageLength;
2019-11-25 00:54:38 +00:00
/// <summary>Contains the SAT vendor identification</summary>
public byte[] VendorIdentification;
2019-11-25 00:54:38 +00:00
/// <summary>Contains the SAT product identification</summary>
public byte[] ProductIdentification;
2019-11-25 00:54:38 +00:00
/// <summary>Contains the SAT revision level</summary>
public byte[] ProductRevisionLevel;
2019-11-25 00:54:38 +00:00
/// <summary>Contains the ATA device signature</summary>
public byte[] Signature;
2019-11-25 00:54:38 +00:00
/// <summary>Contains the command code used to identify the device</summary>
public byte CommandCode;
2019-11-25 00:54:38 +00:00
/// <summary>Contains the response to ATA IDENTIFY (PACKET) DEVICE</summary>
public byte[] IdentifyData;
}
public static Page_89? DecodePage_89(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0x89)
return null;
2019-11-25 00:54:38 +00:00
if((pageResponse[2] << 8) + pageResponse[3] + 4 != pageResponse.Length)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse.Length < 572)
return null;
2019-11-25 00:54:38 +00:00
var decoded = new Page_89
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4),
VendorIdentification = new byte[8],
ProductIdentification = new byte[16],
2019-11-25 00:54:38 +00:00
ProductRevisionLevel = new byte[4], Signature = new byte[20],
2018-06-22 08:08:38 +01:00
IdentifyData = new byte[512]
};
2019-11-25 00:54:38 +00:00
Array.Copy(pageResponse, 8, decoded.VendorIdentification, 0, 8);
2018-12-25 14:43:14 +00:00
Array.Copy(pageResponse, 16, decoded.ProductIdentification, 0, 16);
2019-11-25 00:54:38 +00:00
Array.Copy(pageResponse, 32, decoded.ProductRevisionLevel, 0, 4);
Array.Copy(pageResponse, 36, decoded.Signature, 0, 20);
decoded.CommandCode = pageResponse[56];
2018-12-25 14:43:14 +00:00
Array.Copy(pageResponse, 60, decoded.IdentifyData, 0, 512);
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_89(byte[] pageResponse) => PrettifyPage_89(DecodePage_89(pageResponse));
// TODO: Decode ATA signature?
public static string PrettifyPage_89(Page_89? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2019-11-25 00:54:38 +00:00
Page_89 page = modePage.Value;
var sb = new StringBuilder();
sb.AppendLine("SCSI to ATA Translation Layer Data:");
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tTranslation layer vendor: {0}",
2019-11-25 00:54:38 +00:00
VendorString.Prettify(StringHandlers.CToString(page.VendorIdentification).Trim())).
AppendLine();
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tTranslation layer name: {0}",
StringHandlers.CToString(page.ProductIdentification).Trim()).AppendLine();
2019-11-25 00:54:38 +00:00
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tTranslation layer release level: {0}",
StringHandlers.CToString(page.ProductRevisionLevel).Trim()).AppendLine();
2019-11-25 00:54:38 +00:00
switch(page.CommandCode)
{
case 0xEC:
sb.AppendLine("\tDevice responded to ATA IDENTIFY DEVICE command.");
2019-11-25 00:54:38 +00:00
break;
case 0xA1:
sb.AppendLine("\tDevice responded to ATA IDENTIFY PACKET DEVICE command.");
2019-11-25 00:54:38 +00:00
break;
default:
sb.AppendFormat("\tDevice responded to ATA command {0:X2}h", page.CommandCode).AppendLine();
2019-11-25 00:54:38 +00:00
break;
}
2018-06-22 08:08:38 +01:00
switch(page.Signature[0])
{
case 0x00:
sb.AppendLine("\tDevice uses Parallel ATA.");
2019-11-25 00:54:38 +00:00
break;
case 0x34:
sb.AppendLine("\tDevice uses Serial ATA.");
2019-11-25 00:54:38 +00:00
break;
default:
sb.AppendFormat("\tDevice uses unknown transport with code {0}", page.Signature[0]).AppendLine();
2019-11-25 00:54:38 +00:00
break;
}
2017-12-21 14:30:38 +00:00
Identify.IdentifyDevice? id = Identify.Decode(page.IdentifyData);
2019-11-25 00:54:38 +00:00
if(id != null)
{
sb.AppendLine("\tATA IDENTIFY information follows:");
sb.AppendFormat("{0}", ATA.Identify.Prettify(id)).AppendLine();
}
2019-11-25 00:54:38 +00:00
else
sb.AppendLine("\tCould not decode ATA IDENTIFY information");
return sb.ToString();
}
#endregion EVPD Page 0x89: ATA Information page
#region EVPD Page 0xC0 (Quantum): Firmware Build Information page
2019-11-25 00:54:38 +00:00
/// <summary>Firmware Build Information page Page code 0xC0 (Quantum)</summary>
public struct Page_C0_Quantum
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
public byte PageLength;
2019-11-25 00:54:38 +00:00
/// <summary>Servo firmware checksum</summary>
public ushort ServoFirmwareChecksum;
2019-11-25 00:54:38 +00:00
/// <summary>Servo EEPROM checksum</summary>
public ushort ServoEEPROMChecksum;
2019-11-25 00:54:38 +00:00
/// <summary>Read/Write firmware checksum</summary>
public uint ReadWriteFirmwareChecksum;
2019-11-25 00:54:38 +00:00
/// <summary>Read/Write firmware build data</summary>
public byte[] ReadWriteFirmwareBuildData;
}
public static Page_C0_Quantum? DecodePage_C0_Quantum(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0xC0)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse[3] != 20)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse.Length != 36)
return null;
2019-11-25 00:54:38 +00:00
var decoded = new Page_C0_Quantum
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
PageLength = (byte)(pageResponse[3] + 4),
ServoFirmwareChecksum = (ushort)((pageResponse[4] << 8) + pageResponse[5]),
2018-06-22 08:08:38 +01:00
ServoEEPROMChecksum = (ushort)((pageResponse[6] << 8) + pageResponse[7]),
2019-11-25 00:54:38 +00:00
ReadWriteFirmwareChecksum = (uint)((pageResponse[8] << 24) + (pageResponse[9] << 16) +
(pageResponse[10] << 8) + pageResponse[11]),
ReadWriteFirmwareBuildData = new byte[24]
};
Array.Copy(pageResponse, 12, decoded.ReadWriteFirmwareBuildData, 0, 24);
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_C0_Quantum(byte[] pageResponse) =>
PrettifyPage_C0_Quantum(DecodePage_C0_Quantum(pageResponse));
public static string PrettifyPage_C0_Quantum(Page_C0_Quantum? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
Page_C0_Quantum page = modePage.Value;
2019-11-25 00:54:38 +00:00
var sb = new StringBuilder();
sb.AppendLine("Quantum Firmware Build Information page:");
sb.AppendFormat("\tServo firmware checksum: 0x{0:X4}", page.ServoFirmwareChecksum).AppendLine();
sb.AppendFormat("\tEEPROM firmware checksum: 0x{0:X4}", page.ServoEEPROMChecksum).AppendLine();
sb.AppendFormat("\tRead/write firmware checksum: 0x{0:X8}", page.ReadWriteFirmwareChecksum).AppendLine();
2019-11-25 00:54:38 +00:00
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tRead/write firmware build date: {0}",
StringHandlers.CToString(page.ReadWriteFirmwareBuildData)).AppendLine();
return sb.ToString();
}
#endregion EVPD Page 0xC0 (Quantum): Firmware Build Information page
2016-10-13 20:28:08 +01:00
#region EVPD Pages 0xC0, 0xC1 (Certance): Drive component revision level pages
2019-11-25 00:54:38 +00:00
/// <summary>Drive component revision level pages Page codes 0xC0, 0xC1 (Certance)</summary>
2016-10-13 20:28:08 +01:00
public struct Page_C0_C1_Certance
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
2016-10-13 20:28:08 +01:00
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
2016-10-13 20:28:08 +01:00
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
2016-10-13 20:28:08 +01:00
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
2016-10-13 20:28:08 +01:00
public byte PageLength;
public byte[] Component;
public byte[] Version;
public byte[] Date;
public byte[] Variant;
}
public static Page_C0_C1_Certance? DecodePage_C0_C1_Certance(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse == null)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse[1] != 0xC0 &&
pageResponse[1] != 0xC1)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse[3] != 92)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse.Length != 96)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
var decoded = new Page_C0_C1_Certance
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2019-11-25 00:54:38 +00:00
PageLength = (byte)(pageResponse[3] + 4), Component = new byte[26], Version = new byte[19],
Date = new byte[24], Variant = new byte[23]
};
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
Array.Copy(pageResponse, 4, decoded.Component, 0, 26);
Array.Copy(pageResponse, 30, decoded.Version, 0, 19);
Array.Copy(pageResponse, 49, decoded.Date, 0, 24);
Array.Copy(pageResponse, 73, decoded.Variant, 0, 23);
2016-10-13 20:28:08 +01:00
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_C0_C1_Certance(byte[] pageResponse) =>
PrettifyPage_C0_C1_Certance(DecodePage_C0_C1_Certance(pageResponse));
2016-10-13 20:28:08 +01:00
public static string PrettifyPage_C0_C1_Certance(Page_C0_C1_Certance? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2016-10-13 20:28:08 +01:00
Page_C0_C1_Certance page = modePage.Value;
2019-11-25 00:54:38 +00:00
var sb = new StringBuilder();
2016-10-13 20:28:08 +01:00
sb.AppendLine("Certance Drive Component Revision Levels page:");
sb.AppendFormat("\tComponent: {0}", StringHandlers.CToString(page.Component)).AppendLine();
sb.AppendFormat("\tVersion: {0}", StringHandlers.CToString(page.Version)).AppendLine();
sb.AppendFormat("\tDate: {0}", StringHandlers.CToString(page.Date)).AppendLine();
sb.AppendFormat("\tVariant: {0}", StringHandlers.CToString(page.Variant)).AppendLine();
return sb.ToString();
}
#endregion EVPD Pages 0xC0, 0xC1 (Certance): Drive component revision level pages
#region EVPD Pages 0xC2, 0xC3, 0xC4, 0xC5, 0xC6 (Certance): Drive component serial number pages
2019-11-25 00:54:38 +00:00
/// <summary>Drive component serial number pages Page codes 0xC2, 0xC3, 0xC4, 0xC5, 0xC6 (Certance)</summary>
2016-10-13 20:28:08 +01:00
public struct Page_C2_C3_C4_C5_C6_Certance
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
2016-10-13 20:28:08 +01:00
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
2016-10-13 20:28:08 +01:00
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
2016-10-13 20:28:08 +01:00
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
2016-10-13 20:28:08 +01:00
public byte PageLength;
public byte[] SerialNumber;
}
public static Page_C2_C3_C4_C5_C6_Certance? DecodePage_C2_C3_C4_C5_C6_Certance(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse == null)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse[1] != 0xC2 &&
pageResponse[1] != 0xC3 &&
pageResponse[1] != 0xC4 &&
pageResponse[1] != 0xC5 &&
pageResponse[1] != 0xC6)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse[3] != 12)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse.Length != 16)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
var decoded = new Page_C2_C3_C4_C5_C6_Certance
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2019-11-25 00:54:38 +00:00
PageLength = (byte)(pageResponse[3] + 4), SerialNumber = new byte[12]
};
2016-10-13 20:28:08 +01:00
Array.Copy(pageResponse, 4, decoded.SerialNumber, 0, 12);
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_C2_C3_C4_C5_C6_Certance(byte[] pageResponse) =>
PrettifyPage_C2_C3_C4_C5_C6_Certance(DecodePage_C2_C3_C4_C5_C6_Certance(pageResponse));
2016-10-13 20:28:08 +01:00
public static string PrettifyPage_C2_C3_C4_C5_C6_Certance(Page_C2_C3_C4_C5_C6_Certance? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2016-10-13 20:28:08 +01:00
Page_C2_C3_C4_C5_C6_Certance page = modePage.Value;
2019-11-25 00:54:38 +00:00
var sb = new StringBuilder();
2016-10-13 20:28:08 +01:00
sb.AppendLine("Certance Drive Component Serial Number page:");
switch(page.PageCode)
{
case 0xC2:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("\tHead Assembly Serial Number: {0}", StringHandlers.CToString(page.SerialNumber)).
AppendLine();
2016-10-13 20:28:08 +01:00
break;
case 0xC3:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("\tReel Motor 1 Serial Number: {0}", StringHandlers.CToString(page.SerialNumber)).
AppendLine();
2016-10-13 20:28:08 +01:00
break;
case 0xC4:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("\tReel Motor 2 Serial Number: {0}", StringHandlers.CToString(page.SerialNumber)).
AppendLine();
2016-10-13 20:28:08 +01:00
break;
case 0xC5:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("\tBoard Serial Number: {0}", StringHandlers.CToString(page.SerialNumber)).
AppendLine();
2016-10-13 20:28:08 +01:00
break;
case 0xC6:
2019-11-25 00:54:38 +00:00
sb.AppendFormat("\tBase Mechanical Serial Number: {0}",
StringHandlers.CToString(page.SerialNumber)).AppendLine();
2016-10-13 20:28:08 +01:00
break;
}
return sb.ToString();
}
#endregion EVPD Pages 0xC0, 0xC1 (Certance): Drive component revision level pages
#region EVPD Page 0xDF (Certance): Drive status pages
2019-11-25 00:54:38 +00:00
/// <summary>Drive status pages Page codes 0xDF (Certance)</summary>
2016-10-13 20:28:08 +01:00
public struct Page_DF_Certance
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
2016-10-13 20:28:08 +01:00
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
2016-10-13 20:28:08 +01:00
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
2016-10-13 20:28:08 +01:00
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
2016-10-13 20:28:08 +01:00
public byte PageLength;
2019-11-25 00:54:38 +00:00
/// <summary>Command forwarding</summary>
2016-10-13 20:28:08 +01:00
public byte CmdFwd;
2019-11-25 00:54:38 +00:00
/// <summary>Alerts</summary>
2016-10-13 20:28:08 +01:00
public bool Alerts;
2019-11-25 00:54:38 +00:00
/// <summary>Removable prevention</summary>
2016-10-13 20:28:08 +01:00
public bool NoRemov;
2019-11-25 00:54:38 +00:00
/// <summary>Unit reservation</summary>
2016-10-13 20:28:08 +01:00
public bool UnitRsvd;
2019-11-25 00:54:38 +00:00
/// <summary>Needs cleaning</summary>
2016-10-13 20:28:08 +01:00
public bool Clean;
2019-11-25 00:54:38 +00:00
/// <summary>Tape threaded</summary>
2016-10-13 20:28:08 +01:00
public bool Threaded;
2019-11-25 00:54:38 +00:00
/// <summary>Commands await forwarding</summary>
2016-10-13 20:28:08 +01:00
public bool Lun1Cmd;
2019-11-25 00:54:38 +00:00
/// <summary>Autoload mode</summary>
2016-10-13 20:28:08 +01:00
public byte AutoloadMode;
2019-11-25 00:54:38 +00:00
/// <summary>Cartridge type</summary>
2016-10-13 20:28:08 +01:00
public byte CartridgeType;
2019-11-25 00:54:38 +00:00
/// <summary>Cartridge format</summary>
2016-10-13 20:28:08 +01:00
public byte CartridgeFormat;
2019-11-25 00:54:38 +00:00
/// <summary>Cartridge capacity in 10e9 bytes</summary>
2016-10-13 20:28:08 +01:00
public ushort CartridgeCapacity;
2019-11-25 00:54:38 +00:00
/// <summary>Port A transport type</summary>
2016-10-13 20:28:08 +01:00
public byte PortATransportType;
2019-11-25 00:54:38 +00:00
/// <summary>Port A SCSI ID</summary>
2016-10-13 20:28:08 +01:00
public byte PortASelectionID;
2019-11-25 00:54:38 +00:00
/// <summary>Total number of head-tape contact time</summary>
2016-10-13 20:28:08 +01:00
public uint OperatingHours;
2019-11-25 00:54:38 +00:00
/// <summary>ID that reserved the device</summary>
2016-10-13 20:28:08 +01:00
public ulong InitiatorID;
2019-11-25 00:54:38 +00:00
/// <summary>Cartridge serial number</summary>
2016-10-13 20:28:08 +01:00
public byte[] CartridgeSerialNumber;
}
public static Page_DF_Certance? DecodePage_DF_Certance(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0xDF)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse[3] != 60)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse.Length != 64)
return null;
2016-10-13 20:28:08 +01:00
2019-11-25 00:54:38 +00:00
var decoded = new Page_DF_Certance
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2018-06-22 08:08:38 +01:00
PageLength = (byte)(pageResponse[3] + 4),
CmdFwd = (byte)((pageResponse[5] & 0xC0) >> 5),
Alerts = (pageResponse[5] & 0x20) == 0x20,
NoRemov = (pageResponse[5] & 0x08) == 0x08,
UnitRsvd = (pageResponse[5] & 0x04) == 0x04,
Clean = (pageResponse[5] & 0x01) == 0x01,
Threaded = (pageResponse[6] & 0x10) == 0x10,
Lun1Cmd = (pageResponse[6] & 0x08) == 0x08,
2019-11-25 00:54:38 +00:00
AutoloadMode = (byte)(pageResponse[6] & 0x07), CartridgeType = pageResponse[8],
2018-06-22 08:08:38 +01:00
CartridgeFormat = pageResponse[9],
CartridgeCapacity = (ushort)((pageResponse[10] << 8) + pageResponse[11] + 4),
2019-11-25 00:54:38 +00:00
PortATransportType = pageResponse[12], PortASelectionID = pageResponse[15],
OperatingHours = (uint)((pageResponse[20] << 24) + (pageResponse[21] << 16) + (pageResponse[22] << 8) +
pageResponse[23]),
CartridgeSerialNumber = new byte[32]
};
2016-10-13 20:28:08 +01:00
byte[] buf = new byte[8];
Array.Copy(pageResponse, 24, buf, 0, 8);
decoded.InitiatorID = BitConverter.ToUInt64(buf.Reverse().ToArray(), 0);
Array.Copy(pageResponse, 32, decoded.CartridgeSerialNumber, 0, 32);
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_DF_Certance(byte[] pageResponse) =>
PrettifyPage_DF_Certance(DecodePage_DF_Certance(pageResponse));
2016-10-13 20:28:08 +01:00
public static string PrettifyPage_DF_Certance(Page_DF_Certance? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2016-10-13 20:28:08 +01:00
Page_DF_Certance page = modePage.Value;
2019-11-25 00:54:38 +00:00
var sb = new StringBuilder();
2016-10-13 20:28:08 +01:00
sb.AppendLine("Certance drive status page:");
switch(page.CmdFwd)
{
case 0:
sb.AppendLine("\tCommand forwarding is disabled");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 1:
sb.AppendLine("\tCommand forwarding is enabled");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
default:
sb.AppendFormat("\tUnknown command forwarding code {0}", page.CmdFwd).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
}
2019-11-25 00:54:38 +00:00
if(page.Alerts)
sb.AppendLine("\tAlerts are enabled");
if(page.NoRemov)
sb.AppendLine("\tCartridge removable is prevented");
2016-10-13 20:28:08 +01:00
if(page.UnitRsvd)
sb.AppendFormat("\tUnit is reserved by initiator ID {0:X16}", page.InitiatorID).AppendLine();
2019-11-25 00:54:38 +00:00
if(page.Clean)
sb.AppendLine("\tDevice needs cleaning cartridge");
if(page.Threaded)
sb.AppendLine("\tCartridge tape is threaded");
if(page.Lun1Cmd)
sb.AppendLine("\tThere are commands pending to be forwarded");
2016-10-13 20:28:08 +01:00
switch(page.AutoloadMode)
{
case 0:
sb.AppendLine("\tCartridge will be loaded and threaded on insertion");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 1:
sb.AppendLine("\tCartridge will be loaded but not threaded on insertion");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 2:
sb.AppendLine("\tCartridge will not be loaded");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
default:
sb.AppendFormat("\tUnknown autoloading mode code {0}", page.AutoloadMode).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
}
switch(page.PortATransportType)
{
case 0:
sb.AppendLine("\tPort A link is down");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 3:
sb.AppendLine("\tPort A uses Parallel SCSI Ultra-160 interface");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
default:
sb.AppendFormat("\tUnknown port A transport type code {0}", page.PortATransportType).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
}
if(page.PortATransportType > 0)
sb.AppendFormat("\tDrive responds to SCSI ID {0}", page.PortASelectionID).AppendLine();
sb.AppendFormat("\tDrive has been operating {0}", TimeSpan.FromHours(page.OperatingHours)).AppendLine();
if(page.CartridgeType > 0)
{
switch(page.CartridgeFormat)
{
case 0:
sb.AppendLine("\tInserted cartridge is LTO");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
default:
sb.AppendFormat("\tUnknown cartridge format code {0}", page.CartridgeType).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
}
switch(page.CartridgeType)
{
case 0:
sb.AppendLine("\tThere is no cartridge inserted");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 1:
sb.AppendLine("\tCleaning cartridge inserted");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 2:
sb.AppendLine("\tUnknown data cartridge inserted");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 3:
sb.AppendLine("\tFirmware cartridge inserted");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 4:
sb.AppendLine("\tLTO Ultrium 1 Type A cartridge inserted");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 5:
sb.AppendLine("\tLTO Ultrium 1 Type B cartridge inserted");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 6:
sb.AppendLine("\tLTO Ultrium 1 Type C cartridge inserted");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 7:
sb.AppendLine("\tLTO Ultrium 1 Type D cartridge inserted");
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
case 8:
sb.AppendLine("\tLTO Ultrium 2 cartridge inserted");
2019-11-25 00:54:38 +00:00
2016-10-16 07:29:19 +01:00
break;
2016-10-13 20:28:08 +01:00
default:
sb.AppendFormat("\tUnknown cartridge type code {0}", page.CartridgeType).AppendLine();
2019-11-25 00:54:38 +00:00
2016-10-13 20:28:08 +01:00
break;
}
2019-11-25 00:54:38 +00:00
sb.AppendFormat("\tCartridge has an uncompressed capabity of {0} gigabytes", page.CartridgeCapacity).
AppendLine();
2017-12-19 20:33:03 +00:00
sb.AppendFormat("\tCartridge serial number: {0}",
StringHandlers.SpacePaddedToString(page.CartridgeSerialNumber)).AppendLine();
2016-10-13 20:28:08 +01:00
}
2019-11-25 00:54:38 +00:00
else
sb.AppendLine("\tThere is no cartridge inserted");
2016-10-13 20:28:08 +01:00
return sb.ToString();
}
#endregion EVPD Page 0xDF (Certance): Drive status pages
#region EVPD Page 0xC0 (IBM): Drive Component Revision Levels page
2019-11-25 00:54:38 +00:00
/// <summary>Drive Component Revision Levels page Page code 0xC0 (IBM)</summary>
public struct Page_C0_IBM
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
public byte PageLength;
public byte[] CodeName;
public byte[] Date;
}
public static Page_C0_IBM? DecodePage_C0_IBM(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0xC0)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse[3] != 39)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse.Length != 43)
return null;
2019-11-25 00:54:38 +00:00
var decoded = new Page_C0_IBM
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2019-11-25 00:54:38 +00:00
PageLength = (byte)(pageResponse[3] + 4), CodeName = new byte[12], Date = new byte[8]
};
2019-11-25 00:54:38 +00:00
Array.Copy(pageResponse, 4, decoded.CodeName, 0, 12);
Array.Copy(pageResponse, 23, decoded.Date, 0, 8);
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_C0_IBM(byte[] pageResponse) =>
PrettifyPage_C0_IBM(DecodePage_C0_IBM(pageResponse));
public static string PrettifyPage_C0_IBM(Page_C0_IBM? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2019-11-25 00:54:38 +00:00
Page_C0_IBM page = modePage.Value;
var sb = new StringBuilder();
sb.AppendLine("IBM Drive Component Revision Levels page:");
sb.AppendFormat("\tCode name: {0}", StringHandlers.CToString(page.CodeName)).AppendLine();
sb.AppendFormat("\tDate: {0}", StringHandlers.CToString(page.Date)).AppendLine();
return sb.ToString();
}
#endregion EVPD Page 0xC0 (IBM): Drive Component Revision Levels page
#region EVPD Page 0xC1 (IBM): Drive Serial Numbers page
2019-11-25 00:54:38 +00:00
/// <summary>Drive Serial Numbers page Page code 0xC1 (IBM)</summary>
public struct Page_C1_IBM
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
public byte PageLength;
public byte[] ManufacturingSerial;
public byte[] ReportedSerial;
}
public static Page_C1_IBM? DecodePage_C1_IBM(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0xC1)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse[3] != 24)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse.Length != 28)
return null;
2019-11-25 00:54:38 +00:00
var decoded = new Page_C1_IBM
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2019-11-25 00:54:38 +00:00
PageLength = (byte)(pageResponse[3] + 4), ManufacturingSerial = new byte[12],
2018-06-22 08:08:38 +01:00
ReportedSerial = new byte[12]
};
2019-11-25 00:54:38 +00:00
Array.Copy(pageResponse, 4, decoded.ManufacturingSerial, 0, 12);
Array.Copy(pageResponse, 16, decoded.ReportedSerial, 0, 12);
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_C1_IBM(byte[] pageResponse) =>
PrettifyPage_C1_IBM(DecodePage_C1_IBM(pageResponse));
public static string PrettifyPage_C1_IBM(Page_C1_IBM? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2019-11-25 00:54:38 +00:00
Page_C1_IBM page = modePage.Value;
var sb = new StringBuilder();
sb.AppendLine("IBM Drive Serial Numbers page:");
2019-11-25 00:54:38 +00:00
sb.AppendFormat("\tManufacturing serial number: {0}", StringHandlers.CToString(page.ManufacturingSerial)).
AppendLine();
sb.AppendFormat("\tReported serial number: {0}", StringHandlers.CToString(page.ReportedSerial)).
AppendLine();
return sb.ToString();
}
#endregion EVPD Page 0xC1 (IBM): Drive Serial Numbers page
2016-10-13 22:59:48 +01:00
#region EVPD Page 0xB0: Sequential-access device capabilities page
2019-11-25 00:54:38 +00:00
/// <summary>Sequential-access device capabilities page Page code 0xB0</summary>
2016-10-13 22:59:48 +01:00
public struct Page_B0
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
2016-10-13 22:59:48 +01:00
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
2016-10-13 22:59:48 +01:00
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
2016-10-13 22:59:48 +01:00
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
2016-10-13 22:59:48 +01:00
public ushort PageLength;
public bool TSMC;
2016-10-13 22:59:48 +01:00
public bool WORM;
}
public static Page_B0? DecodePage_B0(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0xB0)
return null;
2016-10-13 22:59:48 +01:00
2019-11-25 00:54:38 +00:00
if((pageResponse[2] << 8) + pageResponse[3] + 4 != pageResponse.Length)
return null;
2016-10-13 22:59:48 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse.Length < 5)
return null;
2016-10-13 22:59:48 +01:00
2019-11-25 00:54:38 +00:00
var decoded = new Page_B0
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2018-06-22 08:08:38 +01:00
PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4),
2019-11-25 00:54:38 +00:00
TSMC = (pageResponse[4] & 0x02) == 0x02, WORM = (pageResponse[4] & 0x01) == 0x01
};
2016-10-13 22:59:48 +01:00
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_B0(byte[] pageResponse) => PrettifyPage_B0(DecodePage_B0(pageResponse));
2016-10-13 22:59:48 +01:00
public static string PrettifyPage_B0(Page_B0? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2016-10-13 22:59:48 +01:00
2019-11-25 00:54:38 +00:00
Page_B0 page = modePage.Value;
var sb = new StringBuilder();
2016-10-13 22:59:48 +01:00
sb.AppendLine("SCSI Sequential-access Device Capabilities:");
2019-11-25 00:54:38 +00:00
if(page.WORM)
sb.AppendLine("\tDevice supports WORM media");
2019-11-25 00:54:38 +00:00
if(page.TSMC)
sb.AppendLine("\tDevice supports Tape Stream Mirroring");
return sb.ToString();
}
2019-11-25 00:54:38 +00:00
#endregion EVPD Page 0xB0: Sequential-access device capabilities page
#region EVPD Pages 0xC0 to 0xC5 (HP): Drive component revision level pages
2019-11-25 00:54:38 +00:00
/// <summary>Drive component revision level pages Page codes 0xC0 to 0xC5 (HP)</summary>
public struct Page_C0_to_C5_HP
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
public byte PageLength;
public byte[] Component;
public byte[] Version;
public byte[] Date;
public byte[] Variant;
public byte[] Copyright;
}
public static Page_C0_to_C5_HP? DecodePage_C0_to_C5_HP(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse == null)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse[1] != 0xC0 &&
pageResponse[1] != 0xC1 &&
pageResponse[1] != 0xC2 &&
pageResponse[1] != 0xC3 &&
pageResponse[1] != 0xC4 &&
pageResponse[1] != 0xC5)
return null;
2019-11-25 00:54:38 +00:00
if(pageResponse.Length < 4)
return null;
2019-11-25 00:54:38 +00:00
var decoded = new Page_C0_to_C5_HP
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2019-11-25 00:54:38 +00:00
PageLength = (byte)(pageResponse[3] + 4), PageCode = pageResponse[1]
};
2019-11-25 00:54:38 +00:00
if(pageResponse[3] == 92 &&
pageResponse.Length >= 96)
{
decoded.Component = new byte[26];
2018-06-22 08:08:38 +01:00
decoded.Version = new byte[19];
decoded.Date = new byte[24];
decoded.Variant = new byte[23];
2019-11-25 00:54:38 +00:00
Array.Copy(pageResponse, 4, decoded.Component, 0, 26);
Array.Copy(pageResponse, 30, decoded.Version, 0, 19);
Array.Copy(pageResponse, 49, decoded.Date, 0, 24);
Array.Copy(pageResponse, 73, decoded.Variant, 0, 23);
return decoded;
}
2019-11-25 00:54:38 +00:00
if(pageResponse[4] != pageResponse[3] - 1)
return null;
List<byte> array = new List<byte>();
2019-11-25 00:54:38 +00:00
const string fwRegExStr =
@"Firmware Rev\s+=\s+(?<fw>\d+\.\d+)\s+Build date\s+=\s+(?<date>(\w|\d|\s*.)*)\s*$";
2019-11-25 00:54:38 +00:00
2018-06-22 08:08:38 +01:00
const string fwcRegExStr = @"FW_CONF\s+=\s+(?<value>0x[0-9A-Fa-f]{8})\s*$";
const string servoRegExStr = @"Servo\s+Rev\s+=\s+(?<version>\d+\.\d+)\s*$";
2019-11-25 00:54:38 +00:00
var fwRegEx = new Regex(fwRegExStr);
var fwcRegEx = new Regex(fwcRegExStr);
var servoRegEx = new Regex(servoRegExStr);
for(int pos = 5; pos < pageResponse.Length; pos++)
if(pageResponse[pos] == 0x00)
{
2018-06-22 08:08:38 +01:00
string str = StringHandlers.CToString(array.ToArray());
Match fwMatch = fwRegEx.Match(str);
Match fwcMatch = fwcRegEx.Match(str);
Match servoMatch = servoRegEx.Match(str);
if(str.ToLowerInvariant().StartsWith("copyright", StringComparison.Ordinal))
decoded.Copyright = Encoding.ASCII.GetBytes(str);
else if(fwMatch.Success)
{
decoded.Component = Encoding.ASCII.GetBytes("Firmware");
2018-06-22 08:08:38 +01:00
decoded.Version = Encoding.ASCII.GetBytes(fwMatch.Groups["fw"].Value);
decoded.Date = Encoding.ASCII.GetBytes(fwMatch.Groups["date"].Value);
}
2019-11-25 00:54:38 +00:00
else if(fwcMatch.Success)
decoded.Variant = Encoding.ASCII.GetBytes(fwMatch.Groups["value"].Value);
else if(servoMatch.Success)
{
decoded.Component = Encoding.ASCII.GetBytes("Servo");
2018-06-22 08:08:38 +01:00
decoded.Version = Encoding.ASCII.GetBytes(servoMatch.Groups["version"].Value);
}
array = new List<byte>();
}
2018-06-22 08:08:38 +01:00
else
array.Add(pageResponse[pos]);
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_C0_to_C5_HP(byte[] pageResponse) =>
PrettifyPage_C0_to_C5_HP(DecodePage_C0_to_C5_HP(pageResponse));
public static string PrettifyPage_C0_to_C5_HP(Page_C0_to_C5_HP? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
Page_C0_to_C5_HP page = modePage.Value;
2019-11-25 00:54:38 +00:00
var sb = new StringBuilder();
switch(page.PageCode)
{
case 0xC0:
sb.AppendLine("HP Drive Firmware Revision Levels page:");
2019-11-25 00:54:38 +00:00
break;
case 0xC1:
sb.AppendLine("HP Drive Hardware Revision Levels page:");
2019-11-25 00:54:38 +00:00
break;
case 0xC2:
sb.AppendLine("HP Drive PCA Revision Levels page:");
2019-11-25 00:54:38 +00:00
break;
case 0xC3:
sb.AppendLine("HP Drive Mechanism Revision Levels page:");
2019-11-25 00:54:38 +00:00
break;
case 0xC4:
sb.AppendLine("HP Drive Head Assembly Revision Levels page:");
2019-11-25 00:54:38 +00:00
break;
case 0xC5:
sb.AppendLine("HP Drive ACI Revision Levels page:");
2019-11-25 00:54:38 +00:00
break;
}
2019-11-25 00:54:38 +00:00
if(page.Component != null &&
page.Component.Length > 0)
sb.AppendFormat("\tComponent: {0}", StringHandlers.CToString(page.Component)).AppendLine();
2019-11-25 00:54:38 +00:00
if(page.Version != null &&
page.Version.Length > 0)
sb.AppendFormat("\tVersion: {0}", StringHandlers.CToString(page.Version)).AppendLine();
2019-11-25 00:54:38 +00:00
if(page.Date != null &&
page.Date.Length > 0)
sb.AppendFormat("\tDate: {0}", StringHandlers.CToString(page.Date)).AppendLine();
2019-11-25 00:54:38 +00:00
if(page.Variant != null &&
page.Variant.Length > 0)
sb.AppendFormat("\tVariant: {0}", StringHandlers.CToString(page.Variant)).AppendLine();
2019-11-25 00:54:38 +00:00
if(page.Copyright != null &&
page.Copyright.Length > 0)
sb.AppendFormat("\tCopyright: {0}", StringHandlers.CToString(page.Copyright)).AppendLine();
return sb.ToString();
}
#endregion EVPD Pages 0xC0 to 0xC5 (HP): Drive component revision level pages
2016-10-14 23:05:36 +01:00
#region EVPD Page 0xC0 (Seagate): Firmware numbers page
2019-11-25 00:54:38 +00:00
/// <summary>Firmware numbers page Page code 0xC0 (Seagate)</summary>
2016-10-14 23:05:36 +01:00
public struct Page_C0_Seagate
{
2019-11-25 00:54:38 +00:00
/// <summary>The peripheral qualifier.</summary>
2016-10-14 23:05:36 +01:00
public PeripheralQualifiers PeripheralQualifier;
2019-11-25 00:54:38 +00:00
/// <summary>The type of the peripheral device.</summary>
2016-10-14 23:05:36 +01:00
public PeripheralDeviceTypes PeripheralDeviceType;
2019-11-25 00:54:38 +00:00
/// <summary>The page code.</summary>
2016-10-14 23:05:36 +01:00
public byte PageCode;
2019-11-25 00:54:38 +00:00
/// <summary>The length of the page.</summary>
2016-10-14 23:05:36 +01:00
public byte PageLength;
public byte[] ControllerFirmware;
public byte[] BootFirmware;
public byte[] ServoFirmware;
}
public static Page_C0_Seagate? DecodePage_C0_Seagate(byte[] pageResponse)
{
2019-11-25 00:54:38 +00:00
if(pageResponse?[1] != 0xC0)
return null;
2016-10-14 23:05:36 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse[3] != 12)
return null;
2016-10-14 23:05:36 +01:00
2019-11-25 00:54:38 +00:00
if(pageResponse.Length != 16)
return null;
2016-10-14 23:05:36 +01:00
2019-11-25 00:54:38 +00:00
var decoded = new Page_C0_Seagate
{
2018-06-22 08:08:38 +01:00
PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5),
PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F),
2019-11-25 00:54:38 +00:00
PageLength = (byte)(pageResponse[3] + 4), PageCode = pageResponse[1],
2018-06-22 08:08:38 +01:00
ControllerFirmware = new byte[4],
2019-11-25 00:54:38 +00:00
BootFirmware = new byte[4], ServoFirmware = new byte[4]
};
2016-10-14 23:05:36 +01:00
2019-11-25 00:54:38 +00:00
Array.Copy(pageResponse, 4, decoded.ControllerFirmware, 0, 4);
Array.Copy(pageResponse, 8, decoded.BootFirmware, 0, 4);
Array.Copy(pageResponse, 12, decoded.ServoFirmware, 0, 4);
2016-10-14 23:05:36 +01:00
return decoded;
}
2018-12-31 13:17:27 +00:00
public static string PrettifyPage_C0_Seagate(byte[] pageResponse) =>
PrettifyPage_C0_Seagate(DecodePage_C0_Seagate(pageResponse));
2016-10-14 23:05:36 +01:00
public static string PrettifyPage_C0_Seagate(Page_C0_Seagate? modePage)
{
2019-11-25 00:54:38 +00:00
if(!modePage.HasValue)
return null;
2016-10-14 23:05:36 +01:00
Page_C0_Seagate page = modePage.Value;
2019-11-25 00:54:38 +00:00
var sb = new StringBuilder();
2016-10-14 23:05:36 +01:00
sb.AppendLine("Seagate Firmware Numbers page:");
2019-11-25 00:54:38 +00:00
sb.AppendFormat("\tController firmware version: {0}", StringHandlers.CToString(page.ControllerFirmware)).
AppendLine();
2016-10-14 23:05:36 +01:00
sb.AppendFormat("\tBoot firmware version: {0}", StringHandlers.CToString(page.BootFirmware)).AppendLine();
sb.AppendFormat("\tServo firmware version: {0}", StringHandlers.CToString(page.ServoFirmware)).AppendLine();
return sb.ToString();
}
#endregion EVPD Page 0xC0 (Seagate): Firmware numbers page
2015-10-19 04:32:16 +01:00
}
2017-12-19 20:33:03 +00:00
}