From 2c409e12173b8640f11638b81d40396753310df4 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Fri, 22 Jun 2018 08:08:38 +0100 Subject: [PATCH] Code cleanup. --- ATA/Identify.cs | 227 ++-- ATA/Registers.cs | 10 +- Blu-ray/BCA.cs | 10 +- Blu-ray/Cartridge.cs | 29 +- Blu-ray/DDS.cs | 46 +- Blu-ray/Spare.cs | 14 +- CD/ATIP.cs | 45 +- CD/CDTextOnLeadIn.cs | 26 +- CD/FullTOC.cs | 114 +-- CD/PMA.cs | 58 +- CD/Sector.cs | 2 +- CD/Session.cs | 18 +- CD/TOC.cs | 18 +- DVD/CSS&CPRM.cs | 16 +- DVD/Cartridge.cs | 28 +- DVD/DDS.cs | 45 +- DVD/Enums.cs | 22 +- DVD/PFI.cs | 362 +++---- DVD/Spare.cs | 6 +- Floppy/Amiga.cs | 12 +- Floppy/Apple2.cs | 129 +-- Floppy/AppleSony.cs | 97 +- Floppy/Commodore.cs | 3 +- Floppy/Enums.cs | 6 +- Floppy/ISO.cs | 18 +- Floppy/Perpendicular.cs | 27 +- Floppy/System34.cs | 27 +- Floppy/System3740.cs | 18 +- LisaTag.cs | 12 +- MMC/CID.cs | 24 +- MMC/CSD.cs | 155 +-- MMC/ExtendedCSD.cs | 273 ++--- MMC/OCR.cs | 34 +- MMC/VendorString.cs | 2 +- PCMCIA/CIS.cs | 46 +- PCMCIA/Enums.cs | 24 +- PCMCIA/Types.cs | 4 +- PCMCIA/VendorCode.cs | 250 ++--- SCSI/DiscStructureCapabilities.cs | 4 +- SCSI/EVPD.cs | 440 ++++---- SCSI/Inquiry.cs | 143 +-- SCSI/MMC/AACS.cs | 44 +- SCSI/MMC/CPRM.cs | 6 +- SCSI/MMC/DiscInformation.cs | 49 +- SCSI/MMC/Enums.cs | 26 +- SCSI/MMC/Features.cs | 639 ++++++------ SCSI/MMC/Hybrid.cs | 24 +- SCSI/MMC/WriteProtect.cs | 24 +- SCSI/Modes/00_SFF.cs | 2 +- SCSI/Modes/01.cs | 44 +- SCSI/Modes/01_MMC.cs | 33 +- SCSI/Modes/02.cs | 34 +- SCSI/Modes/03.cs | 36 +- SCSI/Modes/04.cs | 22 +- SCSI/Modes/05.cs | 66 +- SCSI/Modes/06.cs | 6 +- SCSI/Modes/07.cs | 10 +- SCSI/Modes/07_MMC.cs | 29 +- SCSI/Modes/08.cs | 38 +- SCSI/Modes/0A.cs | 50 +- SCSI/Modes/0B.cs | 14 +- SCSI/Modes/0D.cs | 12 +- SCSI/Modes/0E.cs | 34 +- SCSI/Modes/0F.cs | 12 +- SCSI/Modes/10.cs | 8 +- SCSI/Modes/10_SSC.cs | 51 +- SCSI/Modes/11.cs | 33 +- SCSI/Modes/12_13_14.cs | 4 +- SCSI/Modes/1A.cs | 28 +- SCSI/Modes/1B.cs | 10 +- SCSI/Modes/1C.cs | 40 +- SCSI/Modes/1C_SFF.cs | 4 +- SCSI/Modes/1D.cs | 12 +- SCSI/Modes/21_Certance.cs | 20 +- SCSI/Modes/22_Certance.cs | 26 +- SCSI/Modes/24_IBM.cs | 10 +- SCSI/Modes/2A.cs | 102 +- SCSI/Modes/2F_IBM.cs | 22 +- SCSI/Modes/3B_HP.cs | 10 +- SCSI/Modes/3C_HP.cs | 38 +- SCSI/Modes/3D_HP.cs | 6 +- SCSI/Modes/3D_IBM.cs | 6 +- SCSI/Modes/3E_Fujitsu.cs | 10 +- SCSI/Modes/3E_HP.cs | 6 +- SCSI/Modes/Headers.cs | 14 +- SCSI/Modes/Mode10.cs | 113 +- SCSI/Modes/Mode6.cs | 64 +- SCSI/Modes/Structs.cs | 20 +- SCSI/SSC/BlockLimits.cs | 2 +- SCSI/SSC/DensitySupport.cs | 102 +- SCSI/Sense.cs | 97 +- SCSI/VendorString.cs | 1596 ++++++++++++++--------------- SecureDigital/CID.cs | 21 +- SecureDigital/CSD.cs | 138 +-- SecureDigital/OCR.cs | 26 +- SecureDigital/SCR.cs | 44 +- SecureDigital/VendorString.cs | 2 +- Sega/CD.cs | 66 +- Sega/Dreamcast.cs | 44 +- Sega/Saturn.cs | 32 +- Xbox/DMI.cs | 35 +- Xbox/SS.cs | 76 +- 102 files changed, 3659 insertions(+), 3377 deletions(-) diff --git a/ATA/Identify.cs b/ATA/Identify.cs index e8c7d4d4f..d79bdc1a5 100644 --- a/ATA/Identify.cs +++ b/ATA/Identify.cs @@ -127,7 +127,8 @@ namespace DiscImageChef.Decoders.ATA /// Words 10 to 19 /// Device serial number, right justified, padded with spaces /// - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] public string SerialNumber; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] + public string SerialNumber; /// /// Word 20 /// Manufacturer defined @@ -153,12 +154,14 @@ namespace DiscImageChef.Decoders.ATA /// Words 23 to 26 /// Firmware revision, left justified, padded with spaces /// - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] public string FirmwareRevision; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] + public string FirmwareRevision; /// /// Words 27 to 46 /// Model number, left justified, padded with spaces /// - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)] public string Model; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)] + public string Model; /// /// Word 47 bits 7 to 0 /// Maximum number of sectors that can be transferred per @@ -565,7 +568,8 @@ namespace DiscImageChef.Decoders.ATA /// Words 121 to 125 /// Reserved /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public ushort[] ReservedWords121; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] + public ushort[] ReservedWords121; /// /// Word 126 @@ -591,7 +595,8 @@ namespace DiscImageChef.Decoders.ATA /// /// Words 129 to 159 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)] public ushort[] ReservedWords129; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)] + public ushort[] ReservedWords129; /// /// Word 160 @@ -607,7 +612,8 @@ namespace DiscImageChef.Decoders.ATA /// Words 161 to 167 /// Reserved for CFA /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] public ushort[] ReservedCFA; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] + public ushort[] ReservedCFA; /// /// Word 168 @@ -624,7 +630,8 @@ namespace DiscImageChef.Decoders.ATA /// Words 170 to 173 /// Additional product identifier /// - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] public string AdditionalPID; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] + public string AdditionalPID; /// /// Word 174 @@ -641,12 +648,14 @@ namespace DiscImageChef.Decoders.ATA /// Words 176 to 195 /// Current media serial number /// - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)] public string MediaSerial; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)] + public string MediaSerial; /// /// Words 196 to 205 /// Current media manufacturer /// - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] public string MediaManufacturer; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] + public string MediaManufacturer; /// /// Word 206 @@ -759,7 +768,8 @@ namespace DiscImageChef.Decoders.ATA /// Words 224 to 229 /// Reserved for CE-ATA /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public ushort[] ReservedCEATA224; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public ushort[] ReservedCEATA224; /// /// Words 230 to 233 @@ -781,7 +791,8 @@ namespace DiscImageChef.Decoders.ATA /// /// Words 236 to 254 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)] public ushort[] ReservedWords; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)] + public ushort[] ReservedWords; /// /// Word 255 bits 7 to 0 @@ -1490,10 +1501,10 @@ namespace DiscImageChef.Decoders.ATA [Flags] public enum SCTCommandTransportBit : ushort { - Vendor15 = 0x8000, - Vendor14 = 0x4000, - Vendor13 = 0x2000, - Vendor12 = 0x1000, + Vendor15 = 0x8000, + Vendor14 = 0x4000, + Vendor13 = 0x2000, + Vendor12 = 0x1000, Reserved11 = 0x0800, Reserved10 = 0x0400, Reserved09 = 0x0200, @@ -1857,14 +1868,14 @@ namespace DiscImageChef.Decoders.ATA IdentifyDevice ATAID = (IdentifyDevice)Marshal.PtrToStructure(ptr, typeof(IdentifyDevice)); Marshal.FreeHGlobal(ptr); - ATAID.WWN = DescrambleWWN(ATAID.WWN); + ATAID.WWN = DescrambleWWN(ATAID.WWN); ATAID.WWNExtension = DescrambleWWN(ATAID.WWNExtension); - ATAID.SerialNumber = DescrambleATAString(IdentifyDeviceResponse, 10 * 2, 20); - ATAID.FirmwareRevision = DescrambleATAString(IdentifyDeviceResponse, 23 * 2, 8); - ATAID.Model = DescrambleATAString(IdentifyDeviceResponse, 27 * 2, 40); - ATAID.AdditionalPID = DescrambleATAString(IdentifyDeviceResponse, 170 * 2, 8); - ATAID.MediaSerial = DescrambleATAString(IdentifyDeviceResponse, 176 * 2, 40); + ATAID.SerialNumber = DescrambleATAString(IdentifyDeviceResponse, 10 * 2, 20); + ATAID.FirmwareRevision = DescrambleATAString(IdentifyDeviceResponse, 23 * 2, 8); + ATAID.Model = DescrambleATAString(IdentifyDeviceResponse, 27 * 2, 40); + ATAID.AdditionalPID = DescrambleATAString(IdentifyDeviceResponse, 170 * 2, 8); + ATAID.MediaSerial = DescrambleATAString(IdentifyDeviceResponse, 176 * 2, 40); ATAID.MediaManufacturer = DescrambleATAString(IdentifyDeviceResponse, 196 * 2, 20); return ATAID; @@ -1885,12 +1896,14 @@ namespace DiscImageChef.Decoders.ATA StringBuilder sb = new StringBuilder(); bool atapi = false; - bool cfa = false; + bool cfa = false; IdentifyDevice ATAID = IdentifyDeviceResponse.Value; if(ATAID.GeneralConfiguration.HasFlag(GeneralConfigurationBit.NonMagnetic)) - if((ushort)ATAID.GeneralConfiguration != 0x848A) atapi = true; - else cfa = true; + if((ushort)ATAID.GeneralConfiguration != 0x848A) + atapi = true; + else + cfa = true; if(atapi) sb.AppendLine("ATAPI device"); else if(cfa) sb.AppendLine("CompactFlash device"); @@ -1924,7 +1937,7 @@ namespace DiscImageChef.Decoders.ATA ata5 = false, ata6 = false, ata7 = false, - acs = false, + acs = false, acs2 = false, acs3 = false, acs4 = false; @@ -1957,7 +1970,7 @@ namespace DiscImageChef.Decoders.ATA ata5 |= ATAID.MajorVersion.HasFlag(MajorVersionBit.AtaAtapi5); ata6 |= ATAID.MajorVersion.HasFlag(MajorVersionBit.AtaAtapi6); ata7 |= ATAID.MajorVersion.HasFlag(MajorVersionBit.AtaAtapi7); - acs |= ATAID.MajorVersion.HasFlag(MajorVersionBit.Ata8ACS); + acs |= ATAID.MajorVersion.HasFlag(MajorVersionBit.Ata8ACS); acs2 |= ATAID.MajorVersion.HasFlag(MajorVersionBit.ACS2); acs3 |= ATAID.MajorVersion.HasFlag(MajorVersionBit.ACS3); acs4 |= ATAID.MajorVersion.HasFlag(MajorVersionBit.ACS4); @@ -1972,66 +1985,77 @@ namespace DiscImageChef.Decoders.ATA maxatalevel = 1; if(minatalevel > 1) minatalevel = 1; } + if(ata2) { sb.Append("ATA-2 "); maxatalevel = 2; if(minatalevel > 2) minatalevel = 2; } + if(ata3) { sb.Append("ATA-3 "); maxatalevel = 3; if(minatalevel > 3) minatalevel = 3; } + if(ata4) { sb.Append("ATA/ATAPI-4 "); maxatalevel = 4; if(minatalevel > 4) minatalevel = 4; } + if(ata5) { sb.Append("ATA/ATAPI-5 "); maxatalevel = 5; if(minatalevel > 5) minatalevel = 5; } + if(ata6) { sb.Append("ATA/ATAPI-6 "); maxatalevel = 6; if(minatalevel > 6) minatalevel = 6; } + if(ata7) { sb.Append("ATA/ATAPI-7 "); maxatalevel = 7; if(minatalevel > 7) minatalevel = 7; } + if(acs) { sb.Append("ATA8-ACS "); maxatalevel = 8; if(minatalevel > 8) minatalevel = 8; } + if(acs2) { sb.Append("ATA8-ACS2 "); maxatalevel = 9; if(minatalevel > 9) minatalevel = 9; } + if(acs3) { sb.Append("ATA8-ACS3 "); maxatalevel = 10; if(minatalevel > 10) minatalevel = 10; } + if(acs4) { sb.Append("ATA8-ACS4 "); maxatalevel = 11; if(minatalevel > 11) minatalevel = 11; } + sb.AppendLine(); sb.Append("Maximum ATA revision supported: "); @@ -2365,8 +2389,10 @@ namespace DiscImageChef.Decoders.ATA } if(ATAID.NominalRotationRate != 0x0000 && ATAID.NominalRotationRate != 0xFFFF) - if(ATAID.NominalRotationRate == 0x0001) sb.AppendLine("Device does not rotate."); - else sb.AppendFormat("Device rotate at {0} rpm", ATAID.NominalRotationRate).AppendLine(); + if(ATAID.NominalRotationRate == 0x0001) + sb.AppendLine("Device does not rotate."); + else + sb.AppendFormat("Device rotate at {0} rpm", ATAID.NominalRotationRate).AppendLine(); uint logicalsectorsize = 0; if(!atapi) @@ -2376,17 +2402,19 @@ namespace DiscImageChef.Decoders.ATA if((ATAID.PhysLogSectorSize & 0x8000) == 0x0000 && (ATAID.PhysLogSectorSize & 0x4000) == 0x4000) { if((ATAID.PhysLogSectorSize & 0x1000) == 0x1000) - if(ATAID.LogicalSectorWords <= 255 || ATAID.LogicalAlignment == 0xFFFF) logicalsectorsize = 512; - else logicalsectorsize = ATAID.LogicalSectorWords * 2; + if(ATAID.LogicalSectorWords <= 255 || ATAID.LogicalAlignment == 0xFFFF) + logicalsectorsize = 512; + else + logicalsectorsize = ATAID.LogicalSectorWords * 2; else logicalsectorsize = 512; if((ATAID.PhysLogSectorSize & 0x2000) == 0x2000) - physicalsectorsize = logicalsectorsize * (uint)Math.Pow(2, ATAID.PhysLogSectorSize & 0xF); + physicalsectorsize = logicalsectorsize * (uint)Math.Pow(2, ATAID.PhysLogSectorSize & 0xF); else physicalsectorsize = logicalsectorsize; } else { - logicalsectorsize = 512; + logicalsectorsize = 512; physicalsectorsize = 512; } @@ -2394,7 +2422,7 @@ namespace DiscImageChef.Decoders.ATA sb.AppendFormat("Logical sector size: {0} bytes", logicalsectorsize).AppendLine(); if(logicalsectorsize != physicalsectorsize && (ATAID.LogicalAlignment & 0x8000) == 0x0000 && - (ATAID.LogicalAlignment & 0x4000) == 0x4000) + (ATAID.LogicalAlignment & 0x4000) == 0x4000) sb.AppendFormat("Logical sector starts at offset {0} from physical sector", ATAID.LogicalAlignment & 0x3FFF).AppendLine(); @@ -2428,70 +2456,75 @@ namespace DiscImageChef.Decoders.ATA if(minatalevel <= 5) if(ATAID.CurrentSectors > 0) sb.AppendFormat("Device size in CHS mode: {0} bytes, {1} Mb, {2} MiB", - (ulong)ATAID.CurrentSectors * logicalsectorsize, + (ulong)ATAID.CurrentSectors * logicalsectorsize, (ulong)ATAID.CurrentSectors * logicalsectorsize / 1000 / 1000, - (ulong)ATAID.CurrentSectors * 512 / 1024 / 1024).AppendLine(); + (ulong)ATAID.CurrentSectors * 512 / 1024 / 1024).AppendLine(); else { ulong currentSectors = (ulong)(ATAID.Cylinders * ATAID.Heads * ATAID.SectorsPerTrack); sb.AppendFormat("Device size in CHS mode: {0} bytes, {1} Mb, {2} MiB", - currentSectors * logicalsectorsize, + currentSectors * logicalsectorsize, currentSectors * logicalsectorsize / 1000 / 1000, - currentSectors * 512 / 1024 / 1024).AppendLine(); + currentSectors * 512 / 1024 / 1024).AppendLine(); } if(ATAID.Capabilities.HasFlag(CapabilitiesBit.LBASupport)) if((ulong)ATAID.LBASectors * logicalsectorsize / 1024 / 1024 > 1000000) sb.AppendFormat("Device size in 28-bit LBA mode: {0} bytes, {1} Tb, {2} TiB", - (ulong)ATAID.LBASectors * logicalsectorsize, + (ulong)ATAID.LBASectors * + logicalsectorsize, (ulong)ATAID.LBASectors * logicalsectorsize / 1000 / 1000 / 1000 / 1000, - (ulong)ATAID.LBASectors * 512 / 1024 / 1024 / 1024 / 1024).AppendLine(); + (ulong)ATAID.LBASectors * 512 / 1024 / 1024 / 1024 / 1024) + .AppendLine(); else if((ulong)ATAID.LBASectors * logicalsectorsize / 1024 / 1024 > 1000) sb.AppendFormat("Device size in 28-bit LBA mode: {0} bytes, {1} Gb, {2} GiB", - (ulong)ATAID.LBASectors * logicalsectorsize, + (ulong)ATAID.LBASectors * logicalsectorsize, (ulong)ATAID.LBASectors * logicalsectorsize / 1000 / 1000 / 1000, - (ulong)ATAID.LBASectors * 512 / 1024 / 1024 / 1024).AppendLine(); + (ulong)ATAID.LBASectors * 512 / 1024 / 1024 / 1024).AppendLine(); else sb.AppendFormat("Device size in 28-bit LBA mode: {0} bytes, {1} Mb, {2} MiB", - (ulong)ATAID.LBASectors * logicalsectorsize, + (ulong)ATAID.LBASectors * logicalsectorsize, (ulong)ATAID.LBASectors * logicalsectorsize / 1000 / 1000, - (ulong)ATAID.LBASectors * 512 / 1024 / 1024).AppendLine(); + (ulong)ATAID.LBASectors * 512 / 1024 / 1024).AppendLine(); if(ATAID.CommandSet2.HasFlag(CommandSetBit2.LBA48)) if(ATAID.CommandSet5.HasFlag(CommandSetBit5.ExtSectors)) if(ATAID.ExtendedUserSectors * logicalsectorsize / 1024 / 1024 > 1000000) sb.AppendFormat("Device size in 48-bit LBA mode: {0} bytes, {1} Tb, {2} TiB", - ATAID.ExtendedUserSectors * logicalsectorsize, + ATAID.ExtendedUserSectors * + logicalsectorsize, ATAID.ExtendedUserSectors * logicalsectorsize / 1000 / 1000 / 1000 / 1000, ATAID.ExtendedUserSectors * logicalsectorsize / 1024 / 1024 / 1024 / 1024) .AppendLine(); else if(ATAID.ExtendedUserSectors * logicalsectorsize / 1024 / 1024 > 1000) sb.AppendFormat("Device size in 48-bit LBA mode: {0} bytes, {1} Gb, {2} GiB", - ATAID.ExtendedUserSectors * logicalsectorsize, + ATAID.ExtendedUserSectors * + logicalsectorsize, ATAID.ExtendedUserSectors * logicalsectorsize / 1000 / 1000 / 1000, ATAID.ExtendedUserSectors * logicalsectorsize / 1024 / 1024 / 1024) .AppendLine(); else sb.AppendFormat("Device size in 48-bit LBA mode: {0} bytes, {1} Mb, {2} MiB", - ATAID.ExtendedUserSectors * logicalsectorsize, + ATAID.ExtendedUserSectors * logicalsectorsize, ATAID.ExtendedUserSectors * logicalsectorsize / 1000 / 1000, ATAID.ExtendedUserSectors * logicalsectorsize / 1024 / 1024).AppendLine(); else { if(ATAID.LBA48Sectors * logicalsectorsize / 1024 / 1024 > 1000000) sb.AppendFormat("Device size in 48-bit LBA mode: {0} bytes, {1} Tb, {2} TiB", - ATAID.LBA48Sectors * logicalsectorsize, + ATAID.LBA48Sectors * + logicalsectorsize, ATAID.LBA48Sectors * logicalsectorsize / 1000 / 1000 / 1000 / 1000, ATAID.LBA48Sectors * logicalsectorsize / 1024 / 1024 / 1024 / 1024) .AppendLine(); else if(ATAID.LBA48Sectors * logicalsectorsize / 1024 / 1024 > 1000) sb.AppendFormat("Device size in 48-bit LBA mode: {0} bytes, {1} Gb, {2} GiB", - ATAID.LBA48Sectors * logicalsectorsize, + ATAID.LBA48Sectors * logicalsectorsize, ATAID.LBA48Sectors * logicalsectorsize / 1000 / 1000 / 1000, ATAID.LBA48Sectors * logicalsectorsize / 1024 / 1024 / 1024).AppendLine(); else sb.AppendFormat("Device size in 48-bit LBA mode: {0} bytes, {1} Mb, {2} MiB", - ATAID.LBA48Sectors * logicalsectorsize, + ATAID.LBA48Sectors * logicalsectorsize, ATAID.LBA48Sectors * logicalsectorsize / 1000 / 1000, ATAID.LBA48Sectors * logicalsectorsize / 1024 / 1024).AppendLine(); } @@ -2505,6 +2538,7 @@ namespace DiscImageChef.Decoders.ATA sb.AppendFormat("{0} bytes per unformatted sector", ATAID.UnformattedBPS).AppendLine(); } } + if((ushort)ATAID.SpecificConfiguration != 0x0000 && (ushort)ATAID.SpecificConfiguration != 0xFFFF) switch(ATAID.SpecificConfiguration) { @@ -2562,6 +2596,7 @@ namespace DiscImageChef.Decoders.ATA sb.AppendLine().Append("IORDY is supported"); if(ATAID.Capabilities.HasFlag(CapabilitiesBit.CanDisableIORDY)) sb.Append(" and can be disabled"); } + if(ATAID.Capabilities.HasFlag(CapabilitiesBit.DMASupport)) sb.AppendLine().Append("DMA is supported"); if(ATAID.Capabilities2.HasFlag(CapabilitiesBit2.MustBeSet) && @@ -2623,36 +2658,43 @@ namespace DiscImageChef.Decoders.ATA sb.Append("DMA0 "); if(ATAID.DMAActive.HasFlag(TransferMode.Mode0)) sb.Append("(active) "); } + if(ATAID.DMASupported.HasFlag(TransferMode.Mode1)) { sb.Append("DMA1 "); if(ATAID.DMAActive.HasFlag(TransferMode.Mode1)) sb.Append("(active) "); } + if(ATAID.DMASupported.HasFlag(TransferMode.Mode2)) { sb.Append("DMA2 "); if(ATAID.DMAActive.HasFlag(TransferMode.Mode2)) sb.Append("(active) "); } + if(ATAID.DMASupported.HasFlag(TransferMode.Mode3)) { sb.Append("DMA3 "); if(ATAID.DMAActive.HasFlag(TransferMode.Mode3)) sb.Append("(active) "); } + if(ATAID.DMASupported.HasFlag(TransferMode.Mode4)) { sb.Append("DMA4 "); if(ATAID.DMAActive.HasFlag(TransferMode.Mode4)) sb.Append("(active) "); } + if(ATAID.DMASupported.HasFlag(TransferMode.Mode5)) { sb.Append("DMA5 "); if(ATAID.DMAActive.HasFlag(TransferMode.Mode5)) sb.Append("(active) "); } + if(ATAID.DMASupported.HasFlag(TransferMode.Mode6)) { sb.Append("DMA6 "); if(ATAID.DMAActive.HasFlag(TransferMode.Mode6)) sb.Append("(active) "); } + if(ATAID.DMASupported.HasFlag(TransferMode.Mode7)) { sb.Append("DMA7 "); @@ -2666,36 +2708,43 @@ namespace DiscImageChef.Decoders.ATA sb.Append("MDMA0 "); if(ATAID.MDMAActive.HasFlag(TransferMode.Mode0)) sb.Append("(active) "); } + if(ATAID.MDMASupported.HasFlag(TransferMode.Mode1)) { sb.Append("MDMA1 "); if(ATAID.MDMAActive.HasFlag(TransferMode.Mode1)) sb.Append("(active) "); } + if(ATAID.MDMASupported.HasFlag(TransferMode.Mode2)) { sb.Append("MDMA2 "); if(ATAID.MDMAActive.HasFlag(TransferMode.Mode2)) sb.Append("(active) "); } + if(ATAID.MDMASupported.HasFlag(TransferMode.Mode3)) { sb.Append("MDMA3 "); if(ATAID.MDMAActive.HasFlag(TransferMode.Mode3)) sb.Append("(active) "); } + if(ATAID.MDMASupported.HasFlag(TransferMode.Mode4)) { sb.Append("MDMA4 "); if(ATAID.MDMAActive.HasFlag(TransferMode.Mode4)) sb.Append("(active) "); } + if(ATAID.MDMASupported.HasFlag(TransferMode.Mode5)) { sb.Append("MDMA5 "); if(ATAID.MDMAActive.HasFlag(TransferMode.Mode5)) sb.Append("(active) "); } + if(ATAID.MDMASupported.HasFlag(TransferMode.Mode6)) { sb.Append("MDMA6 "); if(ATAID.MDMAActive.HasFlag(TransferMode.Mode6)) sb.Append("(active) "); } + if(ATAID.MDMASupported.HasFlag(TransferMode.Mode7)) { sb.Append("MDMA7 "); @@ -2708,36 +2757,43 @@ namespace DiscImageChef.Decoders.ATA sb.Append("UDMA0 "); if(ATAID.UDMAActive.HasFlag(TransferMode.Mode0)) sb.Append("(active) "); } + if(ATAID.UDMASupported.HasFlag(TransferMode.Mode1)) { sb.Append("UDMA1 "); if(ATAID.UDMAActive.HasFlag(TransferMode.Mode1)) sb.Append("(active) "); } + if(ATAID.UDMASupported.HasFlag(TransferMode.Mode2)) { sb.Append("UDMA2 "); if(ATAID.UDMAActive.HasFlag(TransferMode.Mode2)) sb.Append("(active) "); } + if(ATAID.UDMASupported.HasFlag(TransferMode.Mode3)) { sb.Append("UDMA3 "); if(ATAID.UDMAActive.HasFlag(TransferMode.Mode3)) sb.Append("(active) "); } + if(ATAID.UDMASupported.HasFlag(TransferMode.Mode4)) { sb.Append("UDMA4 "); if(ATAID.UDMAActive.HasFlag(TransferMode.Mode4)) sb.Append("(active) "); } + if(ATAID.UDMASupported.HasFlag(TransferMode.Mode5)) { sb.Append("UDMA5 "); if(ATAID.UDMAActive.HasFlag(TransferMode.Mode5)) sb.Append("(active) "); } + if(ATAID.UDMASupported.HasFlag(TransferMode.Mode6)) { sb.Append("UDMA6 "); if(ATAID.UDMAActive.HasFlag(TransferMode.Mode6)) sb.Append("(active) "); } + if(ATAID.UDMASupported.HasFlag(TransferMode.Mode7)) { sb.Append("UDMA7 "); @@ -2876,66 +2932,79 @@ namespace DiscImageChef.Decoders.ATA sb.AppendLine().Append("NOP is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.Nop)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.ReadBuffer)) { sb.AppendLine().Append("READ BUFFER is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.ReadBuffer)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.WriteBuffer)) { sb.AppendLine().Append("WRITE BUFFER is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.WriteBuffer)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.HPA)) { sb.AppendLine().Append("Host Protected Area is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.HPA)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.DeviceReset)) { sb.AppendLine().Append("DEVICE RESET is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.DeviceReset)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.Service)) { sb.AppendLine().Append("SERVICE interrupt is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.Service)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.Release)) { sb.AppendLine().Append("Release is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.Release)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.LookAhead)) { sb.AppendLine().Append("Look-ahead read is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.LookAhead)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.WriteCache)) { sb.AppendLine().Append("Write cache is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.WriteCache)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.Packet)) { sb.AppendLine().Append("PACKET is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.Packet)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.PowerManagement)) { sb.AppendLine().Append("Power management is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.PowerManagement)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.RemovableMedia)) { sb.AppendLine().Append("Removable media feature set is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.RemovableMedia)) sb.Append(" and enabled"); } + if(ATAID.CommandSet.HasFlag(CommandSetBit.SecurityMode)) { sb.AppendLine().Append("Security mode is supported"); if(ATAID.EnabledCommandSet.HasFlag(CommandSetBit.SecurityMode)) sb.Append(" and enabled"); } + if(ATAID.Capabilities.HasFlag(CapabilitiesBit.LBASupport)) sb.AppendLine().Append("28-bit LBA is supported"); @@ -2947,21 +3016,25 @@ namespace DiscImageChef.Decoders.ATA sb.AppendLine().Append("48-bit LBA is supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.LBA48)) sb.Append(" and enabled"); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.FlushCache)) { sb.AppendLine().Append("FLUSH CACHE is supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.FlushCache)) sb.Append(" and enabled"); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.FlushCacheExt)) { sb.AppendLine().Append("FLUSH CACHE EXT is supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.FlushCacheExt)) sb.Append(" and enabled"); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.DCO)) { sb.AppendLine().Append("Device Configuration Overlay feature set is supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.DCO)) sb.Append(" and enabled"); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.AAM)) { sb.AppendLine().Append("Automatic Acoustic Management is supported"); @@ -2969,17 +3042,20 @@ namespace DiscImageChef.Decoders.ATA sb.AppendFormat(" and enabled with value {0} (vendor recommends {1}", ATAID.CurrentAAM, ATAID.RecommendedAAM); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.SetMax)) { sb.AppendLine().Append("SET MAX security extension is supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.SetMax)) sb.Append(" and enabled"); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.AddressOffsetReservedAreaBoot)) { sb.AppendLine().Append("Address Offset Reserved Area Boot is supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.AddressOffsetReservedAreaBoot)) sb.Append(" and enabled"); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.SetFeaturesRequired)) sb.AppendLine().Append("SET FEATURES is required before spin-up"); if(ATAID.CommandSet2.HasFlag(CommandSetBit2.PowerUpInStandby)) @@ -2987,28 +3063,33 @@ namespace DiscImageChef.Decoders.ATA sb.AppendLine().Append("Power-up in standby is supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.PowerUpInStandby)) sb.Append(" and enabled"); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.RemovableNotification)) { sb.AppendLine().Append("Removable Media Status Notification is supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.RemovableNotification)) sb.Append(" and enabled"); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.APM)) { sb.AppendLine().Append("Advanced Power Management is supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.APM)) sb.AppendFormat(" and enabled with value {0}", ATAID.CurrentAPM); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.CompactFlash)) { sb.AppendLine().Append("CompactFlash feature set is supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.CompactFlash)) sb.Append(" and enabled"); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.RWQueuedDMA)) { sb.AppendLine().Append("READ DMA QUEUED and WRITE DMA QUEUED are supported"); if(ATAID.EnabledCommandSet2.HasFlag(CommandSetBit2.RWQueuedDMA)) sb.Append(" and enabled"); } + if(ATAID.CommandSet2.HasFlag(CommandSetBit2.DownloadMicrocode)) { sb.AppendLine().Append("DOWNLOAD MICROCODE is supported"); @@ -3033,16 +3114,19 @@ namespace DiscImageChef.Decoders.ATA sb.AppendLine().Append("S.M.A.R.T. self-testing is supported"); if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.SMARTSelfTest)) sb.Append(" and enabled"); } + if(ATAID.CommandSet3.HasFlag(CommandSetBit3.SMARTLog)) { sb.AppendLine().Append("S.M.A.R.T. error logging is supported"); if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.SMARTLog)) sb.Append(" and enabled"); } + if(ATAID.CommandSet3.HasFlag(CommandSetBit3.IdleImmediate)) { sb.AppendLine().Append("IDLE IMMEDIATE with UNLOAD FEATURE is supported"); if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.IdleImmediate)) sb.Append(" and enabled"); } + if(ATAID.CommandSet3.HasFlag(CommandSetBit3.WriteURG)) sb.AppendLine().Append("URG bit is supported in WRITE STREAM DMA EXT and WRITE STREAM EXT"); if(ATAID.CommandSet3.HasFlag(CommandSetBit3.ReadURG)) @@ -3054,26 +3138,31 @@ namespace DiscImageChef.Decoders.ATA sb.AppendLine().Append("WRITE DMA QUEUED FUA EXT is supported"); if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.FUAWriteQ)) sb.Append(" and enabled"); } + if(ATAID.CommandSet3.HasFlag(CommandSetBit3.FUAWrite)) { sb.AppendLine().Append("WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported"); if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.FUAWrite)) sb.Append(" and enabled"); } + if(ATAID.CommandSet3.HasFlag(CommandSetBit3.GPL)) { sb.AppendLine().Append("General Purpose Logging is supported"); if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.GPL)) sb.Append(" and enabled"); } + if(ATAID.CommandSet3.HasFlag(CommandSetBit3.Streaming)) { sb.AppendLine().Append("Streaming feature set is supported"); if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.Streaming)) sb.Append(" and enabled"); } + if(ATAID.CommandSet3.HasFlag(CommandSetBit3.MCPT)) { sb.AppendLine().Append("Media Card Pass Through command set is supported"); if(ATAID.EnabledCommandSet3.HasFlag(CommandSetBit3.MCPT)) sb.Append(" and enabled"); } + if(ATAID.CommandSet3.HasFlag(CommandSetBit3.MediaSerial)) { sb.AppendLine().Append("Media Serial is supported"); @@ -3089,42 +3178,50 @@ namespace DiscImageChef.Decoders.ATA sb.AppendLine().Append("DSN feature set is supported"); if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.DSN)) sb.Append(" and enabled"); } + if(ATAID.CommandSet4.HasFlag(CommandSetBit4.AMAC)) { sb.AppendLine().Append("Accessible Max Address Configuration is supported"); if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.AMAC)) sb.Append(" and enabled"); } + if(ATAID.CommandSet4.HasFlag(CommandSetBit4.ExtPowerCond)) { sb.AppendLine().Append("Extended Power Conditions are supported"); if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.ExtPowerCond)) sb.Append(" and enabled"); } + if(ATAID.CommandSet4.HasFlag(CommandSetBit4.ExtStatusReport)) { sb.AppendLine().Append("Extended Status Reporting is supported"); if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.ExtStatusReport)) sb.Append(" and enabled"); } + if(ATAID.CommandSet4.HasFlag(CommandSetBit4.FreeFallControl)) { sb.AppendLine().Append("Free-fall control feature set is supported"); if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.FreeFallControl)) sb.Append(" and enabled"); } + if(ATAID.CommandSet4.HasFlag(CommandSetBit4.SegmentedDownloadMicrocode)) { sb.AppendLine().Append("Segmented feature in DOWNLOAD MICROCODE is supported"); if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.SegmentedDownloadMicrocode)) sb.Append(" and enabled"); } + if(ATAID.CommandSet4.HasFlag(CommandSetBit4.RWDMAExtGpl)) { sb.AppendLine().Append("READ/WRITE DMA EXT GPL are supported"); if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.RWDMAExtGpl)) sb.Append(" and enabled"); } + if(ATAID.CommandSet4.HasFlag(CommandSetBit4.WriteUnc)) { sb.AppendLine().Append("WRITE UNCORRECTABLE is supported"); if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.WriteUnc)) sb.Append(" and enabled"); } + if(ATAID.CommandSet4.HasFlag(CommandSetBit4.WRV)) { sb.AppendLine().Append("Write/Read/Verify is supported"); @@ -3134,12 +3231,14 @@ namespace DiscImageChef.Decoders.ATA if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.WRV)) sb.AppendLine().AppendFormat("Current Write/Read/Verify mode: {0}", ATAID.WRVMode); } + if(ATAID.CommandSet4.HasFlag(CommandSetBit4.DT1825)) { sb.AppendLine().Append("DT1825 is supported"); if(ATAID.EnabledCommandSet4.HasFlag(CommandSetBit4.DT1825)) sb.Append(" and enabled"); } } + if(ATAID.Capabilities3.HasFlag(CapabilitiesBit3.BlockErase)) sb.AppendLine().Append("BLOCK ERASE EXT is supported"); if(ATAID.Capabilities3.HasFlag(CapabilitiesBit3.Overwrite)) @@ -3171,6 +3270,7 @@ namespace DiscImageChef.Decoders.ATA if(ATAID.CommandSet5.HasFlag(CommandSetBit5.ReadZeroTrim)) sb.AppendLine().Append("Read after TRIM returns empty data"); } + if(ATAID.CommandSet5.HasFlag(CommandSetBit5.LongPhysSectorAligError)) sb.AppendLine().Append("Device supports Long Physical Sector Alignment Error Reporting Control"); if(ATAID.CommandSet5.HasFlag(CommandSetBit5.Encrypted)) @@ -3192,7 +3292,7 @@ namespace DiscImageChef.Decoders.ATA } if(!ata1 && maxatalevel >= 8) - if(ATAID.TrustedComputing.HasFlag(TrustedComputingBit.Set) && + if(ATAID.TrustedComputing.HasFlag(TrustedComputingBit.Set) && !ATAID.TrustedComputing.HasFlag(TrustedComputingBit.Clear) && ATAID.TrustedComputing.HasFlag(TrustedComputingBit.TrustedComputing)) sb.AppendLine().Append("Trusted Computing feature set is supported"); @@ -3216,21 +3316,25 @@ namespace DiscImageChef.Decoders.ATA if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.NonZeroBufferOffset)) sb.Append(" and enabled"); } + if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.DMASetup)) { sb.AppendLine().Append("DMA Setup auto-activation is supported"); if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.DMASetup)) sb.Append(" and enabled"); } + if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.InitPowerMgmt)) { sb.AppendLine().Append("Device-initiated power management is supported"); if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.InitPowerMgmt)) sb.Append(" and enabled"); } + if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.InOrderData)) { sb.AppendLine().Append("In-order data delivery is supported"); if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.InOrderData)) sb.Append(" and enabled"); } + if(!atapi) if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.HardwareFeatureControl)) { @@ -3238,6 +3342,7 @@ namespace DiscImageChef.Decoders.ATA if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.HardwareFeatureControl)) sb.Append(" and enabled"); } + if(atapi) if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.AsyncNotification)) { @@ -3245,18 +3350,21 @@ namespace DiscImageChef.Decoders.ATA if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.AsyncNotification)) sb.Append(" and enabled"); } + if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.SettingsPreserve)) { sb.AppendLine().Append("Software Settings Preservation is supported"); if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.SettingsPreserve)) sb.Append(" and enabled"); } + if(ATAID.SATAFeatures.HasFlag(SATAFeaturesBit.NCQAutoSense)) sb.AppendLine().Append("NCQ Autosense is supported"); if(ATAID.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.EnabledSlumber)) sb.AppendLine().Append("Automatic Partial to Slumber transitions are enabled"); } } + if((ATAID.RemovableStatusSet & 0x03) > 0) sb.AppendLine().Append("Removable Media Status Notification feature set is supported"); @@ -3304,15 +3412,15 @@ namespace DiscImageChef.Decoders.ATA sb.AppendFormat("Master password revision code: {0}", ATAID.MasterPasswordRevisionCode).AppendLine(); } - if(ATAID.CommandSet3.HasFlag(CommandSetBit3.MustBeSet) && + if(ATAID.CommandSet3.HasFlag(CommandSetBit3.MustBeSet) && !ATAID.CommandSet3.HasFlag(CommandSetBit3.MustBeClear) && ATAID.CommandSet3.HasFlag(CommandSetBit3.Streaming)) { sb.AppendLine().AppendLine("Streaming:"); - sb.AppendFormat("Minimum request size is {0}", ATAID.StreamMinReqSize); - sb.AppendFormat("Streaming transfer time in PIO is {0}", ATAID.StreamTransferTimePIO); - sb.AppendFormat("Streaming transfer time in DMA is {0}", ATAID.StreamTransferTimeDMA); - sb.AppendFormat("Streaming access latency is {0}", ATAID.StreamAccessLatency); + sb.AppendFormat("Minimum request size is {0}", ATAID.StreamMinReqSize); + sb.AppendFormat("Streaming transfer time in PIO is {0}", ATAID.StreamTransferTimePIO); + sb.AppendFormat("Streaming transfer time in DMA is {0}", ATAID.StreamTransferTimeDMA); + sb.AppendFormat("Streaming access latency is {0}", ATAID.StreamAccessLatency); sb.AppendFormat("Streaming performance granularity is {0}", ATAID.StreamPerformanceGranularity); } @@ -3343,11 +3451,12 @@ namespace DiscImageChef.Decoders.ATA sb.AppendLine().AppendFormat("Version {0}", (ATAID.NVCacheCaps & 0x0F00) >> 8).AppendLine(); } + sb.AppendLine().AppendFormat("Non-Volatile Cache is {0} bytes", ATAID.NVCacheSize * logicalsectorsize) .AppendLine(); } -#if DEBUG + #if DEBUG sb.AppendLine(); if(ATAID.VendorWord9 != 0x0000 && ATAID.VendorWord9 != 0xFFFF) sb.AppendFormat("Word 9: 0x{0:X4}", ATAID.VendorWord9).AppendLine(); @@ -3397,13 +3506,13 @@ namespace DiscImageChef.Decoders.ATA for(int i = 0; i < ATAID.ReservedWords.Length; i++) if(ATAID.ReservedWords[i] != 0x0000 && ATAID.ReservedWords[i] != 0xFFFF) sb.AppendFormat("Word {1}: 0x{0:X4}", ATAID.ReservedWords[i], 236 + i).AppendLine(); -#endif + #endif return sb.ToString(); } static ulong DescrambleWWN(ulong WWN) { - byte[] qwb = BitConverter.GetBytes(WWN); + byte[] qwb = BitConverter.GetBytes(WWN); byte[] qword = new byte[8]; qword[7] = qwb[1]; @@ -3425,7 +3534,7 @@ namespace DiscImageChef.Decoders.ATA for(int i = 0; i < length; i += 2) { outbuf[i] = buffer[offset + i + 1]; - outbuf[i + 1] = buffer[offset + i]; + outbuf[i + 1] = buffer[offset + i]; } string outStr = StringHandlers.CToString(outbuf); diff --git a/ATA/Registers.cs b/ATA/Registers.cs index 56da0b6cb..e2121f17b 100644 --- a/ATA/Registers.cs +++ b/ATA/Registers.cs @@ -61,8 +61,8 @@ namespace DiscImageChef.Decoders.ATA public ushort LbaLow; public ushort LbaMid; public ushort LbaHigh; - public byte DeviceHead; - public byte Command; + public byte DeviceHead; + public byte Command; } public struct AtaErrorRegistersChs @@ -89,12 +89,12 @@ namespace DiscImageChef.Decoders.ATA public struct AtaErrorRegistersLba48 { - public byte Status; - public byte Error; + public byte Status; + public byte Error; public ushort SectorCount; public ushort LbaLow; public ushort LbaMid; public ushort LbaHigh; - public byte DeviceHead; + public byte DeviceHead; } } \ No newline at end of file diff --git a/Blu-ray/BCA.cs b/Blu-ray/BCA.cs index c45727c34..dc9170502 100644 --- a/Blu-ray/BCA.cs +++ b/Blu-ray/BCA.cs @@ -75,9 +75,9 @@ namespace DiscImageChef.Decoders.Bluray BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; decoded.DataLength = BigEndianBitConverter.ToUInt16(BCAResponse, 0); - decoded.Reserved1 = BCAResponse[2]; - decoded.Reserved2 = BCAResponse[3]; - decoded.BCA = new byte[64]; + decoded.Reserved1 = BCAResponse[2]; + decoded.Reserved2 = BCAResponse[3]; + decoded.BCA = new byte[64]; Array.Copy(BCAResponse, 4, decoded.BCA, 0, 64); return decoded; @@ -91,10 +91,10 @@ namespace DiscImageChef.Decoders.Bluray StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); -#endif + #endif sb.AppendFormat("Blu-ray Burst Cutting Area in hex follows:"); sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.BCA, 80)); diff --git a/Blu-ray/Cartridge.cs b/Blu-ray/Cartridge.cs index a3a00dca8..374f8302c 100644 --- a/Blu-ray/Cartridge.cs +++ b/Blu-ray/Cartridge.cs @@ -77,16 +77,16 @@ namespace DiscImageChef.Decoders.Bluray BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; decoded.DataLength = BigEndianBitConverter.ToUInt16(CSResponse, 0); - decoded.Reserved1 = CSResponse[2]; - decoded.Reserved2 = CSResponse[3]; - decoded.Cartridge = Convert.ToBoolean(CSResponse[4] & 0x80); - decoded.OUT = Convert.ToBoolean(CSResponse[4] & 0x40); - decoded.Reserved3 = (byte)((CSResponse[4] & 0x38) >> 3); - decoded.OUT = Convert.ToBoolean(CSResponse[4] & 0x04); - decoded.Reserved4 = (byte)(CSResponse[4] & 0x03); - decoded.Reserved5 = CSResponse[5]; - decoded.Reserved6 = CSResponse[6]; - decoded.Reserved7 = CSResponse[7]; + decoded.Reserved1 = CSResponse[2]; + decoded.Reserved2 = CSResponse[3]; + decoded.Cartridge = Convert.ToBoolean(CSResponse[4] & 0x80); + decoded.OUT = Convert.ToBoolean(CSResponse[4] & 0x40); + decoded.Reserved3 = (byte)((CSResponse[4] & 0x38) >> 3); + decoded.OUT = Convert.ToBoolean(CSResponse[4] & 0x04); + decoded.Reserved4 = (byte)(CSResponse[4] & 0x03); + decoded.Reserved5 = CSResponse[5]; + decoded.Reserved6 = CSResponse[6]; + decoded.Reserved7 = CSResponse[7]; return decoded; } @@ -99,7 +99,7 @@ namespace DiscImageChef.Decoders.Bluray StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); if(response.Reserved3 != 0) sb.AppendFormat("Reserved3 = 0x{0:X8}", response.Reserved3).AppendLine(); @@ -107,7 +107,7 @@ namespace DiscImageChef.Decoders.Bluray if(response.Reserved5 != 0) sb.AppendFormat("Reserved5 = 0x{0:X8}", response.Reserved5).AppendLine(); if(response.Reserved6 != 0) sb.AppendFormat("Reserved6 = 0x{0:X8}", response.Reserved6).AppendLine(); if(response.Reserved7 != 0) sb.AppendFormat("Reserved7 = 0x{0:X8}", response.Reserved7).AppendLine(); -#endif + #endif if(response.Cartridge) { @@ -119,11 +119,12 @@ namespace DiscImageChef.Decoders.Bluray { sb.AppendLine("Media is not in a cartridge"); -#if DEBUG + #if DEBUG if(response.OUT) sb.AppendLine("Media has out bit marked, shouldn't"); if(response.CWP) sb.AppendLine("Media has write protection bit marked, shouldn't"); -#endif + #endif } + return sb.ToString(); } diff --git a/Blu-ray/DDS.cs b/Blu-ray/DDS.cs index 1130de25c..741d3fb80 100644 --- a/Blu-ray/DDS.cs +++ b/Blu-ray/DDS.cs @@ -75,9 +75,9 @@ namespace DiscImageChef.Decoders.Bluray BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; decoded.DataLength = BigEndianBitConverter.ToUInt16(DDSResponse, 0); - decoded.Reserved1 = DDSResponse[2]; - decoded.Reserved2 = DDSResponse[3]; - decoded.Signature = BigEndianBitConverter.ToUInt16(DDSResponse, 4); + decoded.Reserved1 = DDSResponse[2]; + decoded.Reserved2 = DDSResponse[3]; + decoded.Signature = BigEndianBitConverter.ToUInt16(DDSResponse, 4); if(decoded.Signature != DDSIdentifier) { DicConsole.DebugWriteLine("BD DDS decoder", "Found incorrect DDS signature (0x{0:X4})", @@ -85,26 +85,26 @@ namespace DiscImageChef.Decoders.Bluray return null; } - decoded.Format = DDSResponse[6]; - decoded.Reserved3 = DDSResponse[7]; - decoded.UpdateCount = BigEndianBitConverter.ToUInt32(DDSResponse, 8); - decoded.Reserved4 = BigEndianBitConverter.ToUInt64(DDSResponse, 12); - decoded.DriveAreaPSN = BigEndianBitConverter.ToUInt32(DDSResponse, 20); - decoded.Reserved5 = BigEndianBitConverter.ToUInt32(DDSResponse, 24); - decoded.DefectListPSN = BigEndianBitConverter.ToUInt32(DDSResponse, 28); - decoded.Reserved6 = BigEndianBitConverter.ToUInt32(DDSResponse, 32); - decoded.PSNofLSNZero = BigEndianBitConverter.ToUInt32(DDSResponse, 36); - decoded.LastUserAreaLSN = BigEndianBitConverter.ToUInt32(DDSResponse, 40); - decoded.ISA0 = BigEndianBitConverter.ToUInt32(DDSResponse, 44); - decoded.OSA = BigEndianBitConverter.ToUInt32(DDSResponse, 48); - decoded.ISA1 = BigEndianBitConverter.ToUInt32(DDSResponse, 52); - decoded.SpareAreaFullFlags = DDSResponse[56]; - decoded.Reserved7 = DDSResponse[57]; + decoded.Format = DDSResponse[6]; + decoded.Reserved3 = DDSResponse[7]; + decoded.UpdateCount = BigEndianBitConverter.ToUInt32(DDSResponse, 8); + decoded.Reserved4 = BigEndianBitConverter.ToUInt64(DDSResponse, 12); + decoded.DriveAreaPSN = BigEndianBitConverter.ToUInt32(DDSResponse, 20); + decoded.Reserved5 = BigEndianBitConverter.ToUInt32(DDSResponse, 24); + decoded.DefectListPSN = BigEndianBitConverter.ToUInt32(DDSResponse, 28); + decoded.Reserved6 = BigEndianBitConverter.ToUInt32(DDSResponse, 32); + decoded.PSNofLSNZero = BigEndianBitConverter.ToUInt32(DDSResponse, 36); + decoded.LastUserAreaLSN = BigEndianBitConverter.ToUInt32(DDSResponse, 40); + decoded.ISA0 = BigEndianBitConverter.ToUInt32(DDSResponse, 44); + decoded.OSA = BigEndianBitConverter.ToUInt32(DDSResponse, 48); + decoded.ISA1 = BigEndianBitConverter.ToUInt32(DDSResponse, 52); + decoded.SpareAreaFullFlags = DDSResponse[56]; + decoded.Reserved7 = DDSResponse[57]; decoded.DiscTypeSpecificField1 = DDSResponse[58]; - decoded.Reserved8 = DDSResponse[59]; + decoded.Reserved8 = DDSResponse[59]; decoded.DiscTypeSpecificField2 = BigEndianBitConverter.ToUInt32(DDSResponse, 60); - decoded.Reserved9 = BigEndianBitConverter.ToUInt32(DDSResponse, 64); - decoded.StatusBits = new byte[32]; + decoded.Reserved9 = BigEndianBitConverter.ToUInt32(DDSResponse, 64); + decoded.StatusBits = new byte[32]; Array.Copy(DDSResponse, 68, decoded.StatusBits, 0, 32); decoded.DiscTypeSpecificData = new byte[DDSResponse.Length - 100]; Array.Copy(DDSResponse, 100, decoded.DiscTypeSpecificData, 0, DDSResponse.Length - 100); @@ -137,7 +137,7 @@ namespace DiscImageChef.Decoders.Bluray sb.AppendFormat("Blu-ray DDS Disc Type Specific Data in hex follows:"); sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.DiscTypeSpecificData, 80)); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); if(response.Reserved3 != 0) sb.AppendFormat("Reserved3 = 0x{0:X2}", response.Reserved3).AppendLine(); @@ -147,7 +147,7 @@ namespace DiscImageChef.Decoders.Bluray if(response.Reserved7 != 0) sb.AppendFormat("Reserved7 = 0x{0:X2}", response.Reserved7).AppendLine(); if(response.Reserved8 != 0) sb.AppendFormat("Reserved8 = 0x{0:X2}", response.Reserved8).AppendLine(); if(response.Reserved9 != 0) sb.AppendFormat("Reserved9 = 0x{0:X8}", response.Reserved9).AppendLine(); -#endif + #endif return sb.ToString(); } diff --git a/Blu-ray/Spare.cs b/Blu-ray/Spare.cs index d658d4e6a..ef4e27e4d 100644 --- a/Blu-ray/Spare.cs +++ b/Blu-ray/Spare.cs @@ -75,11 +75,11 @@ namespace DiscImageChef.Decoders.Bluray BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; - decoded.DataLength = BigEndianBitConverter.ToUInt16(SAIResponse, 0); - decoded.Reserved1 = SAIResponse[2]; - decoded.Reserved2 = SAIResponse[3]; - decoded.Reserved3 = BigEndianBitConverter.ToUInt32(SAIResponse, 4); - decoded.FreeSpareBlocks = BigEndianBitConverter.ToUInt32(SAIResponse, 8); + decoded.DataLength = BigEndianBitConverter.ToUInt16(SAIResponse, 0); + decoded.Reserved1 = SAIResponse[2]; + decoded.Reserved2 = SAIResponse[3]; + decoded.Reserved3 = BigEndianBitConverter.ToUInt32(SAIResponse, 4); + decoded.FreeSpareBlocks = BigEndianBitConverter.ToUInt32(SAIResponse, 8); decoded.AllocatedSpareBlocks = BigEndianBitConverter.ToUInt32(SAIResponse, 12); return decoded; @@ -93,11 +93,11 @@ namespace DiscImageChef.Decoders.Bluray StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); if(response.Reserved3 != 0) sb.AppendFormat("Reserved3 = 0x{0:X8}", response.Reserved3).AppendLine(); -#endif + #endif sb.AppendFormat("{0} free spare blocks", response.FreeSpareBlocks).AppendLine(); sb.AppendFormat("{0} allocated spare blocks", response.AllocatedSpareBlocks).AppendLine(); diff --git a/CD/ATIP.cs b/CD/ATIP.cs index a1ca82483..7808febb6 100644 --- a/CD/ATIP.cs +++ b/CD/ATIP.cs @@ -238,32 +238,32 @@ namespace DiscImageChef.Decoders.CD return null; } - decoded.DataLength = BigEndianBitConverter.ToUInt16(CDATIPResponse, 0); - decoded.Reserved1 = CDATIPResponse[2]; - decoded.Reserved2 = CDATIPResponse[3]; - decoded.ITWP = (byte)((CDATIPResponse[4] & 0xF0) >> 4); - decoded.DDCD = Convert.ToBoolean(CDATIPResponse[4] & 0x08); + decoded.DataLength = BigEndianBitConverter.ToUInt16(CDATIPResponse, 0); + decoded.Reserved1 = CDATIPResponse[2]; + decoded.Reserved2 = CDATIPResponse[3]; + decoded.ITWP = (byte)((CDATIPResponse[4] & 0xF0) >> 4); + decoded.DDCD = Convert.ToBoolean(CDATIPResponse[4] & 0x08); decoded.ReferenceSpeed = (byte)(CDATIPResponse[4] & 0x07); - decoded.AlwaysZero = Convert.ToBoolean(CDATIPResponse[5] & 0x80); - decoded.URU = Convert.ToBoolean(CDATIPResponse[5] & 0x40); - decoded.Reserved3 = (byte)(CDATIPResponse[5] & 0x3F); + decoded.AlwaysZero = Convert.ToBoolean(CDATIPResponse[5] & 0x80); + decoded.URU = Convert.ToBoolean(CDATIPResponse[5] & 0x40); + decoded.Reserved3 = (byte)(CDATIPResponse[5] & 0x3F); - decoded.AlwaysOne = Convert.ToBoolean(CDATIPResponse[6] & 0x80); - decoded.DiscType = Convert.ToBoolean(CDATIPResponse[6] & 0x40); + decoded.AlwaysOne = Convert.ToBoolean(CDATIPResponse[6] & 0x80); + decoded.DiscType = Convert.ToBoolean(CDATIPResponse[6] & 0x40); decoded.DiscSubType = (byte)((CDATIPResponse[6] & 0x38) >> 3); - decoded.A1Valid = Convert.ToBoolean(CDATIPResponse[6] & 0x04); - decoded.A2Valid = Convert.ToBoolean(CDATIPResponse[6] & 0x02); - decoded.A3Valid = Convert.ToBoolean(CDATIPResponse[6] & 0x01); + decoded.A1Valid = Convert.ToBoolean(CDATIPResponse[6] & 0x04); + decoded.A2Valid = Convert.ToBoolean(CDATIPResponse[6] & 0x02); + decoded.A3Valid = Convert.ToBoolean(CDATIPResponse[6] & 0x01); - decoded.Reserved4 = CDATIPResponse[7]; - decoded.LeadInStartMin = CDATIPResponse[8]; - decoded.LeadInStartSec = CDATIPResponse[9]; - decoded.LeadInStartFrame = CDATIPResponse[10]; - decoded.Reserved5 = CDATIPResponse[11]; - decoded.LeadOutStartMin = CDATIPResponse[12]; - decoded.LeadOutStartSec = CDATIPResponse[13]; + decoded.Reserved4 = CDATIPResponse[7]; + decoded.LeadInStartMin = CDATIPResponse[8]; + decoded.LeadInStartSec = CDATIPResponse[9]; + decoded.LeadInStartFrame = CDATIPResponse[10]; + decoded.Reserved5 = CDATIPResponse[11]; + decoded.LeadOutStartMin = CDATIPResponse[12]; + decoded.LeadOutStartSec = CDATIPResponse[13]; decoded.LeadOutStartFrame = CDATIPResponse[14]; - decoded.Reserved6 = CDATIPResponse[15]; + decoded.Reserved6 = CDATIPResponse[15]; decoded.A1Values = new byte[3]; decoded.A2Values = new byte[3]; @@ -356,6 +356,7 @@ namespace DiscImageChef.Decoders.CD sb.AppendFormat("Unknown CD-RW disc subtype: {0}", response.DiscSubType).AppendLine(); break; } + switch(response.ReferenceSpeed) { case 1: @@ -430,7 +431,7 @@ namespace DiscImageChef.Decoders.CD if(response.LeadInStartMin != 97) return sb.ToString(); int type = response.LeadInStartFrame % 10; - int frm = response.LeadInStartFrame - type; + int frm = response.LeadInStartFrame - type; if(response.DiscType) sb.AppendLine("Disc uses phase change"); else diff --git a/CD/CDTextOnLeadIn.cs b/CD/CDTextOnLeadIn.cs index 56a6fdcce..220232221 100644 --- a/CD/CDTextOnLeadIn.cs +++ b/CD/CDTextOnLeadIn.cs @@ -199,9 +199,9 @@ namespace DiscImageChef.Decoders.CD BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; decoded.DataLength = BigEndianBitConverter.ToUInt16(CDTextResponse, 0); - decoded.Reserved1 = CDTextResponse[2]; - decoded.Reserved2 = CDTextResponse[3]; - decoded.DataPacks = new CDTextPack[(decoded.DataLength - 2) / 18]; + decoded.Reserved1 = CDTextResponse[2]; + decoded.Reserved2 = CDTextResponse[3]; + decoded.DataPacks = new CDTextPack[(decoded.DataLength - 2) / 18]; if(decoded.DataLength == 2) return null; @@ -215,13 +215,13 @@ namespace DiscImageChef.Decoders.CD for(int i = 0; i < (decoded.DataLength - 2) / 18; i++) { - decoded.DataPacks[i].HeaderID1 = CDTextResponse[0 + i * 18 + 4]; - decoded.DataPacks[i].HeaderID2 = CDTextResponse[1 + i * 18 + 4]; - decoded.DataPacks[i].HeaderID3 = CDTextResponse[2 + i * 18 + 4]; - decoded.DataPacks[i].DBCC = Convert.ToBoolean(CDTextResponse[3 + i * 18 + 4] & 0x80); - decoded.DataPacks[i].BlockNumber = (byte)((CDTextResponse[3 + i * 18 + 4] & 0x70) >> 4); + decoded.DataPacks[i].HeaderID1 = CDTextResponse[0 + i * 18 + 4]; + decoded.DataPacks[i].HeaderID2 = CDTextResponse[1 + i * 18 + 4]; + decoded.DataPacks[i].HeaderID3 = CDTextResponse[2 + i * 18 + 4]; + decoded.DataPacks[i].DBCC = Convert.ToBoolean(CDTextResponse[3 + i * 18 + 4] & 0x80); + decoded.DataPacks[i].BlockNumber = (byte)((CDTextResponse[3 + i * 18 + 4] & 0x70) >> 4); decoded.DataPacks[i].CharacterPosition = (byte)(CDTextResponse[3 + i * 18 + 4] & 0x0F); - decoded.DataPacks[i].TextDataField = new byte[12]; + decoded.DataPacks[i].TextDataField = new byte[12]; Array.Copy(CDTextResponse, 4 + i * 18 + 4, decoded.DataPacks[i].TextDataField, 0, 12); decoded.DataPacks[i].CRC = BigEndianBitConverter.ToUInt16(CDTextResponse, 16 + i * 18 + 4); } @@ -233,13 +233,13 @@ namespace DiscImageChef.Decoders.CD { if(CDTextResponse == null) return null; - CDText response = CDTextResponse.Value; - StringBuilder sb = new StringBuilder(); + CDText response = CDTextResponse.Value; + StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); -#endif + #endif foreach(CDTextPack descriptor in response.DataPacks) if((descriptor.HeaderID1 & 0x80) != 0x80) diff --git a/CD/FullTOC.cs b/CD/FullTOC.cs index 1db2d82e6..9ce165513 100644 --- a/CD/FullTOC.cs +++ b/CD/FullTOC.cs @@ -172,20 +172,20 @@ namespace DiscImageChef.Decoders.CD for(int i = 0; i < (decoded.DataLength - 2) / 11; i++) { - decoded.TrackDescriptors[i].SessionNumber = CDFullTOCResponse[0 + i * 11 + 4]; + decoded.TrackDescriptors[i].SessionNumber = CDFullTOCResponse[0 + i * 11 + 4]; decoded.TrackDescriptors[i].ADR = (byte)((CDFullTOCResponse[1 + i * 11 + 4] & 0xF0) >> 4); - decoded.TrackDescriptors[i].CONTROL = (byte)(CDFullTOCResponse[1 + i * 11 + 4] & 0x0F); - decoded.TrackDescriptors[i].TNO = CDFullTOCResponse[2 + i * 11 + 4]; - decoded.TrackDescriptors[i].POINT = CDFullTOCResponse[3 + i * 11 + 4]; - decoded.TrackDescriptors[i].Min = CDFullTOCResponse[4 + i * 11 + 4]; - decoded.TrackDescriptors[i].Sec = CDFullTOCResponse[5 + i * 11 + 4]; - decoded.TrackDescriptors[i].Frame = CDFullTOCResponse[6 + i * 11 + 4]; - decoded.TrackDescriptors[i].Zero = CDFullTOCResponse[7 + i * 11 + 4]; + decoded.TrackDescriptors[i].CONTROL = (byte)(CDFullTOCResponse[1 + i * 11 + 4] & 0x0F); + decoded.TrackDescriptors[i].TNO = CDFullTOCResponse[2 + i * 11 + 4]; + decoded.TrackDescriptors[i].POINT = CDFullTOCResponse[3 + i * 11 + 4]; + decoded.TrackDescriptors[i].Min = CDFullTOCResponse[4 + i * 11 + 4]; + decoded.TrackDescriptors[i].Sec = CDFullTOCResponse[5 + i * 11 + 4]; + decoded.TrackDescriptors[i].Frame = CDFullTOCResponse[6 + i * 11 + 4]; + decoded.TrackDescriptors[i].Zero = CDFullTOCResponse[7 + i * 11 + 4]; decoded.TrackDescriptors[i].HOUR = (byte)((CDFullTOCResponse[7 + i * 11 + 4] & 0xF0) >> 4); - decoded.TrackDescriptors[i].PHOUR = (byte)(CDFullTOCResponse[7 + i * 11 + 4] & 0x0F); - decoded.TrackDescriptors[i].PMIN = CDFullTOCResponse[8 + i * 11 + 4]; - decoded.TrackDescriptors[i].PSEC = CDFullTOCResponse[9 + i * 11 + 4]; - decoded.TrackDescriptors[i].PFRAME = CDFullTOCResponse[10 + i * 11 + 4]; + decoded.TrackDescriptors[i].PHOUR = (byte)(CDFullTOCResponse[7 + i * 11 + 4] & 0x0F); + decoded.TrackDescriptors[i].PMIN = CDFullTOCResponse[8 + i * 11 + 4]; + decoded.TrackDescriptors[i].PSEC = CDFullTOCResponse[9 + i * 11 + 4]; + decoded.TrackDescriptors[i].PFRAME = CDFullTOCResponse[10 + i * 11 + 4]; } return decoded; @@ -202,28 +202,26 @@ namespace DiscImageChef.Decoders.CD int lastSession = 0; sb.AppendFormat("First complete session number: {0}", response.FirstCompleteSession).AppendLine(); - sb.AppendFormat("Last complete session number: {0}", response.LastCompleteSession).AppendLine(); + sb.AppendFormat("Last complete session number: {0}", response.LastCompleteSession).AppendLine(); foreach(TrackDataDescriptor descriptor in response.TrackDescriptors) - if((descriptor.CONTROL & 0x08) == - 0x08 || - descriptor.ADR != 1 && descriptor.ADR != 5 && descriptor.ADR != 4 && - descriptor.ADR != 6 || + if((descriptor.CONTROL & 0x08) == 0x08 || + descriptor.ADR != 1 && descriptor.ADR != 5 && descriptor.ADR != 4 && descriptor.ADR != 6 || descriptor.TNO != 0) { sb.AppendLine("Unknown TOC entry format, printing values as-is"); sb.AppendFormat("SessionNumber = {0}", descriptor.SessionNumber).AppendLine(); - sb.AppendFormat("ADR = {0}", descriptor.ADR).AppendLine(); - sb.AppendFormat("CONTROL = {0}", descriptor.CONTROL).AppendLine(); - sb.AppendFormat("TNO = {0}", descriptor.TNO).AppendLine(); - sb.AppendFormat("POINT = {0}", descriptor.POINT).AppendLine(); - sb.AppendFormat("Min = {0}", descriptor.Min).AppendLine(); - sb.AppendFormat("Sec = {0}", descriptor.Sec).AppendLine(); - sb.AppendFormat("Frame = {0}", descriptor.Frame).AppendLine(); - sb.AppendFormat("HOUR = {0}", descriptor.HOUR).AppendLine(); - sb.AppendFormat("PHOUR = {0}", descriptor.PHOUR).AppendLine(); - sb.AppendFormat("PMIN = {0}", descriptor.PMIN).AppendLine(); - sb.AppendFormat("PSEC = {0}", descriptor.PSEC).AppendLine(); - sb.AppendFormat("PFRAME = {0}", descriptor.PFRAME).AppendLine(); + sb.AppendFormat("ADR = {0}", descriptor.ADR).AppendLine(); + sb.AppendFormat("CONTROL = {0}", descriptor.CONTROL).AppendLine(); + sb.AppendFormat("TNO = {0}", descriptor.TNO).AppendLine(); + sb.AppendFormat("POINT = {0}", descriptor.POINT).AppendLine(); + sb.AppendFormat("Min = {0}", descriptor.Min).AppendLine(); + sb.AppendFormat("Sec = {0}", descriptor.Sec).AppendLine(); + sb.AppendFormat("Frame = {0}", descriptor.Frame).AppendLine(); + sb.AppendFormat("HOUR = {0}", descriptor.HOUR).AppendLine(); + sb.AppendFormat("PHOUR = {0}", descriptor.PHOUR).AppendLine(); + sb.AppendFormat("PMIN = {0}", descriptor.PMIN).AppendLine(); + sb.AppendFormat("PSEC = {0}", descriptor.PSEC).AppendLine(); + sb.AppendFormat("PFRAME = {0}", descriptor.PFRAME).AppendLine(); } else { @@ -378,7 +376,7 @@ namespace DiscImageChef.Decoders.CD } default: { - if(descriptor.POINT >= 0x01 && descriptor.POINT <= 0x63) + if(descriptor.POINT >= 0x01 && descriptor.POINT <= 0x63) if(descriptor.ADR == 4) sb.AppendFormat("Video track {3} starts at: {0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, @@ -426,18 +424,18 @@ namespace DiscImageChef.Decoders.CD } else { - sb.AppendFormat("ADR = {0}", descriptor.ADR).AppendLine(); + sb.AppendFormat("ADR = {0}", descriptor.ADR).AppendLine(); sb.AppendFormat("CONTROL = {0}", descriptor.CONTROL).AppendLine(); - sb.AppendFormat("TNO = {0}", descriptor.TNO).AppendLine(); - sb.AppendFormat("POINT = {0}", descriptor.POINT).AppendLine(); - sb.AppendFormat("Min = {0}", descriptor.Min).AppendLine(); - sb.AppendFormat("Sec = {0}", descriptor.Sec).AppendLine(); - sb.AppendFormat("Frame = {0}", descriptor.Frame).AppendLine(); - sb.AppendFormat("HOUR = {0}", descriptor.HOUR).AppendLine(); - sb.AppendFormat("PHOUR = {0}", descriptor.PHOUR).AppendLine(); - sb.AppendFormat("PMIN = {0}", descriptor.PMIN).AppendLine(); - sb.AppendFormat("PSEC = {0}", descriptor.PSEC).AppendLine(); - sb.AppendFormat("PFRAME = {0}", descriptor.PFRAME).AppendLine(); + sb.AppendFormat("TNO = {0}", descriptor.TNO).AppendLine(); + sb.AppendFormat("POINT = {0}", descriptor.POINT).AppendLine(); + sb.AppendFormat("Min = {0}", descriptor.Min).AppendLine(); + sb.AppendFormat("Sec = {0}", descriptor.Sec).AppendLine(); + sb.AppendFormat("Frame = {0}", descriptor.Frame).AppendLine(); + sb.AppendFormat("HOUR = {0}", descriptor.HOUR).AppendLine(); + sb.AppendFormat("PHOUR = {0}", descriptor.PHOUR).AppendLine(); + sb.AppendFormat("PMIN = {0}", descriptor.PMIN).AppendLine(); + sb.AppendFormat("PSEC = {0}", descriptor.PSEC).AppendLine(); + sb.AppendFormat("PFRAME = {0}", descriptor.PFRAME).AppendLine(); } break; @@ -514,12 +512,12 @@ namespace DiscImageChef.Decoders.CD case 0xC1: { sb.AppendFormat("Copy of information of A1 from ATIP found"); - sb.AppendFormat("Min = {0}", descriptor.Min).AppendLine(); - sb.AppendFormat("Sec = {0}", descriptor.Sec).AppendLine(); - sb.AppendFormat("Frame = {0}", descriptor.Frame).AppendLine(); - sb.AppendFormat("Zero = {0}", descriptor.Zero).AppendLine(); - sb.AppendFormat("PMIN = {0}", descriptor.PMIN).AppendLine(); - sb.AppendFormat("PSEC = {0}", descriptor.PSEC).AppendLine(); + sb.AppendFormat("Min = {0}", descriptor.Min).AppendLine(); + sb.AppendFormat("Sec = {0}", descriptor.Sec).AppendLine(); + sb.AppendFormat("Frame = {0}", descriptor.Frame).AppendLine(); + sb.AppendFormat("Zero = {0}", descriptor.Zero).AppendLine(); + sb.AppendFormat("PMIN = {0}", descriptor.PMIN).AppendLine(); + sb.AppendFormat("PSEC = {0}", descriptor.PSEC).AppendLine(); sb.AppendFormat("PFRAME = {0}", descriptor.PFRAME).AppendLine(); break; } @@ -563,18 +561,18 @@ namespace DiscImageChef.Decoders.CD } else { - sb.AppendFormat("ADR = {0}", descriptor.ADR).AppendLine(); + sb.AppendFormat("ADR = {0}", descriptor.ADR).AppendLine(); sb.AppendFormat("CONTROL = {0}", descriptor.CONTROL).AppendLine(); - sb.AppendFormat("TNO = {0}", descriptor.TNO).AppendLine(); - sb.AppendFormat("POINT = {0}", descriptor.POINT).AppendLine(); - sb.AppendFormat("Min = {0}", descriptor.Min).AppendLine(); - sb.AppendFormat("Sec = {0}", descriptor.Sec).AppendLine(); - sb.AppendFormat("Frame = {0}", descriptor.Frame).AppendLine(); - sb.AppendFormat("HOUR = {0}", descriptor.HOUR).AppendLine(); - sb.AppendFormat("PHOUR = {0}", descriptor.PHOUR).AppendLine(); - sb.AppendFormat("PMIN = {0}", descriptor.PMIN).AppendLine(); - sb.AppendFormat("PSEC = {0}", descriptor.PSEC).AppendLine(); - sb.AppendFormat("PFRAME = {0}", descriptor.PFRAME).AppendLine(); + sb.AppendFormat("TNO = {0}", descriptor.TNO).AppendLine(); + sb.AppendFormat("POINT = {0}", descriptor.POINT).AppendLine(); + sb.AppendFormat("Min = {0}", descriptor.Min).AppendLine(); + sb.AppendFormat("Sec = {0}", descriptor.Sec).AppendLine(); + sb.AppendFormat("Frame = {0}", descriptor.Frame).AppendLine(); + sb.AppendFormat("HOUR = {0}", descriptor.HOUR).AppendLine(); + sb.AppendFormat("PHOUR = {0}", descriptor.PHOUR).AppendLine(); + sb.AppendFormat("PMIN = {0}", descriptor.PMIN).AppendLine(); + sb.AppendFormat("PSEC = {0}", descriptor.PSEC).AppendLine(); + sb.AppendFormat("PFRAME = {0}", descriptor.PFRAME).AppendLine(); } break; diff --git a/CD/PMA.cs b/CD/PMA.cs index b79ba9378..be183582a 100644 --- a/CD/PMA.cs +++ b/CD/PMA.cs @@ -144,9 +144,9 @@ namespace DiscImageChef.Decoders.CD BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; - decoded.DataLength = BigEndianBitConverter.ToUInt16(CDPMAResponse, 0); - decoded.Reserved1 = CDPMAResponse[2]; - decoded.Reserved2 = CDPMAResponse[3]; + decoded.DataLength = BigEndianBitConverter.ToUInt16(CDPMAResponse, 0); + decoded.Reserved1 = CDPMAResponse[2]; + decoded.Reserved2 = CDPMAResponse[3]; decoded.PMADescriptors = new CDPMADescriptors[(decoded.DataLength - 2) / 11]; if(decoded.DataLength + 2 != CDPMAResponse.Length) @@ -160,18 +160,18 @@ namespace DiscImageChef.Decoders.CD for(int i = 0; i < (decoded.DataLength - 2) / 11; i++) { decoded.PMADescriptors[i].Reserved = CDPMAResponse[0 + i * 11 + 4]; - decoded.PMADescriptors[i].ADR = (byte)((CDPMAResponse[1 + i * 11 + 4] & 0xF0) >> 4); - decoded.PMADescriptors[i].CONTROL = (byte)(CDPMAResponse[1 + i * 11 + 4] & 0x0F); - decoded.PMADescriptors[i].TNO = CDPMAResponse[2 + i * 11 + 4]; - decoded.PMADescriptors[i].POINT = CDPMAResponse[3 + i * 11 + 4]; - decoded.PMADescriptors[i].Min = CDPMAResponse[4 + i * 11 + 4]; - decoded.PMADescriptors[i].Sec = CDPMAResponse[5 + i * 11 + 4]; - decoded.PMADescriptors[i].Frame = CDPMAResponse[6 + i * 11 + 4]; - decoded.PMADescriptors[i].HOUR = (byte)((CDPMAResponse[7 + i * 11 + 4] & 0xF0) >> 4); - decoded.PMADescriptors[i].PHOUR = (byte)(CDPMAResponse[7 + i * 11 + 4] & 0x0F); - decoded.PMADescriptors[i].PMIN = CDPMAResponse[8 + i * 11 + 4]; - decoded.PMADescriptors[i].PSEC = CDPMAResponse[9 + i * 11 + 4]; - decoded.PMADescriptors[i].PFRAME = CDPMAResponse[10 + i * 11 + 4]; + decoded.PMADescriptors[i].ADR = (byte)((CDPMAResponse[1 + i * 11 + 4] & 0xF0) >> 4); + decoded.PMADescriptors[i].CONTROL = (byte)(CDPMAResponse[1 + i * 11 + 4] & 0x0F); + decoded.PMADescriptors[i].TNO = CDPMAResponse[2 + i * 11 + 4]; + decoded.PMADescriptors[i].POINT = CDPMAResponse[3 + i * 11 + 4]; + decoded.PMADescriptors[i].Min = CDPMAResponse[4 + i * 11 + 4]; + decoded.PMADescriptors[i].Sec = CDPMAResponse[5 + i * 11 + 4]; + decoded.PMADescriptors[i].Frame = CDPMAResponse[6 + i * 11 + 4]; + decoded.PMADescriptors[i].HOUR = (byte)((CDPMAResponse[7 + i * 11 + 4] & 0xF0) >> 4); + decoded.PMADescriptors[i].PHOUR = (byte)(CDPMAResponse[7 + i * 11 + 4] & 0x0F); + decoded.PMADescriptors[i].PMIN = CDPMAResponse[8 + i * 11 + 4]; + decoded.PMADescriptors[i].PSEC = CDPMAResponse[9 + i * 11 + 4]; + decoded.PMADescriptors[i].PFRAME = CDPMAResponse[10 + i * 11 + 4]; } return decoded; @@ -185,16 +185,16 @@ namespace DiscImageChef.Decoders.CD StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); -#endif + #endif foreach(CDPMADescriptors descriptor in response.PMADescriptors) { -#if DEBUG + #if DEBUG if(descriptor.Reserved != 0) sb.AppendFormat("Reserved = 0x{0:X2}", descriptor.Reserved).AppendLine(); -#endif + #endif switch(descriptor.ADR) { @@ -248,21 +248,21 @@ namespace DiscImageChef.Decoders.CD break; case 3: sb.AppendFormat("Skip track assignment {0} says that tracks ", descriptor.POINT); - if(descriptor.Min > 0) sb.AppendFormat("{0} ", descriptor.Min); - if(descriptor.Sec > 0) sb.AppendFormat("{0} ", descriptor.Sec); - if(descriptor.Frame > 0) sb.AppendFormat("{0} ", descriptor.Frame); - if(descriptor.PMIN > 0) sb.AppendFormat("{0} ", descriptor.PMIN); - if(descriptor.PSEC > 0) sb.AppendFormat("{0} ", descriptor.PSEC); + if(descriptor.Min > 0) sb.AppendFormat("{0} ", descriptor.Min); + if(descriptor.Sec > 0) sb.AppendFormat("{0} ", descriptor.Sec); + if(descriptor.Frame > 0) sb.AppendFormat("{0} ", descriptor.Frame); + if(descriptor.PMIN > 0) sb.AppendFormat("{0} ", descriptor.PMIN); + if(descriptor.PSEC > 0) sb.AppendFormat("{0} ", descriptor.PSEC); if(descriptor.PFRAME > 0) sb.AppendFormat("{0} ", descriptor.PFRAME); sb.AppendLine("should be skipped"); break; case 4: sb.AppendFormat("Unskip track assignment {0} says that tracks ", descriptor.POINT); - if(descriptor.Min > 0) sb.AppendFormat("{0} ", descriptor.Min); - if(descriptor.Sec > 0) sb.AppendFormat("{0} ", descriptor.Sec); - if(descriptor.Frame > 0) sb.AppendFormat("{0} ", descriptor.Frame); - if(descriptor.PMIN > 0) sb.AppendFormat("{0} ", descriptor.PMIN); - if(descriptor.PSEC > 0) sb.AppendFormat("{0} ", descriptor.PSEC); + if(descriptor.Min > 0) sb.AppendFormat("{0} ", descriptor.Min); + if(descriptor.Sec > 0) sb.AppendFormat("{0} ", descriptor.Sec); + if(descriptor.Frame > 0) sb.AppendFormat("{0} ", descriptor.Frame); + if(descriptor.PMIN > 0) sb.AppendFormat("{0} ", descriptor.PMIN); + if(descriptor.PSEC > 0) sb.AppendFormat("{0} ", descriptor.PSEC); if(descriptor.PFRAME > 0) sb.AppendFormat("{0} ", descriptor.PFRAME); sb.AppendLine("should not be skipped"); break; diff --git a/CD/Sector.cs b/CD/Sector.cs index 9fa983ed8..830be1fd7 100644 --- a/CD/Sector.cs +++ b/CD/Sector.cs @@ -188,7 +188,7 @@ namespace DiscImageChef.Decoders.CD if(!SyncMark.SequenceEqual(sync)) return sector; - byte[] scrambled = new byte[sector.Length]; + byte[] scrambled = new byte[sector.Length]; for(int i = 0; i < 2352; i++) scrambled[i] = (byte)(sector[i] ^ ScrambleTable[i]); if(sector.Length <= 2352) return scrambled; diff --git a/CD/Session.cs b/CD/Session.cs index 66adebc7b..c8797e58f 100644 --- a/CD/Session.cs +++ b/CD/Session.cs @@ -119,10 +119,10 @@ namespace DiscImageChef.Decoders.CD BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; - decoded.DataLength = BigEndianBitConverter.ToUInt16(CDSessionInfoResponse, 0); + decoded.DataLength = BigEndianBitConverter.ToUInt16(CDSessionInfoResponse, 0); decoded.FirstCompleteSession = CDSessionInfoResponse[2]; - decoded.LastCompleteSession = CDSessionInfoResponse[3]; - decoded.TrackDescriptors = new TrackDataDescriptor[(decoded.DataLength - 2) / 8]; + decoded.LastCompleteSession = CDSessionInfoResponse[3]; + decoded.TrackDescriptors = new TrackDataDescriptor[(decoded.DataLength - 2) / 8]; if(decoded.DataLength + 2 != CDSessionInfoResponse.Length) { @@ -134,11 +134,11 @@ namespace DiscImageChef.Decoders.CD for(int i = 0; i < (decoded.DataLength - 2) / 8; i++) { - decoded.TrackDescriptors[i].Reserved1 = CDSessionInfoResponse[0 + i * 8 + 4]; - decoded.TrackDescriptors[i].ADR = (byte)((CDSessionInfoResponse[1 + i * 8 + 4] & 0xF0) >> 4); - decoded.TrackDescriptors[i].CONTROL = (byte)(CDSessionInfoResponse[1 + i * 8 + 4] & 0x0F); + decoded.TrackDescriptors[i].Reserved1 = CDSessionInfoResponse[0 + i * 8 + 4]; + decoded.TrackDescriptors[i].ADR = (byte)((CDSessionInfoResponse[1 + i * 8 + 4] & 0xF0) >> 4); + decoded.TrackDescriptors[i].CONTROL = (byte)(CDSessionInfoResponse[1 + i * 8 + 4] & 0x0F); decoded.TrackDescriptors[i].TrackNumber = CDSessionInfoResponse[2 + i * 8 + 4]; - decoded.TrackDescriptors[i].Reserved2 = CDSessionInfoResponse[3 + i * 8 + 4]; + decoded.TrackDescriptors[i].Reserved2 = CDSessionInfoResponse[3 + i * 8 + 4]; decoded.TrackDescriptors[i].TrackStartAddress = BigEndianBitConverter.ToUInt32(CDSessionInfoResponse, 4 + i * 8 + 4); } @@ -212,12 +212,12 @@ namespace DiscImageChef.Decoders.CD ? "Digital copy of track is permitted" : "Digital copy of track is prohibited"); -#if DEBUG + #if DEBUG if(descriptor.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", descriptor.Reserved1).AppendLine(); if(descriptor.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", descriptor.Reserved2).AppendLine(); -#endif + #endif sb.AppendLine(); } diff --git a/CD/TOC.cs b/CD/TOC.cs index c5a0191f2..2c31b2dba 100644 --- a/CD/TOC.cs +++ b/CD/TOC.cs @@ -121,9 +121,9 @@ namespace DiscImageChef.Decoders.CD BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; - decoded.DataLength = BigEndianBitConverter.ToUInt16(CDTOCResponse, 0); - decoded.FirstTrack = CDTOCResponse[2]; - decoded.LastTrack = CDTOCResponse[3]; + decoded.DataLength = BigEndianBitConverter.ToUInt16(CDTOCResponse, 0); + decoded.FirstTrack = CDTOCResponse[2]; + decoded.LastTrack = CDTOCResponse[3]; decoded.TrackDescriptors = new CDTOCTrackDataDescriptor[(decoded.DataLength - 2) / 8]; if(decoded.DataLength + 2 != CDTOCResponse.Length) @@ -136,11 +136,11 @@ namespace DiscImageChef.Decoders.CD for(int i = 0; i < (decoded.DataLength - 2) / 8; i++) { - decoded.TrackDescriptors[i].Reserved1 = CDTOCResponse[0 + i * 8 + 4]; - decoded.TrackDescriptors[i].ADR = (byte)((CDTOCResponse[1 + i * 8 + 4] & 0xF0) >> 4); - decoded.TrackDescriptors[i].CONTROL = (byte)(CDTOCResponse[1 + i * 8 + 4] & 0x0F); + decoded.TrackDescriptors[i].Reserved1 = CDTOCResponse[0 + i * 8 + 4]; + decoded.TrackDescriptors[i].ADR = (byte)((CDTOCResponse[1 + i * 8 + 4] & 0xF0) >> 4); + decoded.TrackDescriptors[i].CONTROL = (byte)(CDTOCResponse[1 + i * 8 + 4] & 0x0F); decoded.TrackDescriptors[i].TrackNumber = CDTOCResponse[2 + i * 8 + 4]; - decoded.TrackDescriptors[i].Reserved2 = CDTOCResponse[3 + i * 8 + 4]; + decoded.TrackDescriptors[i].Reserved2 = CDTOCResponse[3 + i * 8 + 4]; decoded.TrackDescriptors[i].TrackStartAddress = BigEndianBitConverter.ToUInt32(CDTOCResponse, 4 + i * 8 + 4); } @@ -220,12 +220,12 @@ namespace DiscImageChef.Decoders.CD ? "Digital copy of track is permitted" : "Digital copy of track is prohibited"); -#if DEBUG + #if DEBUG if(descriptor.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", descriptor.Reserved1).AppendLine(); if(descriptor.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", descriptor.Reserved2).AppendLine(); -#endif + #endif sb.AppendLine(); } diff --git a/DVD/CSS&CPRM.cs b/DVD/CSS&CPRM.cs index 76613411f..7deb5936f 100644 --- a/DVD/CSS&CPRM.cs +++ b/DVD/CSS&CPRM.cs @@ -126,13 +126,13 @@ namespace DiscImageChef.Decoders.DVD return new LeadInCopyright { - DataLength = (ushort)((response[0] << 8) + response[1]), - Reserved1 = response[2], - Reserved2 = response[3], - CopyrightType = (CopyrightType)response[4], + DataLength = (ushort)((response[0] << 8) + response[1]), + Reserved1 = response[2], + Reserved2 = response[3], + CopyrightType = (CopyrightType)response[4], RegionInformation = response[5], - Reserved3 = response[6], - Reserved4 = response[7] + Reserved3 = response[6], + Reserved4 = response[7] }; } @@ -141,7 +141,7 @@ namespace DiscImageChef.Decoders.DVD if(cmi == null) return null; LeadInCopyright decoded = cmi.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); switch(decoded.CopyrightType) { @@ -164,7 +164,7 @@ namespace DiscImageChef.Decoders.DVD if(decoded.CopyrightType == 0) return sb.ToString(); - if(decoded.RegionInformation == 0xFF) sb.AppendLine("Disc cannot be played in any region at all."); + if(decoded.RegionInformation == 0xFF) sb.AppendLine("Disc cannot be played in any region at all."); else if(decoded.RegionInformation == 0x00) sb.AppendLine("Disc can be played in any region."); else { diff --git a/DVD/Cartridge.cs b/DVD/Cartridge.cs index dec065023..be9317ef7 100644 --- a/DVD/Cartridge.cs +++ b/DVD/Cartridge.cs @@ -132,18 +132,18 @@ namespace DiscImageChef.Decoders.DVD return new MediumStatus { DataLength = (ushort)((response[0] << 8) + response[1]), - Reserved1 = response[2], - Reserved2 = response[3], - Cartridge = (response[4] & 0x80) == 0x80, - OUT = (response[4] & 0x40) == 0x40, - Reserved3 = (byte)((response[4] & 0x30) >> 4), - MSWI = (response[4] & 0x08) == 0x08, - CWP = (response[4] & 0x04) == 0x04, - PWP = (response[4] & 0x02) == 0x02, - Reserved4 = (response[4] & 0x01) == 0x01, - DiscType = response[5], - Reserved5 = response[6], - RAMSWI = response[7] + Reserved1 = response[2], + Reserved2 = response[3], + Cartridge = (response[4] & 0x80) == 0x80, + OUT = (response[4] & 0x40) == 0x40, + Reserved3 = (byte)((response[4] & 0x30) >> 4), + MSWI = (response[4] & 0x08) == 0x08, + CWP = (response[4] & 0x04) == 0x04, + PWP = (response[4] & 0x02) == 0x02, + Reserved4 = (response[4] & 0x01) == 0x01, + DiscType = response[5], + Reserved5 = response[6], + RAMSWI = response[7] }; } @@ -151,8 +151,8 @@ namespace DiscImageChef.Decoders.DVD { if(status == null) return null; - MediumStatus decoded = status.Value; - StringBuilder sb = new StringBuilder(); + MediumStatus decoded = status.Value; + StringBuilder sb = new StringBuilder(); if(decoded.PWP) sb.AppendLine("Disc surface is set to write protected status"); diff --git a/DVD/DDS.cs b/DVD/DDS.cs index 8599fba5f..da0d8dcdf 100644 --- a/DVD/DDS.cs +++ b/DVD/DDS.cs @@ -209,32 +209,34 @@ namespace DiscImageChef.Decoders.DVD if(dds.Identifier != 0x0A0A) return null; // Common to both DVD-RAM versions - dds.DataLength = (ushort)((response[0] << 8) + response[1]); - dds.Reserved1 = response[2]; - dds.Reserved2 = response[3]; - dds.Reserved3 = response[6]; - dds.InProcess |= (response[7] & 0x80) == 0x80; - dds.UserCertification |= (response[7] & 0x02) == 0x02; + dds.DataLength = (ushort)((response[0] << 8) + response[1]); + dds.Reserved1 = response[2]; + dds.Reserved2 = response[3]; + dds.Reserved3 = response[6]; + dds.InProcess |= (response[7] & 0x80) == 0x80; + dds.UserCertification |= (response[7] & 0x02) == 0x02; dds.ManufacturerCertification |= (response[7] & 0x01) == 0x01; - dds.UpdateCount = (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]); - dds.Groups = (ushort)((response[12] << 8) + response[13]); + dds.UpdateCount = + (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]); + dds.Groups = + (ushort)((response[12] << 8) + response[13]); // ECMA-272 if(dds.Groups == 24) { dds.PartialCertification |= (response[7] & 0x40) == 0x40; dds.FormattingOnlyAGroup |= (response[7] & 0x20) == 0x20; - dds.Reserved4 = (byte)((response[7] & 0x1C) >> 2); - dds.Reserved = new byte[6]; + dds.Reserved4 = (byte)((response[7] & 0x1C) >> 2); + dds.Reserved = new byte[6]; Array.Copy(response, 14, dds.Reserved, 0, 6); dds.GroupCertificationFlags = new GroupCertificationFlag[24]; for(int i = 0; i < 24; i++) { - dds.GroupCertificationFlags[i].InProcess |= (response[20 + i] & 0x80) == 0x80; + dds.GroupCertificationFlags[i].InProcess |= (response[20 + i] & 0x80) == 0x80; dds.GroupCertificationFlags[i].PartialCertification |= (response[20 + i] & 0x40) == 0x40; - dds.GroupCertificationFlags[i].Reserved1 = (byte)((response[20 + i] & 0x3C) >> 2); - dds.GroupCertificationFlags[i].UserCertification |= (response[20 + i] & 0x02) == 0x02; - dds.GroupCertificationFlags[i].Reserved2 |= (response[20 + i] & 0x01) == 0x01; + dds.GroupCertificationFlags[i].Reserved1 = (byte)((response[20 + i] & 0x3C) >> 2); + dds.GroupCertificationFlags[i].UserCertification |= (response[20 + i] & 0x02) == 0x02; + dds.GroupCertificationFlags[i].Reserved2 |= (response[20 + i] & 0x01) == 0x01; } } @@ -243,17 +245,17 @@ namespace DiscImageChef.Decoders.DVD { dds.Reserved4 = (byte)((response[7] & 0x7C) >> 2); - dds.Reserved = new byte[68]; + dds.Reserved = new byte[68]; Array.Copy(response, 16, dds.Reserved, 0, 68); - dds.Zones = (ushort)((response[14] << 8) + response[15]); + dds.Zones = (ushort)((response[14] << 8) + response[15]); dds.SpareAreaFirstPSN = (uint)((response[85] << 16) + (response[86] << 8) + response[87]); - dds.SpareAreaLastPSN = (uint)((response[89] << 16) + (response[90] << 8) + response[91]); - dds.LSN0Location = (uint)((response[93] << 16) + (response[94] << 8) + response[95]); - dds.StartLSNForZone = new uint[dds.Zones]; + dds.SpareAreaLastPSN = (uint)((response[89] << 16) + (response[90] << 8) + response[91]); + dds.LSN0Location = (uint)((response[93] << 16) + (response[94] << 8) + response[95]); + dds.StartLSNForZone = new uint[dds.Zones]; for(int i = 0; i < dds.Zones; i++) dds.StartLSNForZone[i] = (uint)((response[260 + i * 4 + 1] << 16) + - (response[260 + i * 4 + 2] << 8) + response[260 + i * 4 + 3]); + (response[260 + i * 4 + 2] << 8) + response[260 + i * 4 + 3]); } return dds; @@ -264,7 +266,7 @@ namespace DiscImageChef.Decoders.DVD if(dds == null) return null; DiscDefinitionStructure decoded = dds.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); if(decoded.InProcess) { @@ -290,6 +292,7 @@ namespace DiscImageChef.Decoders.DVD if(decoded.GroupCertificationFlags[i].PartialCertification) sb.AppendFormat("Group {0} is being certified partially", i).AppendLine(); } + if(decoded.GroupCertificationFlags[i].UserCertification) sb.AppendFormat("Group {0} has been certified by an user", i).AppendLine(); } diff --git a/DVD/Enums.cs b/DVD/Enums.cs index 3871b619c..ebc9cba8c 100644 --- a/DVD/Enums.cs +++ b/DVD/Enums.cs @@ -126,10 +126,10 @@ namespace DiscImageChef.Decoders.DVD [SuppressMessage("ReSharper", "InconsistentNaming")] public enum LayerTypeFieldMask : byte { - Embossed = 0x01, + Embossed = 0x01, Recordable = 0x02, Rewritable = 0x04, - Reserved = 0x08 + Reserved = 0x08 } [SuppressMessage("ReSharper", "InconsistentNaming")] @@ -255,21 +255,21 @@ namespace DiscImageChef.Decoders.DVD [SuppressMessage("ReSharper", "InconsistentNaming")] public enum DVDLayerStructure { - Unspecified = 0, + Unspecified = 0, InvertedStack = 1, - TwoP = 2, - Reserved = 3 + TwoP = 2, + Reserved = 3 } [SuppressMessage("ReSharper", "InconsistentNaming")] public enum DVDRecordingSpeed { - None = 0, - Two = 0, - Four = 0x10, - Six = 0x20, - Eight = 0x30, - Ten = 0x40, + None = 0, + Two = 0, + Four = 0x10, + Six = 0x20, + Eight = 0x30, + Ten = 0x40, Twelve = 0x50 } #endregion diff --git a/DVD/PFI.cs b/DVD/PFI.cs index de23ac7d6..384b703f5 100644 --- a/DVD/PFI.cs +++ b/DVD/PFI.cs @@ -1070,32 +1070,33 @@ namespace DiscImageChef.Decoders.DVD Array.Copy(response, 0, tmp2, 4, 2048); response = tmp2; } - + if(response.Length < 2052) return null; PhysicalFormatInformation pfi = new PhysicalFormatInformation(); - byte[] tmp; + byte[] tmp; pfi.DataLength = (ushort)((response[0] << 8) + response[1]); - pfi.Reserved1 = response[2]; - pfi.Reserved2 = response[3]; + pfi.Reserved1 = response[2]; + pfi.Reserved2 = response[3]; // Common - pfi.DiskCategory = (DiskCategory)((response[4] & 0xF0) >> 4); - pfi.PartVersion = (byte)(response[4] & 0x0F); - pfi.DiscSize = (DVDSize)((response[5] & 0xF0) >> 4); - pfi.MaximumRate = (MaximumRateField)(response[5] & 0x0F); - pfi.Reserved3 |= (response[6] & 0x80) == 0x80; - pfi.Layers = (byte)((response[6] & 0x60) >> 5); - pfi.TrackPath |= (response[6] & 0x08) == 0x08; - pfi.LayerType = (LayerTypeFieldMask)(response[6] & 0x07); - pfi.LinearDensity = (LinearDensityField)((response[7] & 0xF0) >> 4); - pfi.TrackDensity = (TrackDensityField)(response[7] & 0x0F); + pfi.DiskCategory = (DiskCategory)((response[4] & 0xF0) >> 4); + pfi.PartVersion = (byte)(response[4] & 0x0F); + pfi.DiscSize = (DVDSize)((response[5] & 0xF0) >> 4); + pfi.MaximumRate = (MaximumRateField)(response[5] & 0x0F); + pfi.Reserved3 |= (response[6] & 0x80) == 0x80; + pfi.Layers = (byte)((response[6] & 0x60) >> 5); + pfi.TrackPath |= (response[6] & 0x08) == 0x08; + pfi.LayerType = (LayerTypeFieldMask)(response[6] & 0x07); + pfi.LinearDensity = (LinearDensityField)((response[7] & 0xF0) >> 4); + pfi.TrackDensity = (TrackDensityField)(response[7] & 0x0F); pfi.DataAreaStartPSN = (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]); pfi.DataAreaEndPSN = (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]); - pfi.Layer0EndPSN = (uint)((response[16] << 24) + (response[17] << 16) + (response[18] << 8) + response[19]); + pfi.Layer0EndPSN = + (uint)((response[16] << 24) + (response[17] << 16) + (response[18] << 8) + response[19]); pfi.BCA |= (response[20] & 0x80) == 0x80; switch(pfi.DiskCategory) @@ -1110,97 +1111,98 @@ namespace DiscImageChef.Decoders.DVD if(pfi.PartVersion == 1) { - pfi.Velocity = response[52]; - pfi.ReadPower = response[53]; - pfi.PeakPower = response[54]; - pfi.BiasPower = response[55]; - pfi.FirstPulseStart = response[56]; - pfi.FirstPulseEnd = response[57]; - pfi.MultiPulseDuration = response[58]; - pfi.LastPulseStart = response[59]; - pfi.LastPulseEnd = response[60]; - pfi.BiasPowerDuration = response[61]; - pfi.PeakPowerGroove = response[62]; - pfi.BiasPowerGroove = response[63]; - pfi.FirstPulseStartGroove = response[64]; - pfi.FirstPulseEndGroove = response[65]; + pfi.Velocity = response[52]; + pfi.ReadPower = response[53]; + pfi.PeakPower = response[54]; + pfi.BiasPower = response[55]; + pfi.FirstPulseStart = response[56]; + pfi.FirstPulseEnd = response[57]; + pfi.MultiPulseDuration = response[58]; + pfi.LastPulseStart = response[59]; + pfi.LastPulseEnd = response[60]; + pfi.BiasPowerDuration = response[61]; + pfi.PeakPowerGroove = response[62]; + pfi.BiasPowerGroove = response[63]; + pfi.FirstPulseStartGroove = response[64]; + pfi.FirstPulseEndGroove = response[65]; pfi.MultiplePulseDurationGroove = response[66]; - pfi.LastPulseStartGroove = response[67]; - pfi.LastPulseEndGroove = response[68]; - pfi.BiasPowerDurationGroove = response[69]; + pfi.LastPulseStartGroove = response[67]; + pfi.LastPulseEndGroove = response[68]; + pfi.BiasPowerDurationGroove = response[69]; } else if(pfi.PartVersion == 6) { - pfi.Velocity = response[504]; - pfi.ReadPower = response[505]; + pfi.Velocity = response[504]; + pfi.ReadPower = response[505]; pfi.AdaptativeWritePulseControlFlag |= (response[506] & 0x80) == 0x80; - pfi.PeakPower = response[507]; - pfi.BiasPower1 = response[508]; - pfi.BiasPower2 = response[509]; - pfi.BiasPower3 = response[510]; - pfi.PeakPowerGroove = response[511]; - pfi.BiasPower1Groove = response[512]; - pfi.BiasPower2Groove = response[513]; - pfi.BiasPower3Groove = response[514]; - pfi.FirstPulseEnd = response[515]; - pfi.FirstPulseDuration = response[516]; - pfi.MultiPulseDuration = response[518]; - pfi.LastPulseStart = response[519]; - pfi.BiasPower2Duration = response[520]; - pfi.FirstPulseStart3TSpace3T = response[521]; - pfi.FirstPulseStart4TSpace3T = response[522]; - pfi.FirstPulseStart5TSpace3T = response[523]; - pfi.FirstPulseStartSpace3T = response[524]; - pfi.FirstPulseStart3TSpace4T = response[525]; - pfi.FirstPulseStart4TSpace4T = response[526]; - pfi.FirstPulseStart5TSpace4T = response[527]; - pfi.FirstPulseStartSpace4T = response[528]; - pfi.FirstPulseStart3TSpace5T = response[529]; - pfi.FirstPulseStart4TSpace5T = response[530]; - pfi.FirstPulseStart5TSpace5T = response[531]; - pfi.FirstPulseStartSpace5T = response[532]; - pfi.FirstPulseStart3TSpace = response[533]; - pfi.FirstPulseStart4TSpace = response[534]; - pfi.FirstPulseStart5TSpace = response[535]; - pfi.FirstPulseStartSpace = response[536]; - pfi.FirstPulse3TStartTSpace3T = response[537]; - pfi.FirstPulse4TStartTSpace3T = response[538]; - pfi.FirstPulse5TStartTSpace3T = response[539]; - pfi.FirstPulseStartTSpace3T = response[540]; - pfi.FirstPulse3TStartTSpace4T = response[541]; - pfi.FirstPulse4TStartTSpace4T = response[542]; - pfi.FirstPulse5TStartTSpace4T = response[543]; - pfi.FirstPulseStartTSpace4T = response[544]; - pfi.FirstPulse3TStartTSpace5T = response[545]; - pfi.FirstPulse4TStartTSpace5T = response[546]; - pfi.FirstPulse5TStartTSpace5T = response[547]; - pfi.FirstPulseStartTSpace5T = response[548]; - pfi.FirstPulse3TStartTSpace = response[549]; - pfi.FirstPulse4TStartTSpace = response[550]; - pfi.FirstPulse5TStartTSpace = response[551]; - pfi.FirstPulseStartTSpace = response[552]; - tmp = new byte[48]; + pfi.PeakPower = response[507]; + pfi.BiasPower1 = response[508]; + pfi.BiasPower2 = response[509]; + pfi.BiasPower3 = response[510]; + pfi.PeakPowerGroove = response[511]; + pfi.BiasPower1Groove = response[512]; + pfi.BiasPower2Groove = response[513]; + pfi.BiasPower3Groove = response[514]; + pfi.FirstPulseEnd = response[515]; + pfi.FirstPulseDuration = response[516]; + pfi.MultiPulseDuration = response[518]; + pfi.LastPulseStart = response[519]; + pfi.BiasPower2Duration = response[520]; + pfi.FirstPulseStart3TSpace3T = response[521]; + pfi.FirstPulseStart4TSpace3T = response[522]; + pfi.FirstPulseStart5TSpace3T = response[523]; + pfi.FirstPulseStartSpace3T = response[524]; + pfi.FirstPulseStart3TSpace4T = response[525]; + pfi.FirstPulseStart4TSpace4T = response[526]; + pfi.FirstPulseStart5TSpace4T = response[527]; + pfi.FirstPulseStartSpace4T = response[528]; + pfi.FirstPulseStart3TSpace5T = response[529]; + pfi.FirstPulseStart4TSpace5T = response[530]; + pfi.FirstPulseStart5TSpace5T = response[531]; + pfi.FirstPulseStartSpace5T = response[532]; + pfi.FirstPulseStart3TSpace = response[533]; + pfi.FirstPulseStart4TSpace = response[534]; + pfi.FirstPulseStart5TSpace = response[535]; + pfi.FirstPulseStartSpace = response[536]; + pfi.FirstPulse3TStartTSpace3T = response[537]; + pfi.FirstPulse4TStartTSpace3T = response[538]; + pfi.FirstPulse5TStartTSpace3T = response[539]; + pfi.FirstPulseStartTSpace3T = response[540]; + pfi.FirstPulse3TStartTSpace4T = response[541]; + pfi.FirstPulse4TStartTSpace4T = response[542]; + pfi.FirstPulse5TStartTSpace4T = response[543]; + pfi.FirstPulseStartTSpace4T = response[544]; + pfi.FirstPulse3TStartTSpace5T = response[545]; + pfi.FirstPulse4TStartTSpace5T = response[546]; + pfi.FirstPulse5TStartTSpace5T = response[547]; + pfi.FirstPulseStartTSpace5T = response[548]; + pfi.FirstPulse3TStartTSpace = response[549]; + pfi.FirstPulse4TStartTSpace = response[550]; + pfi.FirstPulse5TStartTSpace = response[551]; + pfi.FirstPulseStartTSpace = response[552]; + tmp = new byte[48]; Array.Copy(response, 553, tmp, 0, 48); pfi.DiskManufacturer = StringHandlers.SpacePaddedToString(tmp); - tmp = new byte[16]; + tmp = new byte[16]; Array.Copy(response, 601, tmp, 0, 16); pfi.DiskManufacturerSupplementary = StringHandlers.SpacePaddedToString(tmp); - pfi.WritePowerControlParams = new byte[2]; - pfi.WritePowerControlParams[0] = response[617]; - pfi.WritePowerControlParams[1] = response[618]; - pfi.PowerRatioLandThreshold = response[619]; - pfi.TargetAsymmetry = response[620]; - pfi.TemporaryPeakPower = response[621]; - pfi.TemporaryBiasPower1 = response[622]; - pfi.TemporaryBiasPower2 = response[623]; - pfi.TemporaryBiasPower3 = response[624]; - pfi.PowerRatioGrooveThreshold = response[625]; - pfi.PowerRatioLandThreshold6T = response[626]; - pfi.PowerRatioGrooveThreshold6T = response[627]; + pfi.WritePowerControlParams = new byte[2]; + pfi.WritePowerControlParams[0] = response[617]; + pfi.WritePowerControlParams[1] = response[618]; + pfi.PowerRatioLandThreshold = response[619]; + pfi.TargetAsymmetry = response[620]; + pfi.TemporaryPeakPower = response[621]; + pfi.TemporaryBiasPower1 = response[622]; + pfi.TemporaryBiasPower2 = response[623]; + pfi.TemporaryBiasPower3 = response[624]; + pfi.PowerRatioGrooveThreshold = response[625]; + pfi.PowerRatioLandThreshold6T = response[626]; + pfi.PowerRatioGrooveThreshold6T = response[627]; } + break; // DVD-R and DVD-RW - case DiskCategory.DVDR when pfi.PartVersion < 6: + case DiskCategory.DVDR when pfi.PartVersion < 6: case DiskCategory.DVDRW when pfi.PartVersion < 3: pfi.CurrentBorderOutSector = (uint)((response[36] << 24) + (response[37] << 16) + (response[38] << 8) + response[39]); @@ -1209,39 +1211,39 @@ namespace DiscImageChef.Decoders.DVD break; // DVD+RW case DiskCategory.DVDPRW: - pfi.RecordingVelocity = response[36]; + pfi.RecordingVelocity = response[36]; pfi.ReadPowerMaxVelocity = response[37]; - pfi.PIndMaxVelocity = response[38]; - pfi.PMaxVelocity = response[39]; - pfi.E1MaxVelocity = response[40]; - pfi.E2MaxVelocity = response[41]; - pfi.YTargetMaxVelocity = response[42]; + pfi.PIndMaxVelocity = response[38]; + pfi.PMaxVelocity = response[39]; + pfi.E1MaxVelocity = response[40]; + pfi.E2MaxVelocity = response[41]; + pfi.YTargetMaxVelocity = response[42]; pfi.ReadPowerRefVelocity = response[43]; - pfi.PIndRefVelocity = response[44]; - pfi.PRefVelocity = response[45]; - pfi.E1RefVelocity = response[46]; - pfi.E2RefVelocity = response[47]; - pfi.YTargetRefVelocity = response[48]; + pfi.PIndRefVelocity = response[44]; + pfi.PRefVelocity = response[45]; + pfi.E1RefVelocity = response[46]; + pfi.E2RefVelocity = response[47]; + pfi.YTargetRefVelocity = response[48]; pfi.ReadPowerMinVelocity = response[49]; - pfi.PIndMinVelocity = response[50]; - pfi.PMinVelocity = response[51]; - pfi.E1MinVelocity = response[52]; - pfi.E2MinVelocity = response[53]; - pfi.YTargetMinVelocity = response[54]; + pfi.PIndMinVelocity = response[50]; + pfi.PMinVelocity = response[51]; + pfi.E1MinVelocity = response[52]; + pfi.E2MinVelocity = response[53]; + pfi.YTargetMinVelocity = response[54]; break; } // DVD+R, DVD+RW, DVD+R DL and DVD+RW DL - if(pfi.DiskCategory == DiskCategory.DVDPR || pfi.DiskCategory == DiskCategory.DVDPRW || + if(pfi.DiskCategory == DiskCategory.DVDPR || pfi.DiskCategory == DiskCategory.DVDPRW || pfi.DiskCategory == DiskCategory.DVDPRDL || pfi.DiskCategory == DiskCategory.DVDPRWDL) { - pfi.VCPS |= (response[20] & 0x40) == 0x40; - pfi.ApplicationCode = response[21]; - pfi.ExtendedInformation = response[22]; - tmp = new byte[8]; + pfi.VCPS |= (response[20] & 0x40) == 0x40; + pfi.ApplicationCode = response[21]; + pfi.ExtendedInformation = response[22]; + tmp = new byte[8]; Array.Copy(response, 23, tmp, 0, 8); pfi.DiskManufacturerID = StringHandlers.CToString(tmp); - tmp = new byte[3]; + tmp = new byte[3]; Array.Copy(response, 31, tmp, 0, 3); pfi.MediaTypeID = StringHandlers.CToString(tmp); pfi.ProductRevision = @@ -1253,39 +1255,39 @@ namespace DiscImageChef.Decoders.DVD { // DVD+RW case DiskCategory.DVDPRW when pfi.PartVersion == 2: - pfi.TopFirstPulseDuration = response[55]; - pfi.MultiPulseDuration = response[56]; - pfi.FirstPulseLeadTime = response[57]; + pfi.TopFirstPulseDuration = response[55]; + pfi.MultiPulseDuration = response[56]; + pfi.FirstPulseLeadTime = response[57]; pfi.EraseLeadTimeRefVelocity = response[58]; pfi.EraseLeadTimeUppVelocity = response[59]; break; // DVD+R and DVD+R DL case DiskCategory.DVDPR: case DiskCategory.DVDPRDL: - pfi.PrimaryVelocity = response[36]; - pfi.UpperVelocity = response[37]; - pfi.Wavelength = response[38]; - pfi.NormalizedPowerDependency = response[39]; - pfi.MaximumPowerAtPrimaryVelocity = response[40]; - pfi.PindAtPrimaryVelocity = response[41]; - pfi.BtargetAtPrimaryVelocity = response[42]; - pfi.MaximumPowerAtUpperVelocity = response[43]; - pfi.PindAtUpperVelocity = response[44]; - pfi.BtargetAtUpperVelocity = response[45]; - pfi.FirstPulseDuration4TPrimaryVelocity = response[46]; - pfi.FirstPulseDuration3TPrimaryVelocity = response[47]; - pfi.MultiPulseDurationPrimaryVelocity = response[48]; - pfi.LastPulseDurationPrimaryVelocity = response[49]; - pfi.FirstPulseLeadTime4TPrimaryVelocity = response[50]; - pfi.FirstPulseLeadTime3TPrimaryVelocity = response[51]; + pfi.PrimaryVelocity = response[36]; + pfi.UpperVelocity = response[37]; + pfi.Wavelength = response[38]; + pfi.NormalizedPowerDependency = response[39]; + pfi.MaximumPowerAtPrimaryVelocity = response[40]; + pfi.PindAtPrimaryVelocity = response[41]; + pfi.BtargetAtPrimaryVelocity = response[42]; + pfi.MaximumPowerAtUpperVelocity = response[43]; + pfi.PindAtUpperVelocity = response[44]; + pfi.BtargetAtUpperVelocity = response[45]; + pfi.FirstPulseDuration4TPrimaryVelocity = response[46]; + pfi.FirstPulseDuration3TPrimaryVelocity = response[47]; + pfi.MultiPulseDurationPrimaryVelocity = response[48]; + pfi.LastPulseDurationPrimaryVelocity = response[49]; + pfi.FirstPulseLeadTime4TPrimaryVelocity = response[50]; + pfi.FirstPulseLeadTime3TPrimaryVelocity = response[51]; pfi.FirstPulseLeadingEdgePrimaryVelocity = response[52]; - pfi.FirstPulseDuration4TUpperVelocity = response[53]; - pfi.FirstPulseDuration3TUpperVelocity = response[54]; - pfi.MultiPulseDurationUpperVelocity = response[55]; - pfi.LastPulseDurationUpperVelocity = response[56]; - pfi.FirstPulseLeadTime4TUpperVelocity = response[57]; - pfi.FirstPulseLeadTime3TUpperVelocity = response[58]; - pfi.FirstPulseLeadingEdgeUpperVelocity = response[59]; + pfi.FirstPulseDuration4TUpperVelocity = response[53]; + pfi.FirstPulseDuration3TUpperVelocity = response[54]; + pfi.MultiPulseDurationUpperVelocity = response[55]; + pfi.LastPulseDurationUpperVelocity = response[56]; + pfi.FirstPulseLeadTime4TUpperVelocity = response[57]; + pfi.FirstPulseLeadTime3TUpperVelocity = response[58]; + pfi.FirstPulseLeadingEdgeUpperVelocity = response[59]; break; } @@ -1297,48 +1299,48 @@ namespace DiscImageChef.Decoders.DVD break; // DVD+RW DL case DiskCategory.DVDPRWDL: - pfi.BasicPrimaryVelocity = response[36]; + pfi.BasicPrimaryVelocity = response[36]; pfi.MaxReadPowerPrimaryVelocity = response[37]; - pfi.PindPrimaryVelocity = response[38]; - pfi.PPrimaryVelocity = response[39]; - pfi.E1PrimaryVelocity = response[40]; - pfi.E2PrimaryVelocity = response[41]; - pfi.YtargetPrimaryVelocity = response[42]; - pfi.BOptimumPrimaryVelocity = response[43]; - pfi.TFirstPulseDuration = response[46]; - pfi.TMultiPulseDuration = response[47]; - pfi.FirstPulseLeadTimeAnyRun = response[48]; - pfi.FirstPulseLeadTimeRun3T = response[49]; - pfi.LastPulseLeadTimeAnyRun = response[50]; - pfi.LastPulseLeadTime3T = response[51]; - pfi.LastPulseLeadTime4T = response[52]; - pfi.ErasePulseLeadTimeAny = response[53]; - pfi.ErasePulseLeadTime3T = response[54]; - pfi.ErasePulseLeadTime4T = response[55]; + pfi.PindPrimaryVelocity = response[38]; + pfi.PPrimaryVelocity = response[39]; + pfi.E1PrimaryVelocity = response[40]; + pfi.E2PrimaryVelocity = response[41]; + pfi.YtargetPrimaryVelocity = response[42]; + pfi.BOptimumPrimaryVelocity = response[43]; + pfi.TFirstPulseDuration = response[46]; + pfi.TMultiPulseDuration = response[47]; + pfi.FirstPulseLeadTimeAnyRun = response[48]; + pfi.FirstPulseLeadTimeRun3T = response[49]; + pfi.LastPulseLeadTimeAnyRun = response[50]; + pfi.LastPulseLeadTime3T = response[51]; + pfi.LastPulseLeadTime4T = response[52]; + pfi.ErasePulseLeadTimeAny = response[53]; + pfi.ErasePulseLeadTime3T = response[54]; + pfi.ErasePulseLeadTime4T = response[55]; break; // DVD-R DL and DVD-RW DL - case DiskCategory.DVDR when pfi.PartVersion == 6: + case DiskCategory.DVDR when pfi.PartVersion == 6: case DiskCategory.DVDRW when pfi.PartVersion == 3: pfi.MaxRecordingSpeed = (DVDRecordingSpeed)response[21]; pfi.MinRecordingSpeed = (DVDRecordingSpeed)response[22]; - pfi.RecordingSpeed1 = (DVDRecordingSpeed)response[23]; - pfi.RecordingSpeed2 = (DVDRecordingSpeed)response[24]; - pfi.RecordingSpeed3 = (DVDRecordingSpeed)response[25]; - pfi.RecordingSpeed4 = (DVDRecordingSpeed)response[26]; - pfi.RecordingSpeed5 = (DVDRecordingSpeed)response[27]; - pfi.RecordingSpeed6 = (DVDRecordingSpeed)response[28]; - pfi.RecordingSpeed7 = (DVDRecordingSpeed)response[29]; - pfi.Class = response[30]; - pfi.ExtendedVersion = response[31]; + pfi.RecordingSpeed1 = (DVDRecordingSpeed)response[23]; + pfi.RecordingSpeed2 = (DVDRecordingSpeed)response[24]; + pfi.RecordingSpeed3 = (DVDRecordingSpeed)response[25]; + pfi.RecordingSpeed4 = (DVDRecordingSpeed)response[26]; + pfi.RecordingSpeed5 = (DVDRecordingSpeed)response[27]; + pfi.RecordingSpeed6 = (DVDRecordingSpeed)response[28]; + pfi.RecordingSpeed7 = (DVDRecordingSpeed)response[29]; + pfi.Class = response[30]; + pfi.ExtendedVersion = response[31]; pfi.CurrentBorderOutSector = (uint)((response[36] << 24) + (response[37] << 16) + (response[38] << 8) + response[39]); pfi.NextBorderInSector = (uint)((response[40] << 24) + (response[41] << 16) + (response[42] << 8) + response[43]); - pfi.PreRecordedControlDataInv |= (response[44] & 0x01) == 0x01; - pfi.PreRecordedLeadIn |= (response[44] & 0x02) == 0x02; - pfi.PreRecordedLeadOut |= (response[44] & 0x08) == 0x08; - pfi.ARCharLayer1 = (byte)(response[45] & 0x0F); - pfi.TrackPolarityLayer1 = (byte)((response[45] & 0xF0) >> 4); + pfi.PreRecordedControlDataInv |= (response[44] & 0x01) == 0x01; + pfi.PreRecordedLeadIn |= (response[44] & 0x02) == 0x02; + pfi.PreRecordedLeadOut |= (response[44] & 0x08) == 0x08; + pfi.ARCharLayer1 = (byte)(response[45] & 0x0F); + pfi.TrackPolarityLayer1 = (byte)((response[45] & 0xF0) >> 4); break; } @@ -1350,7 +1352,7 @@ namespace DiscImageChef.Decoders.DVD if(pfi == null) return null; PhysicalFormatInformation decoded = pfi.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); string sizeString; switch(decoded.DiscSize) @@ -1541,7 +1543,7 @@ namespace DiscImageChef.Decoders.DVD } sb.AppendFormat("Disc has {0} layers", decoded.Layers + 1).AppendLine(); - if(decoded.TrackPath && decoded.Layers == 1) sb.AppendLine("Layers are in parallel track path"); + if(decoded.TrackPath && decoded.Layers == 1) sb.AppendLine("Layers are in parallel track path"); else if(!decoded.TrackPath && decoded.Layers == 1) sb.AppendLine("Layers are in opposite track path"); switch(decoded.LinearDensity) @@ -1602,7 +1604,8 @@ namespace DiscImageChef.Decoders.DVD if(decoded.Layers == 1 && !decoded.TrackPath) sb.AppendFormat("Layer 0 ends at PSN {0:X}h", decoded.Layer0EndPSN).AppendLine(); } - else sb.AppendLine("Disc is empty"); + else + sb.AppendLine("Disc is empty"); else sb.AppendLine("Disc is empty"); if(decoded.BCA) sb.AppendLine("Disc has a burst cutting area"); @@ -1632,8 +1635,9 @@ namespace DiscImageChef.Decoders.DVD sb.AppendFormat("Disc manufacturer supplementary information is {0}", decoded.DiskManufacturerSupplementary).AppendLine(); } + break; - case DiskCategory.DVDR when decoded.PartVersion < 6: + case DiskCategory.DVDR when decoded.PartVersion < 6: case DiskCategory.DVDRW when decoded.PartVersion < 3: sb.AppendFormat("Current Border-Out first sector is PSN {0:X}h", decoded.CurrentBorderOutSector) .AppendLine(); @@ -1652,7 +1656,7 @@ namespace DiscImageChef.Decoders.DVD break; } - if((decoded.DiskCategory != DiskCategory.DVDR || decoded.PartVersion < 6) && + if((decoded.DiskCategory != DiskCategory.DVDR || decoded.PartVersion < 6) && (decoded.DiskCategory != DiskCategory.DVDRW || decoded.PartVersion < 3)) return sb.ToString(); sb.AppendFormat("Current RMD in extra Border zone starts at PSN {0:X}h", decoded.CurrentRMDExtraBorderPSN) diff --git a/DVD/Spare.cs b/DVD/Spare.cs index d65031766..e911d4e70 100644 --- a/DVD/Spare.cs +++ b/DVD/Spare.cs @@ -97,8 +97,8 @@ namespace DiscImageChef.Decoders.DVD return new SpareAreaInformation { DataLength = (ushort)((response[0] << 8) + response[1]), - Reserved1 = response[2], - Reserved2 = response[3], + Reserved1 = response[2], + Reserved2 = response[3], UnusedPrimaryBlocks = (uint)((response[4] << 24) + (response[5] << 16) + (response[6] << 8) + response[7]), UnusedSupplementaryBlocks = @@ -113,7 +113,7 @@ namespace DiscImageChef.Decoders.DVD if(sai == null) return null; SpareAreaInformation decoded = sai.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendFormat("{0} unused primary spare blocks", decoded.UnusedPrimaryBlocks).AppendLine(); sb.AppendFormat("{0} unused supplementary spare blocks", decoded.UnusedSupplementaryBlocks).AppendLine(); diff --git a/Floppy/Amiga.cs b/Floppy/Amiga.cs index 7a03444ca..b6afce43b 100644 --- a/Floppy/Amiga.cs +++ b/Floppy/Amiga.cs @@ -48,11 +48,13 @@ namespace DiscImageChef.Decoders.Floppy /// /// Set to 0x00 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] zero; /// /// Set to 0xA1 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] sync; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] sync; /// /// Set to 0xFF /// @@ -72,7 +74,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// OS dependent tag /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] label; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] label; /// /// Checksum from to /// @@ -81,7 +84,8 @@ namespace DiscImageChef.Decoders.Floppy /// Checksum from /// public uint dataChecksum; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] public byte[] data; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] + public byte[] data; } } } \ No newline at end of file diff --git a/Floppy/Apple2.cs b/Floppy/Apple2.cs index 951864525..29ff2e178 100644 --- a/Floppy/Apple2.cs +++ b/Floppy/Apple2.cs @@ -93,33 +93,39 @@ namespace DiscImageChef.Decoders.Floppy /// checksum[0] = (decodedChecksum >> 1) | 0xAA /// checksum[1] = decodedChecksum | 0xAA /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] checksum; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] checksum; /// /// Always 0xDE, 0xAA, 0xEB /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] epilogue; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] epilogue; /// /// Always 0xD5, 0xAA, 0x96 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] prologue; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] prologue; /// /// Sector number encoded as: /// sector[0] = (decodedSector >> 1) | 0xAA /// sector[1] = decodedSector | 0xAA /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] sector; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] sector; /// /// Track number encoded as: /// track[0] = (decodedTrack >> 1) | 0xAA /// track[1] = decodedTrack | 0xAA /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] track; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] track; /// /// Volume number encoded as: /// volume[0] = (decodedVolume >> 1) | 0xAA /// volume[1] = decodedVolume | 0xAA /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] volume; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] volume; } /// @@ -137,11 +143,13 @@ namespace DiscImageChef.Decoders.Floppy /// /// Always 0xDE, 0xAA, 0xEB /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] epilogue; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] epilogue; /// /// Always 0xD5, 0xAA, 0xAD /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] prologue; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] prologue; } static readonly byte[] ReadTable5and3 = @@ -225,11 +233,11 @@ namespace DiscImageChef.Decoders.Floppy if(data == null || data.Length != 410) return null; byte[] buffer = new byte[data.Length]; - byte carry = 0; + byte carry = 0; for(int i = 0; i < data.Length; i++) { - carry ^= ReadTable5and3[data[i]]; - buffer[i] = carry; + carry ^= ReadTable5and3[data[i]]; + buffer[i] = carry; } byte[] output = new byte[256]; @@ -237,14 +245,14 @@ namespace DiscImageChef.Decoders.Floppy { byte b1 = buffer[51 * 3 - i]; byte b2 = buffer[51 * 2 - i]; - byte b3 = buffer[51 - i]; - byte b4 = (byte)((((b1 & 2) << 1) | (b2 & 2) | ((b3 & 2) >> 1)) & 0xFF); - byte b5 = (byte)((((b1 & 1) << 2) | ((b2 & 1) << 1) | (b3 & 1)) & 0xFF); + byte b3 = buffer[51 - i]; + byte b4 = (byte)((((b1 & 2) << 1) | (b2 & 2) | ((b3 & 2) >> 1)) & 0xFF); + byte b5 = (byte)((((b1 & 1) << 2) | ((b2 & 1) << 1) | (b3 & 1)) & 0xFF); output[250 - 5 * i] = (byte)(((buffer[i + 51 * 3 + 1] << 3) | ((b1 >> 2) & 0x7)) & 0xFF); output[251 - 5 * i] = (byte)(((buffer[i + 51 * 4 + 1] << 3) | ((b2 >> 2) & 0x7)) & 0xFF); output[252 - 5 * i] = (byte)(((buffer[i + 51 * 5 + 1] << 3) | ((b3 >> 2) & 0x7)) & 0xFF); - output[253 - 5 * i] = (byte)(((buffer[i + 51 * 6 + 1] << 3) | b4) & 0xFF); - output[254 - 5 * i] = (byte)(((buffer[i + 51 * 7 + 1] << 3) | b5) & 0xFF); + output[253 - 5 * i] = (byte)(((buffer[i + 51 * 6 + 1] << 3) | b4) & 0xFF); + output[254 - 5 * i] = (byte)(((buffer[i + 51 * 7 + 1] << 3) | b5) & 0xFF); } output[255] = (byte)(((buffer[409] << 3) | (buffer[0] & 0x7)) & 0xFF); @@ -261,11 +269,11 @@ namespace DiscImageChef.Decoders.Floppy if(data == null || data.Length != 342) return null; byte[] buffer = new byte[data.Length]; - byte carry = 0; + byte carry = 0; for(int i = 0; i < data.Length; i++) { - carry ^= ReadTable6and2[data[i]]; - buffer[i] = carry; + carry ^= ReadTable6and2[data[i]]; + buffer[i] = carry; } byte[] output = new byte[256]; @@ -296,8 +304,10 @@ namespace DiscImageChef.Decoders.Floppy public static byte[] DecodeSector(RawSector sector) { if(sector.addressField.prologue[0] != 0xD5 || sector.addressField.prologue[1] != 0xAA) return null; + // Pre DOS 3.3 if(sector.addressField.prologue[2] == 0xB5) return Decode5and3(sector.dataField.data); + // DOS 3.3 return sector.addressField.prologue[2] == 0x96 ? Decode6and2(sector.dataField.data) : null; // Unknown @@ -336,11 +346,12 @@ namespace DiscImageChef.Decoders.Floppy addressField = new RawAddressField { prologue = new[] {data[position], data[position + 1], data[position + 2]}, - volume = new[] {data[position + 3], data[position + 4]}, - track = new[] {data[position + 5], data[position + 6]}, - sector = new[] {data[position + 7], data[position + 8]}, - checksum = new[] {data[position + 9], data[position + 10]}, - epilogue = new[] {data[position + 11], data[position + 12], data[position + 13]} + volume = new[] {data[position + 3], data[position + 4]}, + track = new[] {data[position + 5], data[position + 6]}, + sector = new[] {data[position + 7], data[position + 8]}, + checksum = new[] {data[position + 9], data[position + 10]}, + epilogue = new[] + {data[position + 11], data[position + 12], data[position + 13]} } }; @@ -361,9 +372,9 @@ namespace DiscImageChef.Decoders.Floppy sector.addressField.epilogue[2]); position += 14; - int syncCount = 0; - bool onSync = false; - MemoryStream gaps = new MemoryStream(); + int syncCount = 0; + bool onSync = false; + MemoryStream gaps = new MemoryStream(); while(data[position] == 0xFF) { @@ -379,17 +390,17 @@ namespace DiscImageChef.Decoders.Floppy // Prologue not found if(data[position] != 0xD5 || data[position + 1] != 0xAA) return null; - sector.innerGap = gaps.ToArray(); + sector.innerGap = gaps.ToArray(); sector.dataField = new RawDataField(); DicConsole.DebugWriteLine("Apple ][ GCR Decoder", "Inner gap has {0} bytes", sector.innerGap.Length); DicConsole.DebugWriteLine("Apple ][ GCR Decoder", "Prologue found at {0}", position); - sector.dataField.prologue = new byte[3]; - sector.dataField.prologue[0] = data[position]; - sector.dataField.prologue[1] = data[position + 1]; - sector.dataField.prologue[2] = data[position + 2]; - position += 3; + sector.dataField.prologue = new byte[3]; + sector.dataField.prologue[0] = data[position]; + sector.dataField.prologue[1] = data[position + 1]; + sector.dataField.prologue[2] = data[position + 2]; + position += 3; gaps = new MemoryStream(); // Read data until epilogue is found @@ -405,14 +416,14 @@ namespace DiscImageChef.Decoders.Floppy sector.dataField.data = gaps.ToArray(); DicConsole.DebugWriteLine("Apple ][ GCR Decoder", "Data has {0} bytes", sector.dataField.data.Length); - sector.dataField.checksum = data[position]; - sector.dataField.epilogue = new byte[3]; + sector.dataField.checksum = data[position]; + sector.dataField.epilogue = new byte[3]; sector.dataField.epilogue[0] = data[position + 1]; sector.dataField.epilogue[1] = data[position + 2]; sector.dataField.epilogue[2] = data[position + 3]; position += 4; - gaps = new MemoryStream(); + gaps = new MemoryStream(); // Read gap, if any while(position < data.Length && data[position] == 0xFF) { @@ -430,7 +441,7 @@ namespace DiscImageChef.Decoders.Floppy sector.gap = gaps.ToArray(); // Return current position to be able to read separate sectors endOffset = position; - DicConsole.DebugWriteLine("Apple ][ GCR Decoder", "Got {0} bytes of gap", sector.gap.Length); + DicConsole.DebugWriteLine("Apple ][ GCR Decoder", "Got {0} bytes of gap", sector.gap.Length); DicConsole.DebugWriteLine("Apple ][ GCR Decoder", "Finished sector at {0}", position); return sector; } @@ -451,9 +462,9 @@ namespace DiscImageChef.Decoders.Floppy MemoryStream raw = new MemoryStream(); raw.Write(addressField.prologue, 0, addressField.prologue.Length); - raw.Write(addressField.volume, 0, addressField.volume.Length); - raw.Write(addressField.track, 0, addressField.track.Length); - raw.Write(addressField.sector, 0, addressField.sector.Length); + raw.Write(addressField.volume, 0, addressField.volume.Length); + raw.Write(addressField.track, 0, addressField.track.Length); + raw.Write(addressField.sector, 0, addressField.sector.Length); raw.Write(addressField.checksum, 0, addressField.checksum.Length); raw.Write(addressField.epilogue, 0, addressField.epilogue.Length); @@ -466,17 +477,17 @@ namespace DiscImageChef.Decoders.Floppy MemoryStream raw = new MemoryStream(); raw.Write(sector.addressField.prologue, 0, sector.addressField.prologue.Length); - raw.Write(sector.addressField.volume, 0, sector.addressField.volume.Length); - raw.Write(sector.addressField.track, 0, sector.addressField.track.Length); - raw.Write(sector.addressField.sector, 0, sector.addressField.sector.Length); + raw.Write(sector.addressField.volume, 0, sector.addressField.volume.Length); + raw.Write(sector.addressField.track, 0, sector.addressField.track.Length); + raw.Write(sector.addressField.sector, 0, sector.addressField.sector.Length); raw.Write(sector.addressField.checksum, 0, sector.addressField.checksum.Length); raw.Write(sector.addressField.epilogue, 0, sector.addressField.epilogue.Length); - raw.Write(sector.innerGap, 0, sector.innerGap.Length); - raw.Write(sector.dataField.prologue, 0, sector.dataField.prologue.Length); - raw.Write(sector.dataField.data, 0, sector.dataField.data.Length); + raw.Write(sector.innerGap, 0, sector.innerGap.Length); + raw.Write(sector.dataField.prologue, 0, sector.dataField.prologue.Length); + raw.Write(sector.dataField.data, 0, sector.dataField.data.Length); raw.WriteByte(sector.dataField.checksum); raw.Write(sector.dataField.epilogue, 0, sector.dataField.epilogue.Length); - raw.Write(sector.gap, 0, sector.gap.Length); + raw.Write(sector.gap, 0, sector.gap.Length); return raw.ToArray(); } @@ -488,13 +499,13 @@ namespace DiscImageChef.Decoders.Floppy public static RawTrack MarshalTrack(byte[] data, out int endOffset, int offset = 0) { - int position = offset; - bool firstSector = true; - bool onSync = false; - MemoryStream gaps = new MemoryStream(); - int count = 0; - List sectors = new List(); - byte[] trackNumber = new byte[2]; + int position = offset; + bool firstSector = true; + bool onSync = false; + MemoryStream gaps = new MemoryStream(); + int count = 0; + List sectors = new List(); + byte[] trackNumber = new byte[2]; endOffset = offset; while(position < data.Length && data[position] == 0xFF) @@ -511,15 +522,15 @@ namespace DiscImageChef.Decoders.Floppy while(position < data.Length) { - int oldPosition = position; - RawSector sector = MarshalSector(data, out position, position); + int oldPosition = position; + RawSector sector = MarshalSector(data, out position, position); if(sector == null) break; if(firstSector) { trackNumber[0] = sector.addressField.track[0]; trackNumber[1] = sector.addressField.track[1]; - firstSector = false; + firstSector = false; } if(sector.addressField.track[0] != trackNumber[0] || sector.addressField.track[1] != trackNumber[1]) @@ -562,8 +573,8 @@ namespace DiscImageChef.Decoders.Floppy public static List MarshalDisk(byte[] data, out int endOffset, int offset = 0) { endOffset = offset; - List tracks = new List(); - int position = offset; + List tracks = new List(); + int position = offset; RawTrack track = MarshalTrack(data, out position, position); while(track != null) diff --git a/Floppy/AppleSony.cs b/Floppy/AppleSony.cs index a463a306f..1481062d0 100644 --- a/Floppy/AppleSony.cs +++ b/Floppy/AppleSony.cs @@ -98,7 +98,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// Always 0xDE, 0xAA /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] epilogue; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] epilogue; /// /// Disk format /// @@ -106,7 +107,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// Always 0xD5, 0xAA, 0x96 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] prologue; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] prologue; /// /// Encoded sector number /// @@ -129,19 +131,23 @@ namespace DiscImageChef.Decoders.Floppy /// /// Checksum /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] checksum; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public byte[] checksum; /// /// Encoded data bytes. /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 698)] public byte[] data; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 698)] + public byte[] data; /// /// Always 0xDE, 0xAA /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] epilogue; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] epilogue; /// /// Always 0xD5, 0xAA, 0xAD /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] prologue; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] prologue; /// /// Spare, usually /// @@ -153,13 +159,13 @@ namespace DiscImageChef.Decoders.Floppy if(sector.addressField.prologue[0] != 0xD5 || sector.addressField.prologue[1] != 0xAA || sector.addressField.prologue[2] != 0x96) return null; - byte[] bf1 = new byte[175]; - byte[] bf2 = new byte[175]; - byte[] bf3 = new byte[175]; - byte[] nib_data = sector.dataField.data; - MemoryStream ms = new MemoryStream(); + byte[] bf1 = new byte[175]; + byte[] bf2 = new byte[175]; + byte[] bf3 = new byte[175]; + byte[] nib_data = sector.dataField.data; + MemoryStream ms = new MemoryStream(); - int j = 0; + int j = 0; byte w3 = 0; for(int i = 0; i <= 174; i++) { @@ -190,26 +196,29 @@ namespace DiscImageChef.Decoders.Floppy ck3++; ck1 &= 0xFF; } + ms.WriteByte(carry); - carry = (byte)((bf2[j] ^ ck3) & 0xFF); - ck2 += carry; + carry = (byte)((bf2[j] ^ ck3) & 0xFF); + ck2 += carry; if(ck3 > 0xFF) { ck2++; ck3 &= 0xFF; } + ms.WriteByte(carry); if(ms.Length == 524) break; - carry = (byte)((bf3[j] ^ ck2) & 0xFF); - ck1 += carry; + carry = (byte)((bf3[j] ^ ck2) & 0xFF); + ck1 += carry; if(ck2 > 0xFF) { ck1++; ck2 &= 0xFF; } + ms.WriteByte(carry); j++; } @@ -248,19 +257,19 @@ namespace DiscImageChef.Decoders.Floppy addressField = new RawAddressField { prologue = new[] {data[position], data[position + 1], data[position + 2]}, - track = data[position + 3], - sector = data[position + 4], - side = data[position + 5], - format = (AppleEncodedFormat)data[position + 6], + track = data[position + 3], + sector = data[position + 4], + side = data[position + 5], + format = (AppleEncodedFormat)data[position + 6], checksum = data[position + 7], epilogue = new[] {data[position + 8], data[position + 9]} } }; position += 10; - int syncCount = 0; - bool onSync = false; - MemoryStream gaps = new MemoryStream(); + int syncCount = 0; + bool onSync = false; + MemoryStream gaps = new MemoryStream(); while(data[position] == 0xFF) { @@ -281,7 +290,7 @@ namespace DiscImageChef.Decoders.Floppy sector.dataField = new RawDataField { prologue = new[] {data[position], data[position + 1], data[position + 2]}, - spare = data[position + 3] + spare = data[position + 3] }; position += 4; @@ -296,18 +305,18 @@ namespace DiscImageChef.Decoders.Floppy if(position + 7 > data.Length) return null; } - sector.dataField.data = gaps.ToArray(); - sector.dataField.checksum = new byte[4]; + sector.dataField.data = gaps.ToArray(); + sector.dataField.checksum = new byte[4]; sector.dataField.checksum[0] = data[position]; sector.dataField.checksum[1] = data[position + 2]; sector.dataField.checksum[2] = data[position + 3]; sector.dataField.checksum[3] = data[position + 4]; - sector.dataField.epilogue = new byte[2]; + sector.dataField.epilogue = new byte[2]; sector.dataField.epilogue[0] = data[position + 5]; sector.dataField.epilogue[1] = data[position + 6]; position += 7; - gaps = new MemoryStream(); + gaps = new MemoryStream(); // Read gap, if any while(position < data.Length && data[position] == 0xFF) { @@ -364,13 +373,13 @@ namespace DiscImageChef.Decoders.Floppy raw.WriteByte(sector.addressField.side); raw.WriteByte((byte)sector.addressField.format); raw.WriteByte(sector.addressField.checksum); - raw.Write(sector.innerGap, 0, sector.innerGap.Length); + raw.Write(sector.innerGap, 0, sector.innerGap.Length); raw.Write(sector.dataField.prologue, 0, sector.dataField.prologue.Length); raw.WriteByte(sector.dataField.spare); - raw.Write(sector.dataField.data, 0, sector.dataField.data.Length); + raw.Write(sector.dataField.data, 0, sector.dataField.data.Length); raw.Write(sector.dataField.checksum, 0, sector.dataField.checksum.Length); raw.Write(sector.dataField.epilogue, 0, sector.dataField.epilogue.Length); - raw.Write(sector.gap, 0, sector.gap.Length); + raw.Write(sector.gap, 0, sector.gap.Length); return raw.ToArray(); } @@ -382,14 +391,14 @@ namespace DiscImageChef.Decoders.Floppy public static RawTrack MarshalTrack(byte[] data, out int endOffset, int offset = 0) { - int position = offset; - bool firstSector = true; - bool onSync = false; - MemoryStream gaps = new MemoryStream(); - int count = 0; - List sectors = new List(); - byte trackNumber = 0; - byte sideNumber = 0; + int position = offset; + bool firstSector = true; + bool onSync = false; + MemoryStream gaps = new MemoryStream(); + int count = 0; + List sectors = new List(); + byte trackNumber = 0; + byte sideNumber = 0; endOffset = offset; while(position < data.Length && data[position] == 0xFF) @@ -406,14 +415,14 @@ namespace DiscImageChef.Decoders.Floppy while(position < data.Length) { - int oldPosition = position; - RawSector sector = MarshalSector(data, out position, position); + int oldPosition = position; + RawSector sector = MarshalSector(data, out position, position); if(sector == null) break; if(firstSector) { trackNumber = sector.addressField.track; - sideNumber = sector.addressField.side; + sideNumber = sector.addressField.side; firstSector = false; } @@ -452,8 +461,8 @@ namespace DiscImageChef.Decoders.Floppy public static List MarshalDisk(byte[] data, out int endOffset, int offset = 0) { endOffset = offset; - List tracks = new List(); - int position = offset; + List tracks = new List(); + int position = offset; RawTrack track = MarshalTrack(data, out position, position); while(track != null) diff --git a/Floppy/Commodore.cs b/Floppy/Commodore.cs index ec417a8d2..dd560f9a0 100644 --- a/Floppy/Commodore.cs +++ b/Floppy/Commodore.cs @@ -86,7 +86,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// User data /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte data; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] + public byte data; /// /// XOR of /// diff --git a/Floppy/Enums.cs b/Floppy/Enums.cs index 619064f22..1a4030ad3 100644 --- a/Floppy/Enums.cs +++ b/Floppy/Enums.cs @@ -77,9 +77,9 @@ namespace DiscImageChef.Decoders.Floppy [SuppressMessage("ReSharper", "InconsistentNaming")] public enum IBMIdType : byte { - IndexMark = 0xFC, - AddressMark = 0xFE, - DataMark = 0xFB, + IndexMark = 0xFC, + AddressMark = 0xFE, + DataMark = 0xFB, DeletedDataMark = 0xF8 } diff --git a/Floppy/ISO.cs b/Floppy/ISO.cs index bd1e30b7e..17bc76668 100644 --- a/Floppy/ISO.cs +++ b/Floppy/ISO.cs @@ -61,7 +61,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// Start of track, 32 bytes set to 0x4E /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] innerGap; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] innerGap; /// /// Track sectors /// @@ -84,7 +85,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// 22 bytes set to 0x4E, set to 0x22 on Commodore 1581 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)] public byte[] innerGap; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)] + public byte[] innerGap; /// /// Sector data block /// @@ -103,11 +105,13 @@ namespace DiscImageChef.Decoders.Floppy /// /// 12 bytes set to 0 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; /// /// 3 bytes set to 0xA1 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; /// /// Set to /// @@ -142,11 +146,13 @@ namespace DiscImageChef.Decoders.Floppy /// /// 12 bytes set to 0 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; /// /// 3 bytes set to 0xA1 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; /// /// Set to or to /// diff --git a/Floppy/Perpendicular.cs b/Floppy/Perpendicular.cs index 5ea3ae6cd..eb97e3e94 100644 --- a/Floppy/Perpendicular.cs +++ b/Floppy/Perpendicular.cs @@ -84,7 +84,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// 41 bytes set to 0x4E /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 41)] public byte[] innerGap; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 41)] + public byte[] innerGap; /// /// Sector data block /// @@ -104,15 +105,18 @@ namespace DiscImageChef.Decoders.Floppy /// /// Gap from index pulse, 80 bytes set to 0x4E /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] public byte[] gap; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] + public byte[] gap; /// /// 12 bytes set to 0x00 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; /// /// 3 bytes set to 0xC2 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] ctwo; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] ctwo; /// /// Set to /// @@ -120,7 +124,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// Gap until first sector, 50 bytes to 0x4E /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] public byte[] gap1; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] + public byte[] gap1; } /// @@ -131,11 +136,13 @@ namespace DiscImageChef.Decoders.Floppy /// /// 12 bytes set to 0 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; /// /// 3 bytes set to 0xA1 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; /// /// Set to /// @@ -170,11 +177,13 @@ namespace DiscImageChef.Decoders.Floppy /// /// 12 bytes set to 0 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; /// /// 3 bytes set to 0xA1 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; /// /// Set to or to /// diff --git a/Floppy/System34.cs b/Floppy/System34.cs index bc9342b68..6338727ab 100644 --- a/Floppy/System34.cs +++ b/Floppy/System34.cs @@ -82,15 +82,18 @@ namespace DiscImageChef.Decoders.Floppy /// /// Gap from index pulse, 80 bytes set to 0x4E /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] public byte[] gap; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] + public byte[] gap; /// /// 12 bytes set to 0x00 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; /// /// 3 bytes set to 0xC2 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] ctwo; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] ctwo; /// /// Set to /// @@ -98,7 +101,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// Gap until first sector, 50 bytes to 0x4E /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] public byte[] gap1; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] + public byte[] gap1; } /// @@ -113,7 +117,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// 22 bytes set to 0x4E, set to 0x22 on Commodore 1581 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)] public byte[] innerGap; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)] + public byte[] innerGap; /// /// Sector data block /// @@ -132,11 +137,13 @@ namespace DiscImageChef.Decoders.Floppy /// /// 12 bytes set to 0 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; /// /// 3 bytes set to 0xA1 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; /// /// Set to /// @@ -171,11 +178,13 @@ namespace DiscImageChef.Decoders.Floppy /// /// 12 bytes set to 0 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; /// /// 3 bytes set to 0xA1 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] aone; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; /// /// Set to or to /// diff --git a/Floppy/System3740.cs b/Floppy/System3740.cs index 41a884cf9..e84062751 100644 --- a/Floppy/System3740.cs +++ b/Floppy/System3740.cs @@ -80,11 +80,13 @@ namespace DiscImageChef.Decoders.Floppy /// /// Gap from index pulse, 80 bytes set to 0xFF /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] public byte[] gap; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] + public byte[] gap; /// /// 6 bytes set to 0x00 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] zero; /// /// Set to /// @@ -92,7 +94,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// Gap until first sector, 26 bytes to 0xFF /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)] public byte[] gap1; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)] + public byte[] gap1; } /// @@ -107,7 +110,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// 11 bytes set to 0xFF /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] public byte[] innerGap; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] + public byte[] innerGap; /// /// Sector data block /// @@ -126,7 +130,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// 6 bytes set to 0 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] zero; /// /// Set to /// @@ -161,7 +166,8 @@ namespace DiscImageChef.Decoders.Floppy /// /// 12 bytes set to 0 /// - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] zero; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; /// /// Set to or to /// diff --git a/LisaTag.cs b/LisaTag.cs index c09caf070..1a4156fb6 100644 --- a/LisaTag.cs +++ b/LisaTag.cs @@ -149,7 +149,7 @@ namespace DiscImageChef.Decoders tmp = BigEndianBitConverter.GetBytes((ushort)(UsedBytes & 0x7FFF)); Array.Copy(tmp, 0, tagBytes, 6, 2); if(ValidChk) tagBytes[6] += 0x80; - tmp = BigEndianBitConverter.GetBytes(AbsPage); + tmp = BigEndianBitConverter.GetBytes(AbsPage); Array.Copy(tmp, 1, tagBytes, 8, 3); tagBytes[11] = Checksum; tmp = BigEndianBitConverter.GetBytes(RelPage); @@ -276,7 +276,7 @@ namespace DiscImageChef.Decoders tmp = BigEndianBitConverter.GetBytes((ushort)(UsedBytes & 0x7FFF)); Array.Copy(tmp, 0, tagBytes, 6, 2); if(ValidChk) tagBytes[6] += 0x80; - tmp = BigEndianBitConverter.GetBytes(AbsPage); + tmp = BigEndianBitConverter.GetBytes(AbsPage); Array.Copy(tmp, 1, tagBytes, 8, 3); tagBytes[11] = Checksum; tmp = BigEndianBitConverter.GetBytes(RelPage); @@ -399,10 +399,10 @@ namespace DiscImageChef.Decoders snTag.Version = BigEndianBitConverter.ToUInt16(tag, 0); snTag.Kind = (byte)((tag[2] & 0xC0) >> 6); - snTag.Reserved = (byte)(tag[2] & 0x3F); + snTag.Reserved = (byte)(tag[2] & 0x3F); snTag.Volume = tag[3]; snTag.FileId = BigEndianBitConverter.ToInt16(tag, 4); - snTag.RelPage = BigEndianBitConverter.ToUInt16(tag, 6); + snTag.RelPage = BigEndianBitConverter.ToUInt16(tag, 6); snTag.NextBlock = (ushort)(BigEndianBitConverter.ToUInt16(tag, 8) & 0x7FF); snTag.PrevBlock = (ushort)(BigEndianBitConverter.ToUInt16(tag, 10) & 0x7FF); @@ -424,7 +424,7 @@ namespace DiscImageChef.Decoders phTag.Version = BigEndianBitConverter.ToUInt16(tag, 0); phTag.Kind = (byte)((tag[2] & 0xC0) >> 6); - phTag.Reserved = (byte)(tag[2] & 0x3F); + phTag.Reserved = (byte)(tag[2] & 0x3F); phTag.Volume = tag[3]; phTag.FileId = BigEndianBitConverter.ToInt16(tag, 4); phTag.ValidChk |= (tag[6] & 0x80) == 0x80; @@ -469,7 +469,7 @@ namespace DiscImageChef.Decoders pmTag.Version = BigEndianBitConverter.ToUInt16(tag, 0); pmTag.Kind = (byte)((tag[2] & 0xC0) >> 6); - pmTag.Reserved = (byte)(tag[2] & 0x3F); + pmTag.Reserved = (byte)(tag[2] & 0x3F); pmTag.Volume = tag[3]; pmTag.FileId = BigEndianBitConverter.ToInt16(tag, 4); pmTag.ValidChk |= (tag[6] & 0x80) == 0x80; diff --git a/MMC/CID.cs b/MMC/CID.cs index ec64f88d8..8399abff2 100644 --- a/MMC/CID.cs +++ b/MMC/CID.cs @@ -42,14 +42,14 @@ namespace DiscImageChef.Decoders.MMC [SuppressMessage("ReSharper", "UnassignedField.Global")] public class CID { - public byte Manufacturer; - public byte DeviceType; - public byte ApplicationID; + public byte Manufacturer; + public byte DeviceType; + public byte ApplicationID; public string ProductName; - public byte ProductRevision; - public uint ProductSerialNumber; - public byte ManufacturingDate; - public byte CRC; + public byte ProductRevision; + public uint ProductSerialNumber; + public byte ManufacturingDate; + public byte CRC; } [SuppressMessage("ReSharper", "InconsistentNaming")] @@ -81,12 +81,12 @@ namespace DiscImageChef.Decoders.MMC CID cid = new CID { - Manufacturer = response[0], - DeviceType = (byte)(response[1] & 0x03), - ProductRevision = response[9], + Manufacturer = response[0], + DeviceType = (byte)(response[1] & 0x03), + ProductRevision = response[9], ProductSerialNumber = BitConverter.ToUInt32(response, 10), - ManufacturingDate = response[14], - CRC = (byte)((response[15] & 0xFE) >> 1) + ManufacturingDate = response[14], + CRC = (byte)((response[15] & 0xFE) >> 1) }; byte[] tmp = new byte[6]; Array.Copy(response, 3, tmp, 0, 6); diff --git a/MMC/CSD.cs b/MMC/CSD.cs index dffe3928d..38f601877 100644 --- a/MMC/CSD.cs +++ b/MMC/CSD.cs @@ -42,39 +42,39 @@ namespace DiscImageChef.Decoders.MMC [SuppressMessage("ReSharper", "NotAccessedField.Global")] public class CSD { - public byte Structure; - public byte Version; - public byte TAAC; - public byte NSAC; - public byte Speed; + public byte Structure; + public byte Version; + public byte TAAC; + public byte NSAC; + public byte Speed; public ushort Classes; - public byte ReadBlockLength; - public bool ReadsPartialBlocks; - public bool WriteMisalignment; - public bool ReadMisalignment; - public bool DSRImplemented; + public byte ReadBlockLength; + public bool ReadsPartialBlocks; + public bool WriteMisalignment; + public bool ReadMisalignment; + public bool DSRImplemented; public ushort Size; - public byte ReadCurrentAtVddMin; - public byte ReadCurrentAtVddMax; - public byte WriteCurrentAtVddMin; - public byte WriteCurrentAtVddMax; - public byte SizeMultiplier; - public byte EraseGroupSize; - public byte EraseGroupSizeMultiplier; - public byte WriteProtectGroupSize; - public bool WriteProtectGroupEnable; - public byte DefaultECC; - public byte WriteSpeedFactor; - public byte WriteBlockLength; - public bool WritesPartialBlocks; - public bool ContentProtection; - public bool FileFormatGroup; - public bool Copy; - public bool PermanentWriteProtect; - public bool TemporaryWriteProtect; - public byte FileFormat; - public byte ECC; - public byte CRC; + public byte ReadCurrentAtVddMin; + public byte ReadCurrentAtVddMax; + public byte WriteCurrentAtVddMin; + public byte WriteCurrentAtVddMax; + public byte SizeMultiplier; + public byte EraseGroupSize; + public byte EraseGroupSizeMultiplier; + public byte WriteProtectGroupSize; + public bool WriteProtectGroupEnable; + public byte DefaultECC; + public byte WriteSpeedFactor; + public byte WriteBlockLength; + public bool WritesPartialBlocks; + public bool ContentProtection; + public bool FileFormatGroup; + public bool Copy; + public bool PermanentWriteProtect; + public bool TemporaryWriteProtect; + public byte FileFormat; + public byte ECC; + public byte CRC; } [SuppressMessage("ReSharper", "InconsistentNaming")] @@ -106,39 +106,40 @@ namespace DiscImageChef.Decoders.MMC return new CSD { - Structure = (byte)((response[0] & 0xC0) >> 6), - Version = (byte)((response[0] & 0x3C) >> 2), - TAAC = response[1], - NSAC = response[2], - Speed = response[3], - Classes = (ushort)((response[4] << 4) + ((response[5] & 0xF0) >> 4)), - ReadBlockLength = (byte)(response[5] & 0x0F), - ReadsPartialBlocks = (response[6] & 0x80) == 0x80, - WriteMisalignment = (response[6] & 0x40) == 0x40, - ReadMisalignment = (response[6] & 0x20) == 0x20, - DSRImplemented = (response[6] & 0x10) == 0x10, - Size = (ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6)), - ReadCurrentAtVddMin = (byte)((response[8] & 0x38) >> 3), - ReadCurrentAtVddMax = (byte)(response[8] & 0x07), - WriteCurrentAtVddMin = (byte)((response[9] & 0xE0) >> 5), - WriteCurrentAtVddMax = (byte)((response[9] & 0x1C) >> 2), - SizeMultiplier = (byte)(((response[9] & 0x03) << 1) + ((response[10] & 0x80) >> 7)), - EraseGroupSize = (byte)((response[10] & 0x7C) >> 2), + Structure = (byte)((response[0] & 0xC0) >> 6), + Version = (byte)((response[0] & 0x3C) >> 2), + TAAC = response[1], + NSAC = response[2], + Speed = response[3], + Classes = (ushort)((response[4] << 4) + ((response[5] & 0xF0) >> 4)), + ReadBlockLength = (byte)(response[5] & 0x0F), + ReadsPartialBlocks = (response[6] & 0x80) == 0x80, + WriteMisalignment = (response[6] & 0x40) == 0x40, + ReadMisalignment = (response[6] & 0x20) == 0x20, + DSRImplemented = (response[6] & 0x10) == 0x10, + Size = + (ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6)), + ReadCurrentAtVddMin = (byte)((response[8] & 0x38) >> 3), + ReadCurrentAtVddMax = (byte)(response[8] & 0x07), + WriteCurrentAtVddMin = (byte)((response[9] & 0xE0) >> 5), + WriteCurrentAtVddMax = (byte)((response[9] & 0x1C) >> 2), + SizeMultiplier = (byte)(((response[9] & 0x03) << 1) + ((response[10] & 0x80) >> 7)), + EraseGroupSize = (byte)((response[10] & 0x7C) >> 2), EraseGroupSizeMultiplier = (byte)(((response[10] & 0x03) << 3) + ((response[11] & 0xE0) >> 5)), - WriteProtectGroupSize = (byte)(response[11] & 0x1F), - WriteProtectGroupEnable = (response[12] & 0x80) == 0x80, - DefaultECC = (byte)((response[12] & 0x60) >> 5), - WriteSpeedFactor = (byte)((response[12] & 0x1C) >> 2), - WriteBlockLength = (byte)(((response[12] & 0x03) << 2) + ((response[13] & 0xC0) >> 6)), - WritesPartialBlocks = (response[13] & 0x20) == 0x20, - ContentProtection = (response[13] & 0x01) == 0x01, - FileFormatGroup = (response[14] & 0x80) == 0x80, - Copy = (response[14] & 0x40) == 0x40, - PermanentWriteProtect = (response[14] & 0x20) == 0x20, - TemporaryWriteProtect = (response[14] & 0x10) == 0x10, - FileFormat = (byte)((response[14] & 0x0C) >> 2), - ECC = (byte)(response[14] & 0x03), - CRC = (byte)((response[15] & 0xFE) >> 1) + WriteProtectGroupSize = (byte)(response[11] & 0x1F), + WriteProtectGroupEnable = (response[12] & 0x80) == 0x80, + DefaultECC = (byte)((response[12] & 0x60) >> 5), + WriteSpeedFactor = (byte)((response[12] & 0x1C) >> 2), + WriteBlockLength = (byte)(((response[12] & 0x03) << 2) + ((response[13] & 0xC0) >> 6)), + WritesPartialBlocks = (response[13] & 0x20) == 0x20, + ContentProtection = (response[13] & 0x01) == 0x01, + FileFormatGroup = (response[14] & 0x80) == 0x80, + Copy = (response[14] & 0x40) == 0x40, + PermanentWriteProtect = (response[14] & 0x20) == 0x20, + TemporaryWriteProtect = (response[14] & 0x10) == 0x10, + FileFormat = (byte)((response[14] & 0x0C) >> 2), + ECC = (byte)(response[14] & 0x03), + CRC = (byte)((response[15] & 0xFE) >> 1) }; } @@ -148,7 +149,7 @@ namespace DiscImageChef.Decoders.MMC double unitFactor = 0; double multiplier = 0; - string unit = ""; + string unit = ""; StringBuilder sb = new StringBuilder(); sb.AppendLine("MultiMediaCard Device Specific Data Register:"); @@ -171,35 +172,35 @@ namespace DiscImageChef.Decoders.MMC switch(csd.TAAC & 0x07) { case 0: - unit = "ns"; + unit = "ns"; unitFactor = 1; break; case 1: - unit = "ns"; + unit = "ns"; unitFactor = 10; break; case 2: - unit = "ns"; + unit = "ns"; unitFactor = 100; break; case 3: - unit = "μs"; + unit = "μs"; unitFactor = 1; break; case 4: - unit = "μs"; + unit = "μs"; unitFactor = 10; break; case 5: - unit = "μs"; + unit = "μs"; unitFactor = 100; break; case 6: - unit = "ms"; + unit = "ms"; unitFactor = 1; break; case 7: - unit = "ms"; + unit = "ms"; unitFactor = 10; break; } @@ -277,7 +278,7 @@ namespace DiscImageChef.Decoders.MMC unitFactor = 100; break; default: - unit = "unknown"; + unit = "unknown"; unitFactor = 0; break; } @@ -338,7 +339,9 @@ namespace DiscImageChef.Decoders.MMC sb.AppendFormat("\tDevice's clock frequency: {0}{1}", result, unit).AppendLine(); unit = ""; - for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1) if((csd.Classes & mask) == mask) unit += $" {cl}"; + for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1) + if((csd.Classes & mask) == mask) + unit += $" {cl}"; sb.AppendFormat("\tDevice support command classes {0}", unit).AppendLine(); if(csd.ReadBlockLength == 15) sb.AppendLine("\tRead block length size is defined in extended CSD"); @@ -358,7 +361,7 @@ namespace DiscImageChef.Decoders.MMC sb.AppendFormat("\tDevice has {0} blocks", (int)result).AppendLine(); result = (csd.Size + 1) * Math.Pow(2, csd.SizeMultiplier + 2) * Math.Pow(2, csd.ReadBlockLength); - if(result > 1073741824) sb.AppendFormat("\tDevice has {0} GiB", result / 1073741824.0).AppendLine(); + if(result > 1073741824) sb.AppendFormat("\tDevice has {0} GiB", result / 1073741824.0).AppendLine(); else if(result > 1048576) sb.AppendFormat("\tDevice has {0} MiB", result / 1048576.0).AppendLine(); else if(result > 1024) sb.AppendFormat("\tDevice has {0} KiB", result / 1024.0).AppendLine(); else sb.AppendFormat("\tDevice has {0} bytes", result).AppendLine(); @@ -478,7 +481,7 @@ namespace DiscImageChef.Decoders.MMC // TODO: Check specification unitFactor = Convert.ToDouble(csd.EraseGroupSize); multiplier = Convert.ToDouble(csd.EraseGroupSizeMultiplier); - result = (unitFactor + 1) * (multiplier + 1); + result = (unitFactor + 1) * (multiplier + 1); sb.AppendFormat("\tDevice can erase a minimum of {0} blocks at a time", (int)result).AppendLine(); if(csd.WriteProtectGroupEnable) diff --git a/MMC/ExtendedCSD.cs b/MMC/ExtendedCSD.cs index 260c81e77..19b0e9250 100644 --- a/MMC/ExtendedCSD.cs +++ b/MMC/ExtendedCSD.cs @@ -44,7 +44,8 @@ namespace DiscImageChef.Decoders.MMC [StructLayout(LayoutKind.Sequential)] public class ExtendedCSD { - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] Reserved0; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] Reserved0; public byte ExtendedSecurityCommandsError; public byte SupportedCommandSets; public byte HPIFeatures; @@ -62,144 +63,152 @@ namespace DiscImageChef.Decoders.MMC public byte OperationCodesTimeout; public uint FFUArgument; public byte BarrierSupport; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 177)] public byte[] Reserved1; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 177)] + public byte[] Reserved1; public byte CMDQueuingSupport; public byte CMDQueuingDepth; public uint NumberofFWSectorsCorrectlyProgrammed; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] VendorHealthReport; - public byte DeviceLifeEstimationTypeB; - public byte DeviceLifeEstimationTypeA; - public byte PreEOLInformation; - public byte OptimalReadSize; - public byte OptimalWriteSize; - public byte OptimalTrimUnitSize; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] VendorHealthReport; + public byte DeviceLifeEstimationTypeB; + public byte DeviceLifeEstimationTypeA; + public byte PreEOLInformation; + public byte OptimalReadSize; + public byte OptimalWriteSize; + public byte OptimalTrimUnitSize; public ushort DeviceVersion; - public ulong FirmwareVersion; - public byte PowerClassDDR200; - public uint CacheSize; - public byte GenericCMD6Timeout; - public byte PowerOffNotificationTimeout; - public byte BackgroundOperationsStatus; - public uint CorrectlyProgrammedSectors; - public byte InitializationTimeAfterPartition; - public byte CacheFlushingPolicy; - public byte PowerClassDDR52; - public byte PowerClassDDR52_195; - public byte PowerClassDDR200_195; - public byte PowerClassDDR200_130; - public byte MinimumWritePerformanceDDR52; - public byte MinimumReadPerformanceDDR52; - public byte Reserved2; - public byte TRIMMultiplier; - public byte SecureFeatureSupport; - public byte SecureEraseMultiplier; - public byte SecureTRIMMultiplier; - public byte BootInformation; - public byte Reserved3; - public byte BootPartitionSize; - public byte AccessSize; - public byte HighCapacityEraseUnitSize; - public byte HighCapacityEraseTimeout; - public byte ReliableWriteSectorCount; - public byte HighCapacityWriteProtectGroupSize; - public byte SleepCurrentVcc; - public byte SleepCurrentVccq; - public byte ProductionStateAwarenessTimeout; - public byte SleepAwakeTimeout; - public byte SleepNotificationTimeout; - public uint SectorCount; - public byte SecureWriteProtectInformation; - public byte MinimumWritePerformance52; - public byte MinimumReadPerformance52; - public byte MinimumWritePerformance26; - public byte MinimumReadPerformance26; - public byte MinimumWritePerformance26_4; - public byte MinimumReadPerformance26_4; - public byte Reserved4; - public byte PowerClass26; - public byte PowerClass52; - public byte PowerClass26_195; - public byte PowerClass52_195; - public byte PartitionSwitchingTime; - public byte OutOfInterruptBusyTiming; - public byte DriverStrength; - public byte DeviceType; - public byte Reserved5; - public byte Structure; - public byte Reserved6; - public byte Revision; - public byte CommandSet; - public byte Reserved7; - public byte CommandSetRevision; - public byte Reserved8; - public byte PowerClass; - public byte Reserved9; - public byte HighSpeedInterfaceTiming; - public byte StrobeSupport; - public byte BusWidth; - public byte Reserved10; - public byte ErasedMemoryContent; - public byte Reserved11; - public byte PartitionConfiguration; - public byte BootConfigProtection; - public byte BootBusConditions; - public byte Reserved12; - public byte HighDensityEraseGroupDefinition; - public byte BootWriteProtectionStatus; - public byte BootAreaWriteProtectionRegister; - public byte Reserved13; - public byte UserAreaWriteProtectionRegister; - public byte Reserved14; - public byte FirmwareConfiguration; - public byte RPMBSize; - public byte WriteReliabilitySettingRegister; - public byte WriteReliabilityParameterRegister; - public byte StartSanitizeOperation; - public byte ManuallyStartBackgroundOperations; - public byte EnableBackgroundOperationsHandshake; - public byte HWResetFunction; - public byte HPIManagement; - public byte PartitioningSupport; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] MaxEnhancedAreaSize; + public ulong FirmwareVersion; + public byte PowerClassDDR200; + public uint CacheSize; + public byte GenericCMD6Timeout; + public byte PowerOffNotificationTimeout; + public byte BackgroundOperationsStatus; + public uint CorrectlyProgrammedSectors; + public byte InitializationTimeAfterPartition; + public byte CacheFlushingPolicy; + public byte PowerClassDDR52; + public byte PowerClassDDR52_195; + public byte PowerClassDDR200_195; + public byte PowerClassDDR200_130; + public byte MinimumWritePerformanceDDR52; + public byte MinimumReadPerformanceDDR52; + public byte Reserved2; + public byte TRIMMultiplier; + public byte SecureFeatureSupport; + public byte SecureEraseMultiplier; + public byte SecureTRIMMultiplier; + public byte BootInformation; + public byte Reserved3; + public byte BootPartitionSize; + public byte AccessSize; + public byte HighCapacityEraseUnitSize; + public byte HighCapacityEraseTimeout; + public byte ReliableWriteSectorCount; + public byte HighCapacityWriteProtectGroupSize; + public byte SleepCurrentVcc; + public byte SleepCurrentVccq; + public byte ProductionStateAwarenessTimeout; + public byte SleepAwakeTimeout; + public byte SleepNotificationTimeout; + public uint SectorCount; + public byte SecureWriteProtectInformation; + public byte MinimumWritePerformance52; + public byte MinimumReadPerformance52; + public byte MinimumWritePerformance26; + public byte MinimumReadPerformance26; + public byte MinimumWritePerformance26_4; + public byte MinimumReadPerformance26_4; + public byte Reserved4; + public byte PowerClass26; + public byte PowerClass52; + public byte PowerClass26_195; + public byte PowerClass52_195; + public byte PartitionSwitchingTime; + public byte OutOfInterruptBusyTiming; + public byte DriverStrength; + public byte DeviceType; + public byte Reserved5; + public byte Structure; + public byte Reserved6; + public byte Revision; + public byte CommandSet; + public byte Reserved7; + public byte CommandSetRevision; + public byte Reserved8; + public byte PowerClass; + public byte Reserved9; + public byte HighSpeedInterfaceTiming; + public byte StrobeSupport; + public byte BusWidth; + public byte Reserved10; + public byte ErasedMemoryContent; + public byte Reserved11; + public byte PartitionConfiguration; + public byte BootConfigProtection; + public byte BootBusConditions; + public byte Reserved12; + public byte HighDensityEraseGroupDefinition; + public byte BootWriteProtectionStatus; + public byte BootAreaWriteProtectionRegister; + public byte Reserved13; + public byte UserAreaWriteProtectionRegister; + public byte Reserved14; + public byte FirmwareConfiguration; + public byte RPMBSize; + public byte WriteReliabilitySettingRegister; + public byte WriteReliabilityParameterRegister; + public byte StartSanitizeOperation; + public byte ManuallyStartBackgroundOperations; + public byte EnableBackgroundOperationsHandshake; + public byte HWResetFunction; + public byte HPIManagement; + public byte PartitioningSupport; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] MaxEnhancedAreaSize; public byte PartitionsAttribute; public byte PartitioningSetting; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] GeneralPurposePartitionSize; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] EnhancedUserDataAreaSize; - public uint EnhancedUserDataStartAddress; - public byte Reserved15; - public byte BadBlockManagementMode; - public byte ProductionStateAwareness; - public byte PackageCaseTemperatureControl; - public byte PeriodicWakeUp; - public byte SupportsProgramCxDInDDR; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] GeneralPurposePartitionSize; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] EnhancedUserDataAreaSize; + public uint EnhancedUserDataStartAddress; + public byte Reserved15; + public byte BadBlockManagementMode; + public byte ProductionStateAwareness; + public byte PackageCaseTemperatureControl; + public byte PeriodicWakeUp; + public byte SupportsProgramCxDInDDR; public ushort Reserved16; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public byte[] VendorSpecific; - public byte NativeSectorSize; - public byte SectorSizeEmulation; - public byte SectorSize; - public byte InitializationTimeout; - public byte Class6CommandsControl; - public byte AddressedGroupToBeReleased; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] + public byte[] VendorSpecific; + public byte NativeSectorSize; + public byte SectorSizeEmulation; + public byte SectorSize; + public byte InitializationTimeout; + public byte Class6CommandsControl; + public byte AddressedGroupToBeReleased; public ushort ExceptionEventsControl; public ushort ExceptionEventsStatus; public ushort ExtendedPartitionsAttribute; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] public byte[] ContextConfiguration; - public byte PackedCommandStatus; - public byte PackedCommandFailureIndex; - public byte PowerOffNotification; - public byte CacheControl; - public byte CacheFlushing; - public byte BarrierControl; - public byte ModeConfig; - public byte ModeOperationCodes; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] + public byte[] ContextConfiguration; + public byte PackedCommandStatus; + public byte PackedCommandFailureIndex; + public byte PowerOffNotification; + public byte CacheControl; + public byte CacheFlushing; + public byte BarrierControl; + public byte ModeConfig; + public byte ModeOperationCodes; public ushort Reserved17; - public byte FFUStatus; - public uint PreLoadingDataSize; - public uint MaxPreLoadingDataSize; - public byte ProductStateAwarenessEnablement; - public byte SecureRemovalType; - public byte CommandQueueModeEnable; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] public byte[] Reserved18; + public byte FFUStatus; + public uint PreLoadingDataSize; + public uint MaxPreLoadingDataSize; + public byte ProductStateAwarenessEnablement; + public byte SecureRemovalType; + public byte CommandQueueModeEnable; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] + public byte[] Reserved18; } [SuppressMessage("ReSharper", "InconsistentNaming")] @@ -213,8 +222,8 @@ namespace DiscImageChef.Decoders.MMC if(response.Length != 512) return null; - GCHandle handle = GCHandle.Alloc(response, GCHandleType.Pinned); - ExtendedCSD csd = (ExtendedCSD)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ExtendedCSD)); + GCHandle handle = GCHandle.Alloc(response, GCHandleType.Pinned); + ExtendedCSD csd = (ExtendedCSD)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ExtendedCSD)); handle.Free(); return csd; @@ -364,8 +373,8 @@ namespace DiscImageChef.Decoders.MMC if(csd.PowerOffNotificationTimeout > 0) sb - .AppendFormat("\tDevice takes a maximum of {0} by default to power off from a SWITCH command notification", - csd.PowerOffNotificationTimeout * 10).AppendLine(); + .AppendFormat("\tDevice takes a maximum of {0} by default to power off from a SWITCH command notification", + csd.PowerOffNotificationTimeout * 10).AppendLine(); switch(csd.BackgroundOperationsStatus & 0x03) { diff --git a/MMC/OCR.cs b/MMC/OCR.cs index f61fdf21c..c7d3775d2 100644 --- a/MMC/OCR.cs +++ b/MMC/OCR.cs @@ -72,25 +72,25 @@ namespace DiscImageChef.Decoders.MMC { return new OCR { - PowerUp = (response & 0x80000000) == 0x80000000, + PowerUp = (response & 0x80000000) == 0x80000000, AccessMode = (byte)((response & 0x60000000) >> 29), - ThreeFive = (response & 0x00800000) == 0x00800000, - ThreeFour = (response & 0x00400000) == 0x00400000, + ThreeFive = (response & 0x00800000) == 0x00800000, + ThreeFour = (response & 0x00400000) == 0x00400000, ThreeThree = (response & 0x00200000) == 0x00200000, - ThreeTwo = (response & 0x00100000) == 0x00100000, - ThreeOne = (response & 0x00080000) == 0x00080000, - ThreeZero = (response & 0x00040000) == 0x00040000, - TwoNine = (response & 0x00020000) == 0x00020000, - TwoEight = (response & 0x00010000) == 0x00010000, - TwoSeven = (response & 0x00008000) == 0x00008000, - TwoSix = (response & 0x00004000) == 0x00004000, - TwoFive = (response & 0x00002000) == 0x00002000, - TwoFour = (response & 0x00001000) == 0x00001000, - TwoThree = (response & 0x00000800) == 0x00000800, - TwoTwo = (response & 0x00000400) == 0x00000400, - TwoOne = (response & 0x00000200) == 0x00000200, - TwoZero = (response & 0x00000100) == 0x00000100, - OneSix = (response & 0x00000080) == 0x00000080 + ThreeTwo = (response & 0x00100000) == 0x00100000, + ThreeOne = (response & 0x00080000) == 0x00080000, + ThreeZero = (response & 0x00040000) == 0x00040000, + TwoNine = (response & 0x00020000) == 0x00020000, + TwoEight = (response & 0x00010000) == 0x00010000, + TwoSeven = (response & 0x00008000) == 0x00008000, + TwoSix = (response & 0x00004000) == 0x00004000, + TwoFive = (response & 0x00002000) == 0x00002000, + TwoFour = (response & 0x00001000) == 0x00001000, + TwoThree = (response & 0x00000800) == 0x00000800, + TwoTwo = (response & 0x00000400) == 0x00000400, + TwoOne = (response & 0x00000200) == 0x00000200, + TwoZero = (response & 0x00000100) == 0x00000100, + OneSix = (response & 0x00000080) == 0x00000080 }; } diff --git a/MMC/VendorString.cs b/MMC/VendorString.cs index 0c2d6cd40..f4b3adfbc 100644 --- a/MMC/VendorString.cs +++ b/MMC/VendorString.cs @@ -39,7 +39,7 @@ namespace DiscImageChef.Decoders.MMC switch(mmcVendorId) { case 0x15: return "Samsung"; - default: return $"Unknown manufacturer ID 0x{mmcVendorId:X2}"; + default: return $"Unknown manufacturer ID 0x{mmcVendorId:X2}"; } } } diff --git a/PCMCIA/CIS.cs b/PCMCIA/CIS.cs index 9bbf5aec6..c99381e95 100644 --- a/PCMCIA/CIS.cs +++ b/PCMCIA/CIS.cs @@ -46,8 +46,8 @@ namespace DiscImageChef.Decoders.PCMCIA // TODO: Handle links? Or are they removed in lower layers of the operating system drivers? public static Tuple[] GetTuples(byte[] data) { - List tuples = new List(); - int position = 0; + List tuples = new List(); + int position = 0; while(position < data.Length) { @@ -84,25 +84,25 @@ namespace DiscImageChef.Decoders.PCMCIA { if((data?.Length - 2) % 6 != 0) return null; - DeviceGeometryTuple tuple = new DeviceGeometryTuple(); + DeviceGeometryTuple tuple = new DeviceGeometryTuple(); List geometries = new List(); for(int position = 2; position < data.Length; position += 6) { DeviceGeometry geometry = new DeviceGeometry { - CardInterface = data[position], + CardInterface = data[position], EraseBlockSize = data[position + 1], - ReadBlockSize = data[position + 2], + ReadBlockSize = data[position + 2], WriteBlockSize = data[position + 3], - Partitions = data[position + 4], - Interleaving = data[position + 5] + Partitions = data[position + 4], + Interleaving = data[position + 5] }; geometries.Add(geometry); } - tuple.Code = (TupleCodes)data[0]; - tuple.Link = data[1]; + tuple.Code = (TupleCodes)data[0]; + tuple.Link = data[1]; tuple.Geometries = geometries.ToArray(); return tuple; @@ -128,7 +128,7 @@ namespace DiscImageChef.Decoders.PCMCIA (1 << (geometry.WriteBlockSize - 1)) * (1 << (geometry.Interleaving - 1))).AppendLine(); sb.AppendFormat("\t\tPartition alignment = {0} bytes", (1 << (geometry.EraseBlockSize - 1)) * (1 << (geometry.Interleaving - 1)) * - (1 << (geometry.Partitions - 1))).AppendLine(); + (1 << (geometry.Partitions - 1))).AppendLine(); } return sb.ToString(); @@ -159,10 +159,10 @@ namespace DiscImageChef.Decoders.PCMCIA return new ManufacturerIdentificationTuple { - Code = (TupleCodes)data[0], - Link = data[1], + Code = (TupleCodes)data[0], + Link = data[1], ManufacturerID = BitConverter.ToUInt16(data, 2), - CardID = BitConverter.ToUInt16(data, 4) + CardID = BitConverter.ToUInt16(data, 4) }; } @@ -201,15 +201,15 @@ namespace DiscImageChef.Decoders.PCMCIA if(data.Length < 4) return null; - List buffer = new List(); - List strings = null; - bool firstString = false; - bool secondString = false; + List buffer = new List(); + List strings = null; + bool firstString = false; + bool secondString = false; Level1VersionTuple tuple = new Level1VersionTuple { - Code = (TupleCodes)data[0], - Link = data[1], + Code = (TupleCodes)data[0], + Link = data[1], MajorVersion = data[2], MinorVersion = data[3] }; @@ -225,8 +225,8 @@ namespace DiscImageChef.Decoders.PCMCIA if(!firstString) { tuple.Manufacturer = StringHandlers.CToString(buffer.ToArray()); - buffer = new List(); - firstString = true; + buffer = new List(); + firstString = true; continue; } @@ -234,8 +234,8 @@ namespace DiscImageChef.Decoders.PCMCIA if(!secondString) { tuple.Product = StringHandlers.CToString(buffer.ToArray()); - buffer = new List(); - firstString = true; + buffer = new List(); + firstString = true; continue; } diff --git a/PCMCIA/Enums.cs b/PCMCIA/Enums.cs index 0e67fc562..aedf592b0 100644 --- a/PCMCIA/Enums.cs +++ b/PCMCIA/Enums.cs @@ -279,18 +279,18 @@ namespace DiscImageChef.Decoders.PCMCIA [SuppressMessage("ReSharper", "InconsistentNaming")] public enum FunctionCodes : byte { - MultiFunction = 0x00, - Memory = 0x01, - Serial = 0x02, - Parallel = 0x03, - FixedDisk = 0x04, - Video = 0x05, - Network = 0x06, - AIMS = 0x07, - SCSI = 0x08, - Security = 0x09, - Instrument = 0x0A, + MultiFunction = 0x00, + Memory = 0x01, + Serial = 0x02, + Parallel = 0x03, + FixedDisk = 0x04, + Video = 0x05, + Network = 0x06, + AIMS = 0x07, + SCSI = 0x08, + Security = 0x09, + Instrument = 0x0A, HighSpeedSerial = 0x0B, - VendorSpecific = 0xFE + VendorSpecific = 0xFE } } \ No newline at end of file diff --git a/PCMCIA/Types.cs b/PCMCIA/Types.cs index 3e7d93dfe..f3d31edc6 100644 --- a/PCMCIA/Types.cs +++ b/PCMCIA/Types.cs @@ -43,8 +43,8 @@ namespace DiscImageChef.Decoders.PCMCIA public class Tuple { public TupleCodes Code; - public byte Link; - public byte[] Data; + public byte Link; + public byte[] Data; } /// diff --git a/PCMCIA/VendorCode.cs b/PCMCIA/VendorCode.cs index 364b8a41f..5de2b3560 100644 --- a/PCMCIA/VendorCode.cs +++ b/PCMCIA/VendorCode.cs @@ -42,130 +42,130 @@ namespace DiscImageChef.Decoders.PCMCIA switch(id) { #region JEDEC - case 0x01: return "AMD"; - case 0x02: return "AMI"; - case 0x83: return "Fairchild"; - case 0x04: return "Fujitsu"; - case 0x85: return "GTE"; - case 0x86: return "Harris"; - case 0x07: return "Hitachi"; - case 0x08: return "Inmos"; - case 0x89: return "Intel"; - case 0x8A: return "I.T.T."; - case 0x0B: return "Intersil"; - case 0x8C: return "Monolithic Memories"; - case 0x0D: return "Mostek"; - case 0x0E: return "Freescale"; - case 0x8F: return "National"; - case 0x10: return "NEC"; - case 0x91: return "RCA"; - case 0x92: return "Raytheon"; - case 0x13: return "Conexant"; - case 0x94: return "Seeq"; - case 0x15: return "NXP"; - case 0x16: return "Synertek"; - case 0x97: return "Texas Instruments"; - case 0x98: return "Toshiba"; - case 0x19: return "Xicor"; - case 0x1A: return "Zilog"; - case 0x9B: return "Eurotechnique"; - case 0x1C: return "Mitsubishi2"; - case 0x9D: return "Lucent"; - case 0x9E: return "Exel"; - case 0x1F: return "Atmel"; - case 0x20: return "SGS/Thomson"; - case 0xA1: return "Lattice Semiconductor"; - case 0xA2: return "NCR"; - case 0x23: return "Wafer Scale Integration"; - case 0xA4: return "International Business Machines"; - case 0x25: return "Tristar"; - case 0x26: return "Visic"; - case 0xA7: return "International CMOS Technology"; - case 0xA8: return "SSSI"; - case 0x29: return "Microchip Technology"; - case 0x2A: return "Ricoh"; - case 0xAB: return "VLSI"; - case 0x2C: return "Micron Technology"; - case 0xAD: return "Hynix Semiconductor"; - case 0xAE: return "OKI Semiconductor"; - case 0x2F: return "ACTEL"; - case 0xB0: return "Sharp"; - case 0x31: return "Catalyst"; - case 0x32: return "Panasonic"; - case 0xB3: return "IDT"; - case 0x34: return "Cypress"; - case 0xB5: return "Digital Equipment Corporation"; - case 0xB6: return "LSI Logic"; - case 0x37: return "Zarlink"; - case 0x38: return "UTMC"; - case 0xB9: return "Thinking Machine"; - case 0xBA: return "Thomson CSF"; - case 0x3B: return "Integrated CMOS"; - case 0xBC: return "Honeywell"; - case 0x3D: return "Tektronix"; - case 0x3E: return "Oracle Corporation"; - case 0xBF: return "Silicon Storage Technology"; - case 0x40: return "ProMos"; - case 0xC1: return "Infineon"; - case 0xC2: return "Macronix"; - case 0x43: return "Xerox"; - case 0xC4: return "Plus Logic"; - case 0x45: return "SanDisk Corporation"; - case 0x46: return "Elan Circuit Technology"; - case 0xC7: return "European Silicon"; - case 0xC8: return "Apple"; - case 0x49: return "Xilinx"; - case 0x4A: return "Compaq"; - case 0xCB: return "Protocol Engines"; - case 0x4C: return "SCI"; - case 0xCD: return "Seiko Instruments"; - case 0xCE: return "Samsung"; - case 0x4F: return "I3 Design System"; - case 0xD0: return "Klic"; - case 0x51: return "Crosspoint Solutions"; - case 0x52: return "Alliance Semiconductor"; - case 0xD3: return "Tandem"; - case 0x54: return "Hewlett-Packard"; - case 0xD5: return "Integrated Silicon Solutions"; - case 0xD6: return "Brooktree"; - case 0x57: return "New Media"; - case 0x58: return "MHS Electronic"; - case 0xD9: return "Performance Semiconductors"; - case 0xDA: return "Winbond Electronic"; - case 0x5B: return "Kawasaki Steel"; - case 0x5D: return "TECMAR"; - case 0x5E: return "Exar"; - case 0xDF: return "PCMCIA"; - case 0xE0: return "LG Semiconductor"; - case 0x61: return "Northern Telecom"; - case 0x62: return "Sanyo2"; - case 0xE3: return "Array Microsystems"; - case 0x64: return "Crystal Semiconductor"; - case 0xE5: return "Analog Devices"; - case 0xE6: return "PMC-Sierra"; - case 0x67: return "Asparix"; - case 0x68: return "Convex Computer"; - case 0xE9: return "Nimbus Technology"; - case 0x6B: return "Transwitch"; - case 0xEC: return "Micronas"; - case 0x6D: return "Canon"; - case 0x6E: return "Altera"; - case 0xEF: return "NEXCOM"; - case 0x70: return "Qualcomm"; - case 0xF1: return "Sony"; - case 0xF2: return "Cray Research"; - case 0x73: return "AMS"; - case 0xF4: return "Vitesse"; - case 0x75: return "Aster Electronics"; - case 0x76: return "Bay Networks"; - case 0xF7: return "Zentrum"; - case 0xF8: return "TRW"; - case 0x79: return "Thesys"; - case 0x7A: return "Solbourne Computer"; - case 0xFB: return "Allied-Signal"; - case 0x7C: return "Dialog Semiconductor"; - case 0xFD: return "Media Vision"; - case 0xFE: return "Numonyx Corporation"; + case 0x01: return "AMD"; + case 0x02: return "AMI"; + case 0x83: return "Fairchild"; + case 0x04: return "Fujitsu"; + case 0x85: return "GTE"; + case 0x86: return "Harris"; + case 0x07: return "Hitachi"; + case 0x08: return "Inmos"; + case 0x89: return "Intel"; + case 0x8A: return "I.T.T."; + case 0x0B: return "Intersil"; + case 0x8C: return "Monolithic Memories"; + case 0x0D: return "Mostek"; + case 0x0E: return "Freescale"; + case 0x8F: return "National"; + case 0x10: return "NEC"; + case 0x91: return "RCA"; + case 0x92: return "Raytheon"; + case 0x13: return "Conexant"; + case 0x94: return "Seeq"; + case 0x15: return "NXP"; + case 0x16: return "Synertek"; + case 0x97: return "Texas Instruments"; + case 0x98: return "Toshiba"; + case 0x19: return "Xicor"; + case 0x1A: return "Zilog"; + case 0x9B: return "Eurotechnique"; + case 0x1C: return "Mitsubishi2"; + case 0x9D: return "Lucent"; + case 0x9E: return "Exel"; + case 0x1F: return "Atmel"; + case 0x20: return "SGS/Thomson"; + case 0xA1: return "Lattice Semiconductor"; + case 0xA2: return "NCR"; + case 0x23: return "Wafer Scale Integration"; + case 0xA4: return "International Business Machines"; + case 0x25: return "Tristar"; + case 0x26: return "Visic"; + case 0xA7: return "International CMOS Technology"; + case 0xA8: return "SSSI"; + case 0x29: return "Microchip Technology"; + case 0x2A: return "Ricoh"; + case 0xAB: return "VLSI"; + case 0x2C: return "Micron Technology"; + case 0xAD: return "Hynix Semiconductor"; + case 0xAE: return "OKI Semiconductor"; + case 0x2F: return "ACTEL"; + case 0xB0: return "Sharp"; + case 0x31: return "Catalyst"; + case 0x32: return "Panasonic"; + case 0xB3: return "IDT"; + case 0x34: return "Cypress"; + case 0xB5: return "Digital Equipment Corporation"; + case 0xB6: return "LSI Logic"; + case 0x37: return "Zarlink"; + case 0x38: return "UTMC"; + case 0xB9: return "Thinking Machine"; + case 0xBA: return "Thomson CSF"; + case 0x3B: return "Integrated CMOS"; + case 0xBC: return "Honeywell"; + case 0x3D: return "Tektronix"; + case 0x3E: return "Oracle Corporation"; + case 0xBF: return "Silicon Storage Technology"; + case 0x40: return "ProMos"; + case 0xC1: return "Infineon"; + case 0xC2: return "Macronix"; + case 0x43: return "Xerox"; + case 0xC4: return "Plus Logic"; + case 0x45: return "SanDisk Corporation"; + case 0x46: return "Elan Circuit Technology"; + case 0xC7: return "European Silicon"; + case 0xC8: return "Apple"; + case 0x49: return "Xilinx"; + case 0x4A: return "Compaq"; + case 0xCB: return "Protocol Engines"; + case 0x4C: return "SCI"; + case 0xCD: return "Seiko Instruments"; + case 0xCE: return "Samsung"; + case 0x4F: return "I3 Design System"; + case 0xD0: return "Klic"; + case 0x51: return "Crosspoint Solutions"; + case 0x52: return "Alliance Semiconductor"; + case 0xD3: return "Tandem"; + case 0x54: return "Hewlett-Packard"; + case 0xD5: return "Integrated Silicon Solutions"; + case 0xD6: return "Brooktree"; + case 0x57: return "New Media"; + case 0x58: return "MHS Electronic"; + case 0xD9: return "Performance Semiconductors"; + case 0xDA: return "Winbond Electronic"; + case 0x5B: return "Kawasaki Steel"; + case 0x5D: return "TECMAR"; + case 0x5E: return "Exar"; + case 0xDF: return "PCMCIA"; + case 0xE0: return "LG Semiconductor"; + case 0x61: return "Northern Telecom"; + case 0x62: return "Sanyo2"; + case 0xE3: return "Array Microsystems"; + case 0x64: return "Crystal Semiconductor"; + case 0xE5: return "Analog Devices"; + case 0xE6: return "PMC-Sierra"; + case 0x67: return "Asparix"; + case 0x68: return "Convex Computer"; + case 0xE9: return "Nimbus Technology"; + case 0x6B: return "Transwitch"; + case 0xEC: return "Micronas"; + case 0x6D: return "Canon"; + case 0x6E: return "Altera"; + case 0xEF: return "NEXCOM"; + case 0x70: return "Qualcomm"; + case 0xF1: return "Sony"; + case 0xF2: return "Cray Research"; + case 0x73: return "AMS"; + case 0xF4: return "Vitesse"; + case 0x75: return "Aster Electronics"; + case 0x76: return "Bay Networks"; + case 0xF7: return "Zentrum"; + case 0xF8: return "TRW"; + case 0x79: return "Thesys"; + case 0x7A: return "Solbourne Computer"; + case 0xFB: return "Allied-Signal"; + case 0x7C: return "Dialog Semiconductor"; + case 0xFD: return "Media Vision"; + case 0xFE: return "Numonyx Corporation"; case 0x7F01: return "Cirrus Logic"; case 0x7F02: return "National Instruments"; case 0x7F04: return "Alcatel Mietec"; @@ -356,7 +356,7 @@ namespace DiscImageChef.Decoders.PCMCIA case 0xC020: return "NextCom K.K."; case 0xC250: return "EMTAC Technology Corporation"; case 0xD601: return "Elsa"; - default: return $"Unknown vendor id 0x{id:X4}"; + default: return $"Unknown vendor id 0x{id:X4}"; } } } diff --git a/SCSI/DiscStructureCapabilities.cs b/SCSI/DiscStructureCapabilities.cs index e54526626..7fd4c4868 100644 --- a/SCSI/DiscStructureCapabilities.cs +++ b/SCSI/DiscStructureCapabilities.cs @@ -72,8 +72,8 @@ namespace DiscImageChef.Decoders.SCSI Capability cap = new Capability { FormatCode = response[offset], - SDS = (response[offset + 1] & 0x80) == 0x80, - RDS = (response[offset + 1] & 0x40) == 0x40 + SDS = (response[offset + 1] & 0x80) == 0x80, + RDS = (response[offset + 1] & 0x40) == 0x40 }; caps.Add(cap); offset += 4; diff --git a/SCSI/EVPD.cs b/SCSI/EVPD.cs index cb0b0c1f5..953c96285 100644 --- a/SCSI/EVPD.cs +++ b/SCSI/EVPD.cs @@ -150,14 +150,14 @@ namespace DiscImageChef.Decoders.SCSI Page_81 decoded = new Page_81 { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4), - Current = (ScsiDefinitions)(pageResponse[4] & 0x7F), - Default = (ScsiDefinitions)(pageResponse[5] & 0x7F) + PageLength = (byte)(pageResponse[3] + 4), + Current = (ScsiDefinitions)(pageResponse[4] & 0x7F), + Default = (ScsiDefinitions)(pageResponse[5] & 0x7F) }; - int position = 6; + int position = 6; List definitions = new List(); while(position < pageResponse.Length) @@ -182,11 +182,11 @@ namespace DiscImageChef.Decoders.SCSI switch(definition) { case ScsiDefinitions.Current: return ""; - case ScsiDefinitions.CCS: return "CCS"; - case ScsiDefinitions.SCSI1: return "SCSI-1"; - case ScsiDefinitions.SCSI2: return "SCSI-2"; - case ScsiDefinitions.SCSI3: return "SCSI-3"; - default: return $"Unknown definition code {(byte)definition}"; + 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}"; } } @@ -194,8 +194,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - Page_81 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + Page_81 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Implemented operating definitions:"); @@ -385,12 +385,12 @@ namespace DiscImageChef.Decoders.SCSI Page_83 decoded = new Page_83 { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4) + PageLength = (byte)(pageResponse[3] + 4) }; - int position = 4; + int position = 4; List descriptors = new List(); while(position < pageResponse.Length) @@ -398,11 +398,11 @@ namespace DiscImageChef.Decoders.SCSI IdentificatonDescriptor descriptor = new IdentificatonDescriptor { ProtocolIdentifier = (ProtocolIdentifiers)((pageResponse[position] & 0xF0) >> 4), - 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] + 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] }; descriptor.Binary = new byte[descriptor.Length]; if(descriptor.Length + position + 4 >= pageResponse.Length) @@ -439,8 +439,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - Page_83 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + Page_83 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Device identification:"); @@ -642,69 +642,69 @@ namespace DiscImageChef.Decoders.SCSI { case ProtocolIdentifiers.ADT: sb - .AppendFormat("\tProtocol (Automation/Drive Interface Transport) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (Automation/Drive Interface Transport) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.ATA: sb - .AppendFormat("\tProtocol (ATA/ATAPI) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (ATA/ATAPI) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.FibreChannel: sb - .AppendFormat("\tProtocol (Fibre Channel) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (Fibre Channel) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.Firewire: sb - .AppendFormat("\tProtocol (IEEE 1394) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (IEEE 1394) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.iSCSI: sb - .AppendFormat("\tProtocol (Internet SCSI) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (Internet SCSI) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.NoProtocol: sb - .AppendFormat("\tProtocol (unknown) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (unknown) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.PCIe: sb - .AppendFormat("\tProtocol (PCI Express) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (PCI Express) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.RDMAP: sb - .AppendFormat("\tProtocol (SCSI Remote Direct Memory Access) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (SCSI Remote Direct Memory Access) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.SAS: sb - .AppendFormat("\tProtocol (Serial Attachment SCSI) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (Serial Attachment SCSI) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.SCSI: sb - .AppendFormat("\tProtocol (Parallel SCSI) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (Parallel SCSI) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.SSA: sb - .AppendFormat("\tProtocol (SSA) specific descriptor with unknown format (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (SSA) specific descriptor with unknown format (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; case ProtocolIdentifiers.SCSIe: sb.AppendFormat("\tProtocol (SCSIe) specific descriptor: Routing ID is {0}", @@ -712,15 +712,15 @@ namespace DiscImageChef.Decoders.SCSI break; case ProtocolIdentifiers.UAS: sb - .AppendFormat("\tProtocol (UAS) specific descriptor: USB address {0} interface {1}", - descriptor.Binary[0] & 0x7F, descriptor.Binary[2]).AppendLine(); + .AppendFormat("\tProtocol (UAS) specific descriptor: USB address {0} interface {1}", + descriptor.Binary[0] & 0x7F, descriptor.Binary[2]).AppendLine(); break; default: sb - .AppendFormat("\tProtocol (unknown code {0}) specific descriptor with unknown format (hex): {1}", - (byte)descriptor.ProtocolIdentifier, - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) - .AppendLine(); + .AppendFormat("\tProtocol (unknown code {0}) specific descriptor with unknown format (hex): {1}", + (byte)descriptor.ProtocolIdentifier, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)) + .AppendLine(); break; } } @@ -741,9 +741,9 @@ namespace DiscImageChef.Decoders.SCSI break; default: sb - .AppendFormat("Inquiry descriptor type {2} contains unknown kind {1} of data (hex): {0}", - PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40), - (byte)descriptor.CodeSet, (byte)descriptor.Type).AppendLine(); + .AppendFormat("Inquiry descriptor type {2} contains unknown kind {1} of data (hex): {0}", + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40), + (byte)descriptor.CodeSet, (byte)descriptor.Type).AppendLine(); break; } @@ -802,12 +802,12 @@ namespace DiscImageChef.Decoders.SCSI Page_84 decoded = new Page_84 { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4) + PageLength = (byte)(pageResponse[3] + 4) }; - int position = 4; + int position = 4; List identifiers = new List(); while(position < pageResponse.Length) @@ -832,8 +832,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - Page_84 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + Page_84 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Software Interface Identifiers:"); @@ -859,13 +859,13 @@ namespace DiscImageChef.Decoders.SCSI #region EVPD Page 0x85: Management Network Addresses page public enum NetworkServiceTypes : byte { - Unspecified = 0, - StorageConf = 1, - Diagnostics = 2, - Status = 3, - Logging = 4, - CodeDownload = 5, - CopyService = 6, + Unspecified = 0, + StorageConf = 1, + Diagnostics = 2, + Status = 3, + Logging = 4, + CodeDownload = 5, + CopyService = 6, Administrative = 7 } @@ -927,12 +927,12 @@ namespace DiscImageChef.Decoders.SCSI Page_85 decoded = new Page_85 { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4) + PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4) }; - int position = 4; + int position = 4; List descriptors = new List(); while(position < pageResponse.Length) @@ -940,8 +940,8 @@ namespace DiscImageChef.Decoders.SCSI NetworkDescriptor descriptor = new NetworkDescriptor { Association = (IdentificationAssociation)((pageResponse[position] & 0x60) >> 5), - Type = (NetworkServiceTypes)(pageResponse[position] & 0x1F), - Length = (ushort)((pageResponse[position + 2] << 8) + pageResponse[position + 3]) + Type = (NetworkServiceTypes)(pageResponse[position] & 0x1F), + Length = (ushort)((pageResponse[position + 2] << 8) + pageResponse[position + 3]) }; descriptor.Address = new byte[descriptor.Length]; Array.Copy(pageResponse, position + 4, descriptor.Address, 0, descriptor.Length); @@ -964,8 +964,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - Page_85 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + Page_85 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Management Network Addresses:"); @@ -1183,36 +1183,36 @@ namespace DiscImageChef.Decoders.SCSI return new Page_86 { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4), - ActivateMicrocode = (byte)((pageResponse[4] & 0xC0) >> 6), - 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] + PageLength = (byte)(pageResponse[3] + 4), + ActivateMicrocode = (byte)((pageResponse[4] & 0xC0) >> 6), + 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] }; } @@ -1225,8 +1225,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - Page_86 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + Page_86 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Extended INQUIRY Data:"); @@ -1364,20 +1364,20 @@ namespace DiscImageChef.Decoders.SCSI Page_89 decoded = new Page_89 { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), - PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4), - VendorIdentification = new byte[8], + 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], - ProductRevisionLevel = new byte[4], - Signature = new byte[20], - IdentifyData = new byte[512] + ProductRevisionLevel = new byte[4], + Signature = new byte[20], + IdentifyData = new byte[512] }; - Array.Copy(pageResponse, 8, decoded.VendorIdentification, 0, 8); + Array.Copy(pageResponse, 8, decoded.VendorIdentification, 0, 8); Array.Copy(pageResponse, 8, decoded.ProductIdentification, 0, 16); - Array.Copy(pageResponse, 8, decoded.ProductRevisionLevel, 0, 4); - Array.Copy(pageResponse, 8, decoded.Signature, 0, 20); + Array.Copy(pageResponse, 8, decoded.ProductRevisionLevel, 0, 4); + Array.Copy(pageResponse, 8, decoded.Signature, 0, 20); decoded.CommandCode = pageResponse[56]; Array.Copy(pageResponse, 8, decoded.IdentifyData, 0, 512); @@ -1394,8 +1394,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - Page_89 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + Page_89 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI to ATA Translation Layer Data:"); @@ -1418,6 +1418,7 @@ namespace DiscImageChef.Decoders.SCSI sb.AppendFormat("\tDevice responded to ATA command {0:X2}h", page.CommandCode).AppendLine(); break; } + switch(page.Signature[0]) { case 0x00: @@ -1494,11 +1495,11 @@ namespace DiscImageChef.Decoders.SCSI Page_C0_Quantum decoded = new Page_C0_Quantum { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), - PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), ServoFirmwareChecksum = (ushort)((pageResponse[4] << 8) + pageResponse[5]), - ServoEEPROMChecksum = (ushort)((pageResponse[6] << 8) + pageResponse[7]), + ServoEEPROMChecksum = (ushort)((pageResponse[6] << 8) + pageResponse[7]), ReadWriteFirmwareChecksum = (uint)((pageResponse[8] << 24) + (pageResponse[9] << 16) + (pageResponse[10] << 8) + pageResponse[11]), @@ -1520,7 +1521,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; Page_C0_Quantum page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("Quantum Firmware Build Information page:"); @@ -1575,19 +1576,19 @@ namespace DiscImageChef.Decoders.SCSI Page_C0_C1_Certance decoded = new Page_C0_C1_Certance { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4), - Component = new byte[26], - Version = new byte[19], - Date = new byte[24], - Variant = new byte[23] + PageLength = (byte)(pageResponse[3] + 4), + Component = new byte[26], + Version = new byte[19], + Date = new byte[24], + Variant = new byte[23] }; - 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); + 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; } @@ -1602,7 +1603,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; Page_C0_C1_Certance page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("Certance Drive Component Revision Levels page:"); @@ -1654,10 +1655,10 @@ namespace DiscImageChef.Decoders.SCSI Page_C2_C3_C4_C5_C6_Certance decoded = new Page_C2_C3_C4_C5_C6_Certance { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4), - SerialNumber = new byte[12] + PageLength = (byte)(pageResponse[3] + 4), + SerialNumber = new byte[12] }; Array.Copy(pageResponse, 4, decoded.SerialNumber, 0, 12); @@ -1675,7 +1676,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; Page_C2_C3_C4_C5_C6_Certance page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("Certance Drive Component Serial Number page:"); @@ -1806,22 +1807,22 @@ namespace DiscImageChef.Decoders.SCSI Page_DF_Certance decoded = new Page_DF_Certance { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - 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, - AutoloadMode = (byte)(pageResponse[6] & 0x07), - CartridgeType = pageResponse[8], - CartridgeFormat = pageResponse[9], - CartridgeCapacity = (ushort)((pageResponse[10] << 8) + pageResponse[11] + 4), - PortATransportType = pageResponse[12], - PortASelectionID = pageResponse[15], + 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, + AutoloadMode = (byte)(pageResponse[6] & 0x07), + CartridgeType = pageResponse[8], + CartridgeFormat = pageResponse[9], + CartridgeCapacity = (ushort)((pageResponse[10] << 8) + pageResponse[11] + 4), + PortATransportType = pageResponse[12], + PortASelectionID = pageResponse[15], OperatingHours = (uint)((pageResponse[20] << 24) + (pageResponse[21] << 16) + (pageResponse[22] << 8) + pageResponse[23]), @@ -1846,7 +1847,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; Page_DF_Certance page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("Certance drive status page:"); @@ -1999,15 +2000,15 @@ namespace DiscImageChef.Decoders.SCSI Page_C0_IBM decoded = new Page_C0_IBM { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4), - CodeName = new byte[12], - Date = new byte[8] + PageLength = (byte)(pageResponse[3] + 4), + CodeName = new byte[12], + Date = new byte[8] }; - Array.Copy(pageResponse, 4, decoded.CodeName, 0, 12); - Array.Copy(pageResponse, 23, decoded.Date, 0, 8); + Array.Copy(pageResponse, 4, decoded.CodeName, 0, 12); + Array.Copy(pageResponse, 23, decoded.Date, 0, 8); return decoded; } @@ -2021,8 +2022,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - Page_C0_IBM page = modePage.Value; - StringBuilder sb = new StringBuilder(); + Page_C0_IBM page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("IBM Drive Component Revision Levels page:"); @@ -2070,15 +2071,15 @@ namespace DiscImageChef.Decoders.SCSI Page_C1_IBM decoded = new Page_C1_IBM { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4), - ManufacturingSerial = new byte[12], - ReportedSerial = new byte[12] + PageLength = (byte)(pageResponse[3] + 4), + ManufacturingSerial = new byte[12], + ReportedSerial = new byte[12] }; - Array.Copy(pageResponse, 4, decoded.ManufacturingSerial, 0, 12); - Array.Copy(pageResponse, 16, decoded.ReportedSerial, 0, 12); + Array.Copy(pageResponse, 4, decoded.ManufacturingSerial, 0, 12); + Array.Copy(pageResponse, 16, decoded.ReportedSerial, 0, 12); return decoded; } @@ -2092,8 +2093,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - Page_C1_IBM page = modePage.Value; - StringBuilder sb = new StringBuilder(); + Page_C1_IBM page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("IBM Drive Serial Numbers page:"); @@ -2143,11 +2144,11 @@ namespace DiscImageChef.Decoders.SCSI Page_B0 decoded = new Page_B0 { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4), - TSMC = (pageResponse[4] & 0x02) == 0x02, - WORM = (pageResponse[4] & 0x01) == 0x01 + PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4), + TSMC = (pageResponse[4] & 0x02) == 0x02, + WORM = (pageResponse[4] & 0x01) == 0x01 }; return decoded; @@ -2162,8 +2163,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - Page_B0 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + Page_B0 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Sequential-access Device Capabilities:"); @@ -2226,8 +2227,8 @@ namespace DiscImageChef.Decoders.SCSI if(page.Length != page[3] + 4) return null; - byte[] element = new byte[page.Length - 4]; - StringBuilder sb = new StringBuilder(); + byte[] element = new byte[page.Length - 4]; + StringBuilder sb = new StringBuilder(); foreach(byte b in element) sb.AppendFormat("{0:X2}", b); return sb.ToString(); @@ -2275,23 +2276,23 @@ namespace DiscImageChef.Decoders.SCSI Page_C0_to_C5_HP decoded = new Page_C0_to_C5_HP { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4), - PageCode = pageResponse[1] + PageLength = (byte)(pageResponse[3] + 4), + PageCode = pageResponse[1] }; if(pageResponse[3] == 92 && pageResponse.Length >= 96) { decoded.Component = new byte[26]; - decoded.Version = new byte[19]; - decoded.Date = new byte[24]; - decoded.Variant = new byte[23]; + decoded.Version = new byte[19]; + decoded.Date = new byte[24]; + decoded.Variant = new byte[23]; - 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); + 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; } @@ -2301,38 +2302,39 @@ namespace DiscImageChef.Decoders.SCSI List array = new List(); const string fwRegExStr = @"Firmware Rev\s+=\s+(?\d+\.\d+)\s+Build date\s+=\s+(?(\w|\d|\s*.)*)\s*$"; - const string fwcRegExStr = @"FW_CONF\s+=\s+(?0x[0-9A-Fa-f]{8})\s*$"; + const string fwcRegExStr = @"FW_CONF\s+=\s+(?0x[0-9A-Fa-f]{8})\s*$"; const string servoRegExStr = @"Servo\s+Rev\s+=\s+(?\d+\.\d+)\s*$"; - Regex fwRegEx = new Regex(fwRegExStr); - Regex fwcRegEx = new Regex(fwcRegExStr); - Regex servoRegEx = new Regex(servoRegExStr); + Regex fwRegEx = new Regex(fwRegExStr); + Regex fwcRegEx = new Regex(fwcRegExStr); + Regex servoRegEx = new Regex(servoRegExStr); for(int pos = 5; pos < pageResponse.Length; pos++) if(pageResponse[pos] == 0x00) { - string str = StringHandlers.CToString(array.ToArray()); - Match fwMatch = fwRegEx.Match(str); - Match fwcMatch = fwcRegEx.Match(str); - Match servoMatch = servoRegEx.Match(str); + 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"); - decoded.Version = Encoding.ASCII.GetBytes(fwMatch.Groups["fw"].Value); - decoded.Date = Encoding.ASCII.GetBytes(fwMatch.Groups["date"].Value); + decoded.Version = Encoding.ASCII.GetBytes(fwMatch.Groups["fw"].Value); + decoded.Date = Encoding.ASCII.GetBytes(fwMatch.Groups["date"].Value); } else if(fwcMatch.Success) decoded.Variant = Encoding.ASCII.GetBytes(fwMatch.Groups["value"].Value); else if(servoMatch.Success) { decoded.Component = Encoding.ASCII.GetBytes("Servo"); - decoded.Version = Encoding.ASCII.GetBytes(servoMatch.Groups["version"].Value); + decoded.Version = Encoding.ASCII.GetBytes(servoMatch.Groups["version"].Value); } array = new List(); } - else array.Add(pageResponse[pos]); + else + array.Add(pageResponse[pos]); return decoded; } @@ -2347,7 +2349,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; Page_C0_to_C5_HP page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); switch(page.PageCode) { @@ -2424,18 +2426,18 @@ namespace DiscImageChef.Decoders.SCSI Page_C0_Seagate decoded = new Page_C0_Seagate { - PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), - PageLength = (byte)(pageResponse[3] + 4), - PageCode = pageResponse[1], - ControllerFirmware = new byte[4], - BootFirmware = new byte[4], - ServoFirmware = new byte[4] + PageLength = (byte)(pageResponse[3] + 4), + PageCode = pageResponse[1], + ControllerFirmware = new byte[4], + BootFirmware = new byte[4], + ServoFirmware = new byte[4] }; - Array.Copy(pageResponse, 4, decoded.ControllerFirmware, 0, 4); - Array.Copy(pageResponse, 8, decoded.BootFirmware, 0, 4); - Array.Copy(pageResponse, 12, decoded.ServoFirmware, 0, 4); + Array.Copy(pageResponse, 4, decoded.ControllerFirmware, 0, 4); + Array.Copy(pageResponse, 8, decoded.BootFirmware, 0, 4); + Array.Copy(pageResponse, 12, decoded.ServoFirmware, 0, 4); return decoded; } @@ -2450,7 +2452,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; Page_C0_Seagate page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("Seagate Firmware Numbers page:"); diff --git a/SCSI/Inquiry.cs b/SCSI/Inquiry.cs index be526ae1f..a70d28ac8 100644 --- a/SCSI/Inquiry.cs +++ b/SCSI/Inquiry.cs @@ -79,88 +79,99 @@ namespace DiscImageChef.Decoders.SCSI if(SCSIInquiryResponse.Length >= 1) { - decoded.PeripheralQualifier = (byte)((SCSIInquiryResponse[0] & 0xE0) >> 5); + decoded.PeripheralQualifier = (byte)((SCSIInquiryResponse[0] & 0xE0) >> 5); decoded.PeripheralDeviceType = (byte)(SCSIInquiryResponse[0] & 0x1F); } + if(SCSIInquiryResponse.Length >= 2) { - decoded.RMB = Convert.ToBoolean(SCSIInquiryResponse[1] & 0x80); + decoded.RMB = Convert.ToBoolean(SCSIInquiryResponse[1] & 0x80); decoded.DeviceTypeModifier = (byte)(SCSIInquiryResponse[1] & 0x7F); } + if(SCSIInquiryResponse.Length >= 3) { - decoded.ISOVersion = (byte)((SCSIInquiryResponse[2] & 0xC0) >> 6); + decoded.ISOVersion = (byte)((SCSIInquiryResponse[2] & 0xC0) >> 6); decoded.ECMAVersion = (byte)((SCSIInquiryResponse[2] & 0x38) >> 3); decoded.ANSIVersion = (byte)(SCSIInquiryResponse[2] & 0x07); } + if(SCSIInquiryResponse.Length >= 4) { - decoded.AERC = Convert.ToBoolean(SCSIInquiryResponse[3] & 0x80); - decoded.TrmTsk = Convert.ToBoolean(SCSIInquiryResponse[3] & 0x40); - decoded.NormACA = Convert.ToBoolean(SCSIInquiryResponse[3] & 0x20); - decoded.HiSup = Convert.ToBoolean(SCSIInquiryResponse[3] & 0x10); + decoded.AERC = Convert.ToBoolean(SCSIInquiryResponse[3] & 0x80); + decoded.TrmTsk = Convert.ToBoolean(SCSIInquiryResponse[3] & 0x40); + decoded.NormACA = Convert.ToBoolean(SCSIInquiryResponse[3] & 0x20); + decoded.HiSup = Convert.ToBoolean(SCSIInquiryResponse[3] & 0x10); decoded.ResponseDataFormat = (byte)(SCSIInquiryResponse[3] & 0x07); } + if(SCSIInquiryResponse.Length >= 5) decoded.AdditionalLength = SCSIInquiryResponse[4]; if(SCSIInquiryResponse.Length >= 6) { - decoded.SCCS = Convert.ToBoolean(SCSIInquiryResponse[5] & 0x80); - decoded.ACC = Convert.ToBoolean(SCSIInquiryResponse[5] & 0x40); - decoded.TPGS = (byte)((SCSIInquiryResponse[5] & 0x30) >> 4); - decoded.ThreePC = Convert.ToBoolean(SCSIInquiryResponse[5] & 0x08); + decoded.SCCS = Convert.ToBoolean(SCSIInquiryResponse[5] & 0x80); + decoded.ACC = Convert.ToBoolean(SCSIInquiryResponse[5] & 0x40); + decoded.TPGS = (byte)((SCSIInquiryResponse[5] & 0x30) >> 4); + decoded.ThreePC = Convert.ToBoolean(SCSIInquiryResponse[5] & 0x08); decoded.Reserved2 = (byte)((SCSIInquiryResponse[5] & 0x06) >> 1); - decoded.Protect = Convert.ToBoolean(SCSIInquiryResponse[5] & 0x01); + decoded.Protect = Convert.ToBoolean(SCSIInquiryResponse[5] & 0x01); } + if(SCSIInquiryResponse.Length >= 7) { - decoded.BQue = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x80); + decoded.BQue = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x80); decoded.EncServ = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x40); - decoded.VS1 = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x20); - decoded.MultiP = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x10); - decoded.MChngr = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x08); + decoded.VS1 = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x20); + decoded.MultiP = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x10); + decoded.MChngr = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x08); decoded.ACKREQQ = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x04); - decoded.Addr32 = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x02); - decoded.Addr16 = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x01); + decoded.Addr32 = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x02); + decoded.Addr16 = Convert.ToBoolean(SCSIInquiryResponse[6] & 0x01); } + if(SCSIInquiryResponse.Length >= 8) { decoded.RelAddr = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x80); - decoded.WBus32 = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x40); - decoded.WBus16 = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x20); - decoded.Sync = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x10); - decoded.Linked = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x08); + decoded.WBus32 = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x40); + decoded.WBus16 = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x20); + decoded.Sync = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x10); + decoded.Linked = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x08); decoded.TranDis = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x04); - decoded.CmdQue = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x02); - decoded.SftRe = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x01); + decoded.CmdQue = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x02); + decoded.SftRe = Convert.ToBoolean(SCSIInquiryResponse[7] & 0x01); } + if(SCSIInquiryResponse.Length >= 16) { decoded.VendorIdentification = new byte[8]; Array.Copy(SCSIInquiryResponse, 8, decoded.VendorIdentification, 0, 8); } + if(SCSIInquiryResponse.Length >= 32) { decoded.ProductIdentification = new byte[16]; Array.Copy(SCSIInquiryResponse, 16, decoded.ProductIdentification, 0, 16); } + if(SCSIInquiryResponse.Length >= 36) { decoded.ProductRevisionLevel = new byte[4]; Array.Copy(SCSIInquiryResponse, 32, decoded.ProductRevisionLevel, 0, 4); } + if(SCSIInquiryResponse.Length >= 44) { // Seagate 1 - decoded.SeagatePresent = true; + decoded.SeagatePresent = true; decoded.Seagate_DriveSerialNumber = new byte[8]; Array.Copy(SCSIInquiryResponse, 36, decoded.Seagate_DriveSerialNumber, 0, 8); } + if(SCSIInquiryResponse.Length >= 46) { // Kreon decoded.KreonIdentifier = new byte[5]; Array.Copy(SCSIInquiryResponse, 36, decoded.KreonIdentifier, 0, 5); - decoded.KreonSpace = SCSIInquiryResponse[41]; + decoded.KreonSpace = SCSIInquiryResponse[41]; decoded.KreonVersion = new byte[5]; Array.Copy(SCSIInquiryResponse, 42, decoded.KreonVersion, 0, 5); @@ -168,63 +179,66 @@ namespace DiscImageChef.Decoders.SCSI decoded.KreonIdentifier.SequenceEqual(new byte[] {0x4B, 0x52, 0x45, 0x4F, 0x4E})) decoded.KreonPresent = true; } + if(SCSIInquiryResponse.Length >= 49) { // HP - decoded.HPPresent = true; - decoded.HP_WORM |= (SCSIInquiryResponse[40] & 0x01) == 0x01; - decoded.HP_WORMVersion = (byte)((SCSIInquiryResponse[40] & 0x7F) >> 1); - decoded.HP_OBDR = new byte[6]; + decoded.HPPresent = true; + decoded.HP_WORM |= (SCSIInquiryResponse[40] & 0x01) == 0x01; + decoded.HP_WORMVersion = (byte)((SCSIInquiryResponse[40] & 0x7F) >> 1); + decoded.HP_OBDR = new byte[6]; Array.Copy(SCSIInquiryResponse, 43, decoded.HP_OBDR, 0, 6); } + if(SCSIInquiryResponse.Length >= 56) { decoded.VendorSpecific = new byte[20]; Array.Copy(SCSIInquiryResponse, 36, decoded.VendorSpecific, 0, 20); // Quantum - decoded.QuantumPresent = true; - decoded.Qt_ProductFamily = (byte)((SCSIInquiryResponse[36] & 0xF0) >> 4); - decoded.Qt_ReleasedFirmware = (byte)(SCSIInquiryResponse[36] & 0x0F); - decoded.Qt_FirmwareMajorVersion = SCSIInquiryResponse[37]; - decoded.Qt_FirmwareMinorVersion = SCSIInquiryResponse[38]; - decoded.Qt_EEPROMFormatMajorVersion = SCSIInquiryResponse[39]; - decoded.Qt_EEPROMFormatMinorVersion = SCSIInquiryResponse[40]; - decoded.Qt_FirmwarePersonality = SCSIInquiryResponse[41]; - decoded.Qt_FirmwareSubPersonality = SCSIInquiryResponse[42]; - decoded.Qt_TapeDirectoryFormatVersion = SCSIInquiryResponse[43]; - decoded.Qt_ControllerHardwareVersion = SCSIInquiryResponse[44]; - decoded.Qt_DriveEEPROMVersion = SCSIInquiryResponse[45]; - decoded.Qt_DriveHardwareVersion = SCSIInquiryResponse[46]; - decoded.Qt_MediaLoaderFirmwareVersion = SCSIInquiryResponse[47]; - decoded.Qt_MediaLoaderHardwareVersion = SCSIInquiryResponse[48]; + decoded.QuantumPresent = true; + decoded.Qt_ProductFamily = (byte)((SCSIInquiryResponse[36] & 0xF0) >> 4); + decoded.Qt_ReleasedFirmware = (byte)(SCSIInquiryResponse[36] & 0x0F); + decoded.Qt_FirmwareMajorVersion = SCSIInquiryResponse[37]; + decoded.Qt_FirmwareMinorVersion = SCSIInquiryResponse[38]; + decoded.Qt_EEPROMFormatMajorVersion = SCSIInquiryResponse[39]; + decoded.Qt_EEPROMFormatMinorVersion = SCSIInquiryResponse[40]; + decoded.Qt_FirmwarePersonality = SCSIInquiryResponse[41]; + decoded.Qt_FirmwareSubPersonality = SCSIInquiryResponse[42]; + decoded.Qt_TapeDirectoryFormatVersion = SCSIInquiryResponse[43]; + decoded.Qt_ControllerHardwareVersion = SCSIInquiryResponse[44]; + decoded.Qt_DriveEEPROMVersion = SCSIInquiryResponse[45]; + decoded.Qt_DriveHardwareVersion = SCSIInquiryResponse[46]; + decoded.Qt_MediaLoaderFirmwareVersion = SCSIInquiryResponse[47]; + decoded.Qt_MediaLoaderHardwareVersion = SCSIInquiryResponse[48]; decoded.Qt_MediaLoaderMechanicalVersion = SCSIInquiryResponse[49]; - decoded.Qt_MediaLoaderPresent = SCSIInquiryResponse[50] > 0; - decoded.Qt_LibraryPresent = SCSIInquiryResponse[51] > 0; - decoded.Qt_ModuleRevision = new byte[4]; + decoded.Qt_MediaLoaderPresent = SCSIInquiryResponse[50] > 0; + decoded.Qt_LibraryPresent = SCSIInquiryResponse[51] > 0; + decoded.Qt_ModuleRevision = new byte[4]; Array.Copy(SCSIInquiryResponse, 52, decoded.Qt_ModuleRevision, 0, 4); // IBM - decoded.IBMPresent = true; - decoded.IBM_AutDis |= (SCSIInquiryResponse[36] & 0x01) == 0x01; - decoded.IBM_PerformanceLimit = SCSIInquiryResponse[37]; - decoded.IBM_OEMSpecific = SCSIInquiryResponse[41]; + decoded.IBMPresent = true; + decoded.IBM_AutDis |= (SCSIInquiryResponse[36] & 0x01) == 0x01; + decoded.IBM_PerformanceLimit = SCSIInquiryResponse[37]; + decoded.IBM_OEMSpecific = SCSIInquiryResponse[41]; } if(SCSIInquiryResponse.Length >= 57) { decoded.Reserved3 = (byte)((SCSIInquiryResponse[56] & 0xF0) >> 4); - decoded.Clocking = (byte)((SCSIInquiryResponse[56] & 0x0C) >> 2); - decoded.QAS = Convert.ToBoolean(SCSIInquiryResponse[56] & 0x02); - decoded.IUS = Convert.ToBoolean(SCSIInquiryResponse[56] & 0x01); + decoded.Clocking = (byte)((SCSIInquiryResponse[56] & 0x0C) >> 2); + decoded.QAS = Convert.ToBoolean(SCSIInquiryResponse[56] & 0x02); + decoded.IUS = Convert.ToBoolean(SCSIInquiryResponse[56] & 0x01); } + if(SCSIInquiryResponse.Length >= 58) decoded.Reserved4 = SCSIInquiryResponse[57]; if(SCSIInquiryResponse.Length >= 60) { int descriptorsNo; if(SCSIInquiryResponse.Length >= 74) descriptorsNo = 8; - else descriptorsNo = (SCSIInquiryResponse.Length - 58) / 2; + else descriptorsNo = (SCSIInquiryResponse.Length - 58) / 2; decoded.VersionDescriptors = new ushort[descriptorsNo]; for(int i = 0; i < descriptorsNo; i++) @@ -236,26 +250,31 @@ namespace DiscImageChef.Decoders.SCSI decoded.Reserved5 = new byte[SCSIInquiryResponse.Length - 74]; Array.Copy(SCSIInquiryResponse, 74, decoded.Reserved5, 0, SCSIInquiryResponse.Length - 74); } + if(SCSIInquiryResponse.Length >= 96) { decoded.Reserved5 = new byte[22]; Array.Copy(SCSIInquiryResponse, 74, decoded.Reserved5, 0, 22); } + if(SCSIInquiryResponse.Length > 96) { decoded.VendorSpecific2 = new byte[SCSIInquiryResponse.Length - 96]; Array.Copy(SCSIInquiryResponse, 96, decoded.VendorSpecific2, 0, SCSIInquiryResponse.Length - 96); } + if(SCSIInquiryResponse.Length >= 144) { // Seagate 2 - decoded.Seagate2Present = true; + decoded.Seagate2Present = true; decoded.Seagate_Copyright = new byte[48]; Array.Copy(SCSIInquiryResponse, 96, decoded.Seagate_Copyright, 0, 48); } + if(SCSIInquiryResponse.Length < 148) return decoded; + // Seagate 2 - decoded.Seagate3Present = true; + decoded.Seagate3Present = true; decoded.Seagate_ServoPROMPartNo = new byte[4]; Array.Copy(SCSIInquiryResponse, 144, decoded.Seagate_ServoPROMPartNo, 0, 4); @@ -457,9 +476,9 @@ namespace DiscImageChef.Decoders.SCSI if(response.CmdQue) sb.AppendLine("Device supports TCQ queue"); if(response.IUS) sb.AppendLine("Device supports information unit transfers"); if(response.SftRe) sb.AppendLine("Device implements RESET as a soft reset"); -#if DEBUG + #if DEBUG if(response.VS1) sb.AppendLine("Vendor specific bit 5 on byte 6 of INQUIRY response is set"); -#endif + #endif switch((TGPSValues)response.TPGS) { @@ -2027,7 +2046,7 @@ namespace DiscImageChef.Decoders.SCSI StringHandlers.CToString(response.KreonVersion)).AppendLine(); #endregion Kreon vendor prettifying -#if DEBUG + #if DEBUG if(response.DeviceTypeModifier != 0) sb.AppendFormat("Vendor's device type modifier = 0x{0:X2}", response.DeviceTypeModifier).AppendLine(); if(response.Reserved2 != 0) @@ -2068,7 +2087,7 @@ namespace DiscImageChef.Decoders.SCSI sb.AppendLine("============================================================"); sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.VendorSpecific2, 60)); sb.AppendLine("============================================================"); -#endif + #endif return sb.ToString(); } diff --git a/SCSI/MMC/AACS.cs b/SCSI/MMC/AACS.cs index d1820d7c8..b20b78b18 100644 --- a/SCSI/MMC/AACS.cs +++ b/SCSI/MMC/AACS.cs @@ -232,8 +232,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC decoded.VolumeIdentifier = new byte[AACSVIResponse.Length - 4]; decoded.DataLength = BigEndianBitConverter.ToUInt16(AACSVIResponse, 0); - decoded.Reserved1 = AACSVIResponse[2]; - decoded.Reserved2 = AACSVIResponse[3]; + decoded.Reserved1 = AACSVIResponse[2]; + decoded.Reserved2 = AACSVIResponse[3]; Array.Copy(AACSVIResponse, 4, decoded.VolumeIdentifier, 0, AACSVIResponse.Length - 4); return decoded; @@ -247,10 +247,10 @@ namespace DiscImageChef.Decoders.SCSI.MMC StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); -#endif + #endif sb.AppendFormat("AACS Volume Identifier in hex follows:"); sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.VolumeIdentifier, 80)); @@ -274,8 +274,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC decoded.MediaSerialNumber = new byte[AACSMSNResponse.Length - 4]; decoded.DataLength = BigEndianBitConverter.ToUInt16(AACSMSNResponse, 0); - decoded.Reserved1 = AACSMSNResponse[2]; - decoded.Reserved2 = AACSMSNResponse[3]; + decoded.Reserved1 = AACSMSNResponse[2]; + decoded.Reserved2 = AACSMSNResponse[3]; Array.Copy(AACSMSNResponse, 4, decoded.MediaSerialNumber, 0, AACSMSNResponse.Length - 4); return decoded; @@ -289,10 +289,10 @@ namespace DiscImageChef.Decoders.SCSI.MMC StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); -#endif + #endif sb.AppendFormat("AACS Media Serial Number in hex follows:"); sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.MediaSerialNumber, 80)); @@ -316,8 +316,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC decoded.MediaIdentifier = new byte[AACSMIResponse.Length - 4]; decoded.DataLength = BigEndianBitConverter.ToUInt16(AACSMIResponse, 0); - decoded.Reserved1 = AACSMIResponse[2]; - decoded.Reserved2 = AACSMIResponse[3]; + decoded.Reserved1 = AACSMIResponse[2]; + decoded.Reserved2 = AACSMIResponse[3]; Array.Copy(AACSMIResponse, 4, decoded.MediaIdentifier, 0, AACSMIResponse.Length - 4); return decoded; @@ -331,10 +331,10 @@ namespace DiscImageChef.Decoders.SCSI.MMC StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); -#endif + #endif sb.AppendFormat("AACS Media Identifier in hex follows:"); sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.MediaIdentifier, 80)); @@ -358,7 +358,7 @@ namespace DiscImageChef.Decoders.SCSI.MMC decoded.MediaKeyBlockPacks = new byte[AACSMKBResponse.Length - 4]; decoded.DataLength = BigEndianBitConverter.ToUInt16(AACSMKBResponse, 0); - decoded.Reserved = AACSMKBResponse[2]; + decoded.Reserved = AACSMKBResponse[2]; decoded.TotalPacks = AACSMKBResponse[3]; Array.Copy(AACSMKBResponse, 4, decoded.MediaKeyBlockPacks, 0, AACSMKBResponse.Length - 4); @@ -373,9 +373,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved != 0) sb.AppendFormat("Reserved = 0x{0:X2}", response.Reserved).AppendLine(); -#endif + #endif sb.AppendFormat("Total number of media key blocks available to transfer {0}", response.TotalPacks) .AppendLine(); sb.AppendFormat("AACS Media Key Blocks in hex follows:"); @@ -401,8 +401,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC decoded.DataKeys = new byte[AACSDKResponse.Length - 4]; decoded.DataLength = BigEndianBitConverter.ToUInt16(AACSDKResponse, 0); - decoded.Reserved1 = AACSDKResponse[2]; - decoded.Reserved2 = AACSDKResponse[3]; + decoded.Reserved1 = AACSDKResponse[2]; + decoded.Reserved2 = AACSDKResponse[3]; Array.Copy(AACSDKResponse, 4, decoded.DataKeys, 0, AACSDKResponse.Length - 4); return decoded; @@ -416,10 +416,10 @@ namespace DiscImageChef.Decoders.SCSI.MMC StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); -#endif + #endif sb.AppendFormat("AACS Data Keys in hex follows:"); sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.DataKeys, 80)); @@ -440,8 +440,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; - decoded.DataLength = BigEndianBitConverter.ToUInt16(AACSLBAExtsResponse, 0); - decoded.Reserved = AACSLBAExtsResponse[2]; + decoded.DataLength = BigEndianBitConverter.ToUInt16(AACSLBAExtsResponse, 0); + decoded.Reserved = AACSLBAExtsResponse[2]; decoded.MaxLBAExtents = AACSLBAExtsResponse[3]; if((AACSLBAExtsResponse.Length - 4) % 16 != 0) return decoded; @@ -452,7 +452,7 @@ namespace DiscImageChef.Decoders.SCSI.MMC { decoded.Extents[i].Reserved = new byte[8]; Array.Copy(AACSLBAExtsResponse, 0 + i * 16 + 4, decoded.Extents[i].Reserved, 0, 8); - decoded.Extents[i].StartLBA = BigEndianBitConverter.ToUInt32(AACSLBAExtsResponse, 8 + i * 16 + 4); + decoded.Extents[i].StartLBA = BigEndianBitConverter.ToUInt32(AACSLBAExtsResponse, 8 + i * 16 + 4); decoded.Extents[i].LBACount = BigEndianBitConverter.ToUInt32(AACSLBAExtsResponse, 12 + i * 16 + 4); } diff --git a/SCSI/MMC/CPRM.cs b/SCSI/MMC/CPRM.cs index e7b7f68d5..0d2d0d66e 100644 --- a/SCSI/MMC/CPRM.cs +++ b/SCSI/MMC/CPRM.cs @@ -92,7 +92,7 @@ namespace DiscImageChef.Decoders.SCSI.MMC decoded.MKBPackData = new byte[CPRMMKBResponse.Length - 4]; decoded.DataLength = BigEndianBitConverter.ToUInt16(CPRMMKBResponse, 0); - decoded.Reserved = CPRMMKBResponse[2]; + decoded.Reserved = CPRMMKBResponse[2]; decoded.TotalPacks = CPRMMKBResponse[3]; Array.Copy(CPRMMKBResponse, 4, decoded.MKBPackData, 0, CPRMMKBResponse.Length - 4); @@ -107,9 +107,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC StringBuilder sb = new StringBuilder(); -#if DEBUG + #if DEBUG if(response.Reserved != 0) sb.AppendFormat("Reserved = 0x{0:X2}", response.Reserved).AppendLine(); -#endif + #endif sb.AppendFormat("Total number of CPRM Media Key Blocks available to transfer: {0}", response.TotalPacks) .AppendLine(); sb.AppendFormat("CPRM Media Key Blocks in hex follows:"); diff --git a/SCSI/MMC/DiscInformation.cs b/SCSI/MMC/DiscInformation.cs index cb2dcdd09..9cc4cf13f 100644 --- a/SCSI/MMC/DiscInformation.cs +++ b/SCSI/MMC/DiscInformation.cs @@ -289,22 +289,22 @@ namespace DiscImageChef.Decoders.SCSI.MMC if(decoded.DataLength + 2 != response.Length) return null; - decoded.DataType = (byte)((response[2] & 0xE0) >> 5); - decoded.Erasable |= (response[2] & 0x10) == 0x10; - decoded.LastSessionStatus = (byte)((response[2] & 0x0C) >> 2); - decoded.DiscStatus = (byte)(response[2] & 0x03); - decoded.FirstTrackNumber = response[3]; - decoded.Sessions = (ushort)((response[9] << 8) + response[4]); - decoded.FirstTrackLastSession = (ushort)((response[10] << 8) + response[5]); - decoded.LastTrackLastSession = (ushort)((response[11] << 8) + response[6]); + decoded.DataType = (byte)((response[2] & 0xE0) >> 5); + decoded.Erasable |= (response[2] & 0x10) == 0x10; + decoded.LastSessionStatus = (byte)((response[2] & 0x0C) >> 2); + decoded.DiscStatus = (byte)(response[2] & 0x03); + decoded.FirstTrackNumber = response[3]; + decoded.Sessions = (ushort)((response[9] << 8) + response[4]); + decoded.FirstTrackLastSession = (ushort)((response[10] << 8) + response[5]); + decoded.LastTrackLastSession = (ushort)((response[11] << 8) + response[6]); - decoded.DID_V |= (response[7] & 0x80) == 0x80; - decoded.DBC_V |= (response[7] & 0x40) == 0x40; - decoded.URU |= (response[7] & 0x20) == 0x20; - decoded.DAC_V |= (response[7] & 0x10) == 0x10; - decoded.Reserved |= (response[7] & 0x08) == 0x08; - decoded.Dbit |= (response[7] & 0x04) == 0x04; - decoded.BGFormatStatus = (byte)(response[7] & 0x03); + decoded.DID_V |= (response[7] & 0x80) == 0x80; + decoded.DBC_V |= (response[7] & 0x40) == 0x40; + decoded.URU |= (response[7] & 0x20) == 0x20; + decoded.DAC_V |= (response[7] & 0x10) == 0x10; + decoded.Reserved |= (response[7] & 0x08) == 0x08; + decoded.Dbit |= (response[7] & 0x04) == 0x04; + decoded.BGFormatStatus = (byte)(response[7] & 0x03); decoded.DiscIdentification = (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]); @@ -319,14 +319,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC decoded.DiscBarcode = BitConverter.ToUInt64(temp, 0); decoded.DiscApplicationCode = response[32]; - decoded.OPCTablesNumber = response[33]; + decoded.OPCTablesNumber = response[33]; if(decoded.OPCTablesNumber <= 0 || response.Length != decoded.OPCTablesNumber * 8 + 34) return decoded; decoded.OPCTables = new OPCTable[decoded.OPCTablesNumber]; for(int i = 0; i < decoded.OPCTablesNumber; i++) { - decoded.OPCTables[i].Speed = (ushort)((response[34 + i * 8 + 0] << 16) + response[34 + i * 8 + 1]); + decoded.OPCTables[i].Speed = (ushort)((response[34 + i * 8 + 0] << 16) + response[34 + i * 8 + 1]); decoded.OPCTables[i].OPCValues = new byte[6]; Array.Copy(response, 34 + i * 8 + 2, decoded.OPCTables[i].OPCValues, 0, 6); } @@ -415,11 +415,12 @@ namespace DiscImageChef.Decoders.SCSI.MMC sb.AppendFormat("Last track in last session is track {0}", decoded.LastTrackLastSession).AppendLine(); sb.AppendFormat("Last session Lead-In address is {0} (as LBA) or {1:X2}:{2:X2}:{3:X2}", decoded.LastSessionLeadInStartLBA, (decoded.LastSessionLeadInStartLBA & 0xFF0000) >> 16, - (decoded.LastSessionLeadInStartLBA & 0xFF00) >> 8, decoded.LastSessionLeadInStartLBA & 0xFF) + (decoded.LastSessionLeadInStartLBA & 0xFF00) >> 8, + decoded.LastSessionLeadInStartLBA & 0xFF) .AppendLine(); sb.AppendFormat("Last possible Lead-Out address is {0} (as LBA) or {1:X2}:{2:X2}:{3:X2}", decoded.LastPossibleLeadOutStartLBA, (decoded.LastPossibleLeadOutStartLBA & 0xFF0000) >> 16, - (decoded.LastPossibleLeadOutStartLBA & 0xFF00) >> 8, + (decoded.LastPossibleLeadOutStartLBA & 0xFF00) >> 8, decoded.LastPossibleLeadOutStartLBA & 0xFF).AppendLine(); sb.AppendLine(decoded.URU ? "Disc is defined for unrestricted use" : "Disc is defined for restricted use"); @@ -449,11 +450,11 @@ namespace DiscImageChef.Decoders.SCSI.MMC if(decoded.DataLength + 2 != response.Length) return null; - decoded.DataType = (byte)((response[2] & 0xE0) >> 5); - decoded.MaxTracks = (ushort)((response[4] << 8) + response[5]); - decoded.AssignedTracks = (ushort)((response[6] << 8) + response[7]); - decoded.MaxAppendableTracks = (ushort)((response[8] << 8) + response[9]); - decoded.AppendableTracks = (ushort)((response[10] << 8) + response[11]); + decoded.DataType = (byte)((response[2] & 0xE0) >> 5); + decoded.MaxTracks = (ushort)((response[4] << 8) + response[5]); + decoded.AssignedTracks = (ushort)((response[6] << 8) + response[7]); + decoded.MaxAppendableTracks = (ushort)((response[8] << 8) + response[9]); + decoded.AppendableTracks = (ushort)((response[10] << 8) + response[11]); return decoded; } diff --git a/SCSI/MMC/Enums.cs b/SCSI/MMC/Enums.cs index 2c64d2c90..de9b25a38 100644 --- a/SCSI/MMC/Enums.cs +++ b/SCSI/MMC/Enums.cs @@ -38,9 +38,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC [SuppressMessage("ReSharper", "MemberCanBeInternal")] public enum FormatLayerTypeCodes : ushort { - CDLayer = 0x0008, - DVDLayer = 0x0010, - BDLayer = 0x0040, + CDLayer = 0x0008, + DVDLayer = 0x0010, + BDLayer = 0x0040, HDDVDLayer = 0x0050 } @@ -48,30 +48,30 @@ namespace DiscImageChef.Decoders.SCSI.MMC [SuppressMessage("ReSharper", "MemberCanBeInternal")] public enum SessionStatusCodes : byte { - Empty = 0x00, - Incomplete = 0x01, + Empty = 0x00, + Incomplete = 0x01, ReservedOrDamaged = 0x02, - Complete = 0x03 + Complete = 0x03 } [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "MemberCanBeInternal")] public enum DiscStatusCodes : byte { - Empty = 0x00, + Empty = 0x00, Incomplete = 0x01, - Finalized = 0x02, - Others = 0x03 + Finalized = 0x02, + Others = 0x03 } [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "MemberCanBeInternal")] public enum BGFormatStatusCodes : byte { - NoFormattable = 0x00, + NoFormattable = 0x00, IncompleteBackgroundFormat = 0x01, BackgroundFormatInProgress = 0x02, - FormatComplete = 0x03 + FormatComplete = 0x03 } [SuppressMessage("ReSharper", "InconsistentNaming")] @@ -82,8 +82,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC /// Also valid for CD-DA, DVD and BD /// CDROM = 0x00, - CDi = 0x10, - CDROMXA = 0x20, + CDi = 0x10, + CDROMXA = 0x20, Undefined = 0xFF } } \ No newline at end of file diff --git a/SCSI/MMC/Features.cs b/SCSI/MMC/Features.cs index 8011b6057..a333c7ba2 100644 --- a/SCSI/MMC/Features.cs +++ b/SCSI/MMC/Features.cs @@ -499,7 +499,7 @@ namespace DiscImageChef.Decoders.SCSI.MMC public struct Profile { public ProfileNumber Number; - public bool Current; + public bool Current; } /// @@ -2357,11 +2357,11 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0000 decoded = new Feature_0000(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - int offset = 4; + int offset = 4; List listProfiles = new List(); while(offset < feature.Length) { @@ -2390,9 +2390,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0001 decoded = new Feature_0001(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.PhysicalInterfaceStandard = (PhysicalInterfaces)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]); @@ -2418,9 +2418,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0002 decoded = new Feature_0002(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.Async |= (feature[4] & 0x01) == 0x01; @@ -2443,14 +2443,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0003 decoded = new Feature_0003(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.LoadingMechanismType = (byte)((feature[4] & 0xE0) >> 5); - decoded.Eject |= (feature[4] & 0x08) == 0x08; - decoded.PreventJumper |= (feature[4] & 0x04) == 0x04; - decoded.Lock |= (feature[4] & 0x01) == 0x01; + decoded.LoadingMechanismType = (byte)((feature[4] & 0xE0) >> 5); + decoded.Eject |= (feature[4] & 0x08) == 0x08; + decoded.PreventJumper |= (feature[4] & 0x04) == 0x04; + decoded.Lock |= (feature[4] & 0x01) == 0x01; if(decoded.Version < 2) return decoded; @@ -2474,11 +2474,11 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0004 decoded = new Feature_0004(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.SPWP |= (feature[4] & 0x02) == 0x02; + decoded.SPWP |= (feature[4] & 0x02) == 0x02; decoded.SSWPP |= (feature[4] & 0x01) == 0x01; if(decoded.Version >= 1) decoded.WDCB |= (feature[4] & 0x04) == 0x04; @@ -2502,12 +2502,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0010 decoded = new Feature_0010(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.LogicalBlockSize = (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]); - decoded.Blocking = (ushort)((feature[8] << 8) + feature[9]); + decoded.LogicalBlockSize = + (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]); + decoded.Blocking = + (ushort)((feature[8] << 8) + feature[9]); decoded.PP |= (feature[10] & 0x01) == 0x01; return decoded; @@ -2527,9 +2529,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_001D decoded = new Feature_001D(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -2548,13 +2550,13 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_001E decoded = new Feature_001E(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); if(decoded.Version >= 1) { - decoded.C2 |= (feature[4] & 0x02) == 0x02; + decoded.C2 |= (feature[4] & 0x02) == 0x02; decoded.CDText |= (feature[4] & 0x01) == 0x01; } @@ -2577,14 +2579,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_001F decoded = new Feature_001F(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); if(decoded.Version >= 2 && feature.Length >= 8) { decoded.MULTI110 |= (feature[4] & 0x01) == 0x01; - decoded.DualR |= (feature[6] & 0x01) == 0x01; + decoded.DualR |= (feature[6] & 0x01) == 0x01; } // TODO: Check this @@ -2607,17 +2609,17 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0020 decoded = new Feature_0020(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); if(decoded.Version < 1) return decoded; decoded.LastLBA = (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]); decoded.LogicalBlockSize = (uint)((feature[8] << 24) + (feature[9] << 16) + (feature[10] << 8) + feature[11]); - decoded.Blocking = (ushort)((feature[12] << 8) + feature[13]); - decoded.PP |= (feature[14] & 0x01) == 0x01; + decoded.Blocking = (ushort)((feature[12] << 8) + feature[13]); + decoded.PP |= (feature[14] & 0x01) == 0x01; return decoded; } @@ -2636,15 +2638,15 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0021 decoded = new Feature_0021(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); if(decoded.Version >= 1) { - decoded.DataTypeSupported = (ushort)((feature[4] << 8) + feature[5]); - decoded.BUF |= (feature[6] & 0x01) == 0x01; - decoded.LinkSizes = new byte[feature[7]]; + decoded.DataTypeSupported = (ushort)((feature[4] << 8) + feature[5]); + decoded.BUF |= (feature[6] & 0x01) == 0x01; + decoded.LinkSizes = new byte[feature[7]]; if(feature.Length > feature[7] + 8) Array.Copy(feature, 8, decoded.LinkSizes, 0, feature[7]); } @@ -2670,9 +2672,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0022 decoded = new Feature_0022(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -2691,17 +2693,17 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0023 decoded = new Feature_0023(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); if(decoded.Version >= 1 && feature.Length >= 12) { decoded.RENoSA |= (feature[4] & 0x08) == 0x08; decoded.Expand |= (feature[4] & 0x04) == 0x04; - decoded.QCert |= (feature[4] & 0x02) == 0x02; - decoded.Cert |= (feature[4] & 0x01) == 0x01; - decoded.RRM |= (feature[8] & 0x01) == 0x01; + decoded.QCert |= (feature[4] & 0x02) == 0x02; + decoded.Cert |= (feature[4] & 0x01) == 0x01; + decoded.RRM |= (feature[8] & 0x01) == 0x01; } if(decoded.Version >= 2 && feature.Length >= 12) decoded.FRF |= (feature[4] & 0x80) == 0x80; @@ -2723,9 +2725,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0024 decoded = new Feature_0024(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); if(decoded.Version >= 1 && feature.Length >= 8) decoded.SSA |= (feature[4] & 0x80) == 0x80; @@ -2746,12 +2748,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0025 decoded = new Feature_0025(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.LogicalBlockSize = (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]); - decoded.Blocking = (ushort)((feature[8] << 8) + feature[9]); + decoded.LogicalBlockSize = + (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]); + decoded.Blocking = + (ushort)((feature[8] << 8) + feature[9]); decoded.PP |= (feature[10] & 0x01) == 0x01; return decoded; @@ -2771,9 +2775,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0026 decoded = new Feature_0026(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -2792,9 +2796,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0027 decoded = new Feature_0027(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -2813,16 +2817,16 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0028 decoded = new Feature_0028(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.Write |= (feature[4] & 0x01) == 0x01; if(decoded.Version < 1) return decoded; decoded.DVDPWrite |= (feature[4] & 0x04) == 0x04; - decoded.DVDPRead |= (feature[4] & 0x02) == 0x02; + decoded.DVDPRead |= (feature[4] & 0x02) == 0x02; return decoded; } @@ -2841,13 +2845,13 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0029 decoded = new Feature_0029(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.DRTDM |= (feature[4] & 0x01) == 0x01; - decoded.DBICacheZones = feature[5]; - decoded.Entries = (ushort)((feature[6] << 8) + feature[7]); + decoded.DRTDM |= (feature[4] & 0x01) == 0x01; + decoded.DBICacheZones = feature[5]; + decoded.Entries = (ushort)((feature[6] << 8) + feature[7]); return decoded; } @@ -2866,11 +2870,11 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_002A decoded = new Feature_002A(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.Write |= (feature[4] & 0x01) == 0x01; + decoded.Write |= (feature[4] & 0x01) == 0x01; decoded.CloseOnly |= (feature[5] & 0x01) == 0x01; if(decoded.Version >= 1) decoded.QuickStart |= (feature[5] & 0x02) == 0x02; @@ -2892,9 +2896,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_002B decoded = new Feature_002B(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.Write |= (feature[4] & 0x01) == 0x01; @@ -2915,14 +2919,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_002C decoded = new Feature_002C(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.DSDG |= (feature[4] & 0x08) == 0x08; - decoded.DSDR |= (feature[4] & 0x04) == 0x04; + decoded.DSDG |= (feature[4] & 0x08) == 0x08; + decoded.DSDR |= (feature[4] & 0x04) == 0x04; decoded.Intermediate |= (feature[4] & 0x02) == 0x02; - decoded.Blank |= (feature[4] & 0x01) == 0x01; + decoded.Blank |= (feature[4] & 0x01) == 0x01; return decoded; } @@ -2941,19 +2945,19 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_002D decoded = new Feature_002D(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.TestWrite |= (feature[4] & 0x04) == 0x04; - decoded.CDRW |= (feature[4] & 0x02) == 0x02; - decoded.RWSubchannel |= (feature[4] & 0x01) == 0x01; - decoded.DataTypeSupported = (ushort)((feature[6] << 8) + feature[7]); + decoded.TestWrite |= (feature[4] & 0x04) == 0x04; + decoded.CDRW |= (feature[4] & 0x02) == 0x02; + decoded.RWSubchannel |= (feature[4] & 0x01) == 0x01; + decoded.DataTypeSupported = (ushort)((feature[6] << 8) + feature[7]); if(decoded.Version < 2) return decoded; - decoded.BUF |= (feature[4] & 0x40) == 0x40; - decoded.RWRaw |= (feature[4] & 0x10) == 0x10; + decoded.BUF |= (feature[4] & 0x40) == 0x40; + decoded.RWRaw |= (feature[4] & 0x10) == 0x10; decoded.RWPack |= (feature[4] & 0x08) == 0x08; return decoded; @@ -2973,17 +2977,17 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_002E decoded = new Feature_002E(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.SAO |= (feature[4] & 0x20) == 0x20; - decoded.RAWMS |= (feature[4] & 0x10) == 0x10; - decoded.RAW |= (feature[4] & 0x08) == 0x08; - decoded.TestWrite |= (feature[4] & 0x04) == 0x04; - decoded.CDRW |= (feature[4] & 0x02) == 0x02; - decoded.RW |= (feature[4] & 0x01) == 0x01; - decoded.MaxCueSheet = (uint)((feature[5] << 16) + (feature[6] << 8) + feature[7]); + decoded.SAO |= (feature[4] & 0x20) == 0x20; + decoded.RAWMS |= (feature[4] & 0x10) == 0x10; + decoded.RAW |= (feature[4] & 0x08) == 0x08; + decoded.TestWrite |= (feature[4] & 0x04) == 0x04; + decoded.CDRW |= (feature[4] & 0x02) == 0x02; + decoded.RW |= (feature[4] & 0x01) == 0x01; + decoded.MaxCueSheet = (uint)((feature[5] << 16) + (feature[6] << 8) + feature[7]); if(decoded.Version >= 1) decoded.BUF |= (feature[4] & 0x40) == 0x40; @@ -3004,11 +3008,11 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_002F decoded = new Feature_002F(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.BUF |= (feature[4] & 0x40) == 0x40; + decoded.BUF |= (feature[4] & 0x40) == 0x40; decoded.TestWrite |= (feature[4] & 0x04) == 0x04; if(decoded.Version >= 1) decoded.DVDRW |= (feature[4] & 0x02) == 0x02; @@ -3032,9 +3036,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0030 decoded = new Feature_0030(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -3053,9 +3057,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0031 decoded = new Feature_0031(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.TestWrite |= (feature[4] & 0x04) == 0x04; @@ -3076,12 +3080,12 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0032 decoded = new Feature_0032(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.Intermediate |= (feature[4] & 0x02) == 0x02; - decoded.Blank |= (feature[4] & 0x01) == 0x01; + decoded.Blank |= (feature[4] & 0x01) == 0x01; return decoded; } @@ -3100,9 +3104,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0033 decoded = new Feature_0033(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); if(feature[7] <= 0 || feature.Length <= feature[7] + 8) return decoded; @@ -3126,9 +3130,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0035 decoded = new Feature_0035(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -3147,9 +3151,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0037 decoded = new Feature_0037(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.SubtypeSupport = feature[5]; @@ -3170,9 +3174,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0038 decoded = new Feature_0038(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -3191,13 +3195,13 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_003A decoded = new Feature_003A(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.Write |= (feature[4] & 0x01) == 0x01; + decoded.Write |= (feature[4] & 0x01) == 0x01; decoded.QuickStart |= (feature[5] & 0x02) == 0x02; - decoded.CloseOnly |= (feature[5] & 0x01) == 0x01; + decoded.CloseOnly |= (feature[5] & 0x01) == 0x01; return decoded; } @@ -3216,9 +3220,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_003B decoded = new Feature_003B(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.Write |= (feature[4] & 0x01) == 0x01; @@ -3239,20 +3243,20 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0040 decoded = new Feature_0040(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.OldRE |= (feature[9] & 0x01) == 0x01; - decoded.OldR |= (feature[17] & 0x01) == 0x01; + decoded.OldRE |= (feature[9] & 0x01) == 0x01; + decoded.OldR |= (feature[17] & 0x01) == 0x01; decoded.OldROM |= (feature[25] & 0x01) == 0x01; if(decoded.Version < 1) return decoded; - decoded.BCA |= (feature[4] & 0x01) == 0x01; - decoded.RE2 |= (feature[9] & 0x04) == 0x04; - decoded.RE1 |= (feature[9] & 0x02) == 0x02; - decoded.R |= (feature[17] & 0x02) == 0x02; + decoded.BCA |= (feature[4] & 0x01) == 0x01; + decoded.RE2 |= (feature[9] & 0x04) == 0x04; + decoded.RE1 |= (feature[9] & 0x02) == 0x02; + decoded.R |= (feature[17] & 0x02) == 0x02; decoded.ROM |= (feature[25] & 0x02) == 0x02; return decoded; @@ -3272,19 +3276,19 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0041 decoded = new Feature_0041(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.SVNR |= (feature[4] & 0x01) == 0x01; - decoded.OldRE |= (feature[9] & 0x01) == 0x01; - decoded.OldR |= (feature[17] & 0x01) == 0x01; + decoded.SVNR |= (feature[4] & 0x01) == 0x01; + decoded.OldRE |= (feature[9] & 0x01) == 0x01; + decoded.OldR |= (feature[17] & 0x01) == 0x01; if(decoded.Version < 1) return decoded; - decoded.RE2 |= (feature[9] & 0x04) == 0x04; - decoded.RE1 |= (feature[9] & 0x02) == 0x02; - decoded.R |= (feature[17] & 0x02) == 0x02; + decoded.RE2 |= (feature[9] & 0x04) == 0x04; + decoded.RE1 |= (feature[9] & 0x02) == 0x02; + decoded.R |= (feature[17] & 0x02) == 0x02; return decoded; } @@ -3303,9 +3307,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0042 decoded = new Feature_0042(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -3324,11 +3328,11 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0050 decoded = new Feature_0050(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.HDDVDR |= (feature[4] & 0x01) == 0x01; + decoded.HDDVDR |= (feature[4] & 0x01) == 0x01; decoded.HDDVDRAM |= (feature[6] & 0x01) == 0x01; return decoded; @@ -3348,11 +3352,11 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0051 decoded = new Feature_0051(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.HDDVDR |= (feature[4] & 0x01) == 0x01; + decoded.HDDVDR |= (feature[4] & 0x01) == 0x01; decoded.HDDVDRAM |= (feature[6] & 0x01) == 0x01; return decoded; @@ -3372,9 +3376,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0080 decoded = new Feature_0080(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.RI |= (feature[4] & 0x01) == 0x01; @@ -3395,9 +3399,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0100 decoded = new Feature_0100(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -3416,9 +3420,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0101 decoded = new Feature_0101(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.PP |= (feature[4] & 0x01) == 0x01; @@ -3439,13 +3443,13 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0102 decoded = new Feature_0102(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.SCC |= (feature[4] & 0x10) == 0x10; - decoded.SDP |= (feature[4] & 0x04) == 0x04; - decoded.HighestSlotNumber = (byte)(feature[7] & 0x1F); + decoded.SCC |= (feature[4] & 0x10) == 0x10; + decoded.SDP |= (feature[4] & 0x04) == 0x04; + decoded.HighestSlotNumber = (byte)(feature[7] & 0x1F); return decoded; } @@ -3464,14 +3468,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0103 decoded = new Feature_0103(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.Scan |= (feature[4] & 0x04) == 0x04; - decoded.SCM |= (feature[4] & 0x02) == 0x02; - decoded.SV |= (feature[4] & 0x01) == 0x01; - decoded.VolumeLevels = (ushort)((feature[6] << 8) + feature[7]); + decoded.Scan |= (feature[4] & 0x04) == 0x04; + decoded.SCM |= (feature[4] & 0x02) == 0x02; + decoded.SV |= (feature[4] & 0x01) == 0x01; + decoded.VolumeLevels = (ushort)((feature[6] << 8) + feature[7]); return decoded; } @@ -3490,9 +3494,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0104 decoded = new Feature_0104(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); if(decoded.Version >= 1 && feature.Length >= 8) decoded.M5 |= (feature[4] & 0x01) == 0x01; @@ -3513,14 +3517,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0105 decoded = new Feature_0105(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); if(decoded.Version < 1 || feature.Length < 8) return decoded; - decoded.Group3 |= (feature[4] & 0x01) == 0x01; - decoded.UnitLength = (ushort)((feature[6] << 8) + feature[7]); + decoded.Group3 |= (feature[4] & 0x01) == 0x01; + decoded.UnitLength = (ushort)((feature[6] << 8) + feature[7]); return decoded; } @@ -3539,9 +3543,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0106 decoded = new Feature_0106(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.CSSVersion = feature[7]; @@ -3562,22 +3566,22 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0107 decoded = new Feature_0107(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); if(decoded.Version >= 3 && feature.Length >= 8) { decoded.RBCB |= (feature[4] & 0x10) == 0x10; - decoded.SCS |= (feature[4] & 0x08) == 0x08; + decoded.SCS |= (feature[4] & 0x08) == 0x08; decoded.MP2A |= (feature[4] & 0x04) == 0x04; decoded.WSPD |= (feature[4] & 0x02) == 0x02; - decoded.SW |= (feature[4] & 0x01) == 0x01; + decoded.SW |= (feature[4] & 0x01) == 0x01; } if(decoded.Version < 5 || feature.Length < 8) return decoded; - decoded.SMP |= (feature[4] & 0x20) == 0x20; + decoded.SMP |= (feature[4] & 0x20) == 0x20; decoded.RBCB |= (feature[4] & 0x10) == 0x10; return decoded; @@ -3597,9 +3601,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0108 decoded = new Feature_0108(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); byte[] serial = new byte[feature.Length]; Array.Copy(feature, 4, serial, 0, feature.Length - 4); @@ -3622,9 +3626,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0109 decoded = new Feature_0109(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -3643,14 +3647,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_010A decoded = new Feature_010A(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.DCBs = new uint[feature[3] / 4]; for(int i = 0; i < decoded.DCBs.Length; i++) decoded.DCBs[i] = (uint)((feature[0 + 4 + i * 4] << 24) + (feature[1 + 4 + i * 4] << 16) + - (feature[2 + 4 + i * 4] << 8) + feature[3 + 4 + i * 4]); + (feature[2 + 4 + i * 4] << 8) + feature[3 + 4 + i * 4]); return decoded; } @@ -3669,9 +3673,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_010B decoded = new Feature_010B(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.CPRMVersion = feature[7]; @@ -3692,17 +3696,17 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_010C decoded = new Feature_010C(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.Century = (ushort)((feature[4] << 8) + feature[5]); - decoded.Year = (ushort)((feature[6] << 8) + feature[7]); - decoded.Month = (ushort)((feature[8] << 8) + feature[9]); - decoded.Day = (ushort)((feature[10] << 8) + feature[11]); - decoded.Hour = (ushort)((feature[12] << 8) + feature[13]); - decoded.Minute = (ushort)((feature[14] << 8) + feature[15]); - decoded.Second = (ushort)((feature[16] << 8) + feature[17]); + decoded.Century = (ushort)((feature[4] << 8) + feature[5]); + decoded.Year = (ushort)((feature[6] << 8) + feature[7]); + decoded.Month = (ushort)((feature[8] << 8) + feature[9]); + decoded.Day = (ushort)((feature[10] << 8) + feature[11]); + decoded.Hour = (ushort)((feature[12] << 8) + feature[13]); + decoded.Minute = (ushort)((feature[14] << 8) + feature[15]); + decoded.Second = (ushort)((feature[16] << 8) + feature[17]); return decoded; } @@ -3721,14 +3725,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_010D decoded = new Feature_010D(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.BNG |= (feature[4] & 0x01) == 0x01; - decoded.BindNonceBlocks = feature[5]; - decoded.AGIDs = (byte)(feature[6] & 0x0F); - decoded.AACSVersion = feature[7]; + decoded.BNG |= (feature[4] & 0x01) == 0x01; + decoded.BindNonceBlocks = feature[5]; + decoded.AGIDs = (byte)(feature[6] & 0x0F); + decoded.AACSVersion = feature[7]; if(decoded.Version < 2) return decoded; @@ -3754,9 +3758,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_010E decoded = new Feature_010E(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); decoded.MaxScrambleExtent = feature[4]; @@ -3777,9 +3781,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0110 decoded = new Feature_0110(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -3798,9 +3802,9 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0113 decoded = new Feature_0113(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); return decoded; } @@ -3819,14 +3823,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC Feature_0142 decoded = new Feature_0142(); - decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Current |= (feature[2] & 0x01) == 0x01; decoded.Persistent |= (feature[2] & 0x02) == 0x02; - decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); - decoded.PSAU |= (feature[4] & 0x80) == 0x80; - decoded.LOSPB |= (feature[4] & 0x40) == 0x40; - decoded.ME |= (feature[4] & 0x01) == 0x01; - decoded.Profiles = new ushort[feature[5]]; + decoded.PSAU |= (feature[4] & 0x80) == 0x80; + decoded.LOSPB |= (feature[4] & 0x40) == 0x40; + decoded.ME |= (feature[4] & 0x01) == 0x01; + decoded.Profiles = new ushort[feature[5]]; if(feature[5] * 2 + 6 != feature.Length) return decoded; for(int i = 0; i < feature[5]; i++) @@ -3839,8 +3843,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0000 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0000 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Supported Profiles:"); if(ftr.Profiles == null) return sb.ToString(); @@ -3982,8 +3986,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0001 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0001 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Core Feature:"); sb.Append("\tDrive uses "); @@ -4036,8 +4040,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0002 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0002 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Morphing:"); @@ -4054,8 +4058,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0003 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0003 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Removable Medium:"); @@ -4095,8 +4099,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0004 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0004 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Write Protect:"); @@ -4112,8 +4116,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0010 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0010 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("MMC Random Readable"); if(ftr.Current) sb.Append(" (current)"); @@ -4139,8 +4143,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_001E ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_001E ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("MMC CD Read"); if(ftr.Current) sb.Append(" (current)"); @@ -4157,8 +4161,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_001F ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_001F ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("MMC DVD Read"); if(ftr.Current) sb.Append(" (current)"); @@ -4176,8 +4180,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0020 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0020 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("MMC Random Writable:"); if(ftr.Current) sb.Append(" (current)"); @@ -4197,8 +4201,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0021 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0021 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Incremental Streaming Writable:"); @@ -4240,8 +4244,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0023 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0023 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Formattable:"); sb.AppendLine("\tDrive can format media into logical blocks"); @@ -4260,8 +4264,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0024 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0024 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Hardware Defect Management:"); sb.AppendLine("\tDrive shall be able to provide a defect-free contiguous address space"); @@ -4274,8 +4278,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0025 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0025 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("MMC Write Once"); if(ftr.Current) sb.Append(" (current)"); @@ -4301,8 +4305,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0027 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0027 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("Drive can write High-Speed CD-RW"); if(ftr.Current) sb.AppendLine(" (current)"); @@ -4315,12 +4319,12 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0028 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0028 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); if(ftr.Write && ftr.DVDPRead && ftr.DVDPWrite) sb.Append("Drive can read and write CD-MRW and DVD+MRW"); - else if(ftr.DVDPRead && ftr.DVDPWrite) sb.Append("Drive can read and write DVD+MRW"); - else if(ftr.Write && ftr.DVDPRead) sb.Append("Drive and read DVD+MRW and read and write CD-MRW"); + else if(ftr.DVDPRead && ftr.DVDPWrite) sb.Append("Drive can read and write DVD+MRW"); + else if(ftr.Write && ftr.DVDPRead) sb.Append("Drive and read DVD+MRW and read and write CD-MRW"); else if(ftr.Write) sb.Append("Drive can read and write CD-MRW"); else if(ftr.DVDPRead) sb.Append("Drive can read CD-MRW and DVD+MRW"); else sb.Append("Drive can read CD-MRW"); @@ -4335,8 +4339,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0029 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0029 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Enhanced Defect Reporting Feature:"); @@ -4353,8 +4357,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_002A ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_002A ftr = feature.Value; + StringBuilder sb = new StringBuilder(); if(ftr.Write) { @@ -4380,8 +4384,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_002B ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_002B ftr = feature.Value; + StringBuilder sb = new StringBuilder(); if(ftr.Write) { @@ -4403,8 +4407,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_002C ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_002C ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("MMC Rigid Restricted Overwrite"); sb.AppendLine(ftr.Current ? " (current):" : ":"); @@ -4422,8 +4426,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_002D ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_002D ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("Drive can write CDs in Track at Once Mode:"); @@ -4466,10 +4470,10 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_002E ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_002E ftr = feature.Value; + StringBuilder sb = new StringBuilder(); - if(ftr.SAO && !ftr.RAW) sb.AppendLine("Drive can write CDs in Session at Once Mode:"); + if(ftr.SAO && !ftr.RAW) sb.AppendLine("Drive can write CDs in Session at Once Mode:"); else if(!ftr.SAO && ftr.RAW) sb.AppendLine("Drive can write CDs in raw Mode:"); else sb.AppendLine("Drive can write CDs in Session at Once and in Raw Modes:"); @@ -4492,8 +4496,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_002F ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_002F ftr = feature.Value; + StringBuilder sb = new StringBuilder(); if(ftr.DVDRW && ftr.RDL) sb.AppendLine("Drive supports writing DVD-R, DVD-RW and DVD-R DL"); else if(ftr.RDL) sb.AppendLine("Drive supports writing DVD-R and DVD-R DL"); @@ -4515,8 +4519,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0031 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0031 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("Drive supports writing DDCD-R"); @@ -4529,8 +4533,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0032 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0032 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("Drive supports writing DDCD-RW"); @@ -4544,8 +4548,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0033 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0033 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Layer Jump Recording:"); @@ -4566,8 +4570,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0037 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0037 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("Drive can write CD-RW"); if(ftr.SubtypeSupport <= 0) return sb.ToString(); @@ -4595,8 +4599,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_003A ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_003A ftr = feature.Value; + StringBuilder sb = new StringBuilder(); if(ftr.Write) { @@ -4622,8 +4626,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_003B ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_003B ftr = feature.Value; + StringBuilder sb = new StringBuilder(); if(ftr.Write) { @@ -4645,8 +4649,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0040 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0040 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("MMC BD Read"); sb.AppendLine(ftr.Current ? " (current):" : ":"); @@ -4668,8 +4672,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0041 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0041 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("MMC BD Write"); sb.AppendLine(ftr.Current ? " (current):" : ":"); @@ -4696,8 +4700,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0050 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0050 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); if(ftr.HDDVDR && ftr.HDDVDRAM) sb.Append("Drive can read HD DVD-ROM, HD DVD-RW, HD DVD-R and HD DVD-RAM"); else if(ftr.HDDVDR) sb.Append("Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-R"); @@ -4714,8 +4718,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0051 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0051 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); if(ftr.HDDVDR && ftr.HDDVDRAM) sb.Append("Drive can write HD DVD-RW, HD DVD-R and HD DVD-RAM"); else if(ftr.HDDVDR) sb.Append("Drive can write HD DVD-RW and HD DVD-R"); @@ -4732,8 +4736,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0080 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0080 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("Drive is able to access Hybrid discs"); if(ftr.Current) sb.AppendLine(" (current)"); @@ -4754,8 +4758,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0101 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0101 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("Drive supports S.M.A.R.T."); if(ftr.PP) sb.AppendLine("\tDrive supports the Informational Exceptions Control mode page 1Ch"); @@ -4767,8 +4771,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0102 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0102 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Embedded Changer:"); @@ -4784,8 +4788,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0103 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0103 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("Drive has an analogue audio output"); @@ -4802,8 +4806,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0104 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0104 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("Drive supports Microcode Upgrade"); if(ftr.M5) @@ -4816,8 +4820,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0105 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0105 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("Drive supports Timeout & Protect mode page 1Dh"); @@ -4834,8 +4838,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0106 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0106 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendFormat("Drive supports DVD CSS/CPPM version {0}", ftr.CSSVersion); if(ftr.Current) sb.AppendLine(" and current disc is encrypted"); @@ -4848,8 +4852,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0107 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0107 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("MMC Real Time Streaming:"); @@ -4869,8 +4873,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0108 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0108 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendFormat("Drive serial number: {0}", ftr.Serial).AppendLine(); @@ -4886,8 +4890,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_010A ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_010A ftr = feature.Value; + StringBuilder sb = new StringBuilder(); if(ftr.DCBs == null) return sb.ToString(); @@ -4900,8 +4904,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_010B ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_010B ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendFormat("Drive supports DVD CPRM version {0}", ftr.CPRMVersion); if(ftr.Current) sb.AppendLine(" and current disc is or can be encrypted"); @@ -4914,8 +4918,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_010C ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_010C ftr = feature.Value; + StringBuilder sb = new StringBuilder(); byte[] temp = new byte[4]; temp[0] = (byte)((ftr.Century & 0xFF00) >> 8); @@ -4923,23 +4927,23 @@ namespace DiscImageChef.Decoders.SCSI.MMC temp[2] = (byte)((ftr.Year & 0xFF00) >> 8); temp[3] = (byte)(ftr.Year & 0xFF); string syear = Encoding.ASCII.GetString(temp); - temp = new byte[2]; + temp = new byte[2]; temp[0] = (byte)((ftr.Month & 0xFF00) >> 8); temp[1] = (byte)(ftr.Month & 0xFF); string smonth = Encoding.ASCII.GetString(temp); - temp = new byte[2]; + temp = new byte[2]; temp[0] = (byte)((ftr.Day & 0xFF00) >> 8); temp[1] = (byte)(ftr.Day & 0xFF); string sday = Encoding.ASCII.GetString(temp); - temp = new byte[2]; + temp = new byte[2]; temp[0] = (byte)((ftr.Hour & 0xFF00) >> 8); temp[1] = (byte)(ftr.Hour & 0xFF); string shour = Encoding.ASCII.GetString(temp); - temp = new byte[2]; + temp = new byte[2]; temp[0] = (byte)((ftr.Minute & 0xFF00) >> 8); temp[1] = (byte)(ftr.Minute & 0xFF); string sminute = Encoding.ASCII.GetString(temp); - temp = new byte[2]; + temp = new byte[2]; temp[0] = (byte)((ftr.Second & 0xFF00) >> 8); temp[1] = (byte)(ftr.Second & 0xFF); string ssecond = Encoding.ASCII.GetString(temp); @@ -4951,12 +4955,12 @@ namespace DiscImageChef.Decoders.SCSI.MMC sb.AppendFormat("Drive firmware is dated {0}", fwDate).AppendLine(); } -#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body + #pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body catch { // ignored } -#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body + #pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body return sb.ToString(); } @@ -4965,8 +4969,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_010D ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_010D ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendFormat("Drive supports AACS version {0}", ftr.AACSVersion); if(ftr.Current) sb.AppendLine(" and current disc is encrypted"); @@ -4983,6 +4987,7 @@ namespace DiscImageChef.Decoders.SCSI.MMC sb.AppendFormat("\t{0} media blocks are required for the binding nonce", ftr.BindNonceBlocks) .AppendLine(); } + if(ftr.AGIDs > 0) sb.AppendFormat("\tDrive supports {0} AGIDs concurrently", ftr.AGIDs).AppendLine(); return sb.ToString(); @@ -4992,8 +4997,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_010E ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_010E ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.Append("Drive supports DVD-Download"); if(ftr.Current) sb.AppendLine(" (current)"); @@ -5010,8 +5015,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0110 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0110 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine(ftr.Current ? "Drive and currently inserted media support VCPS" : "Drive supports VCPS"); @@ -5022,8 +5027,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0113 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0113 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine(ftr.Current ? "Drive and currently inserted media support SecurDisc" @@ -5036,8 +5041,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC { if(!feature.HasValue) return null; - Feature_0142 ftr = feature.Value; - StringBuilder sb = new StringBuilder(); + Feature_0142 ftr = feature.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("Drive supports the Trusted Computing Group Optical Security Subsystem Class"); @@ -5348,10 +5353,10 @@ namespace DiscImageChef.Decoders.SCSI.MMC { SeparatedFeatures dec = new SeparatedFeatures { - DataLength = (uint)((response[0] << 24) + (response[1] << 16) + (response[2] << 8) + response[4]), - CurrentProfile = (ushort)((response[6] << 8) + response[7]) + DataLength = (uint)((response[0] << 24) + (response[1] << 16) + (response[2] << 8) + response[4]), + CurrentProfile = (ushort)((response[6] << 8) + response[7]) }; - uint offset = 8; + uint offset = 8; List descLst = new List(); while(offset + 4 < response.Length) @@ -5387,8 +5392,8 @@ namespace DiscImageChef.Decoders.SCSI.MMC [SuppressMessage("ReSharper", "NotAccessedField.Global")] public struct SeparatedFeatures { - public uint DataLength; - public ushort CurrentProfile; + public uint DataLength; + public ushort CurrentProfile; public FeatureDescriptor[] Descriptors; } } diff --git a/SCSI/MMC/Hybrid.cs b/SCSI/MMC/Hybrid.cs index 2756e9e01..0535b4513 100644 --- a/SCSI/MMC/Hybrid.cs +++ b/SCSI/MMC/Hybrid.cs @@ -116,14 +116,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; - decoded.DataLength = BigEndianBitConverter.ToUInt16(FormatLayersResponse, 0); - decoded.Reserved1 = FormatLayersResponse[2]; - decoded.Reserved2 = FormatLayersResponse[3]; - decoded.NumberOfLayers = FormatLayersResponse[4]; - decoded.Reserved3 = (byte)((FormatLayersResponse[5] & 0xC0) >> 6); + decoded.DataLength = BigEndianBitConverter.ToUInt16(FormatLayersResponse, 0); + decoded.Reserved1 = FormatLayersResponse[2]; + decoded.Reserved2 = FormatLayersResponse[3]; + decoded.NumberOfLayers = FormatLayersResponse[4]; + decoded.Reserved3 = (byte)((FormatLayersResponse[5] & 0xC0) >> 6); decoded.DefaultFormatLayer = (byte)((FormatLayersResponse[5] & 0x30) >> 4); - decoded.Reserved4 = (byte)((FormatLayersResponse[5] & 0x0C) >> 2); - decoded.OnlineFormatLayer = (byte)(FormatLayersResponse[5] & 0x03); + decoded.Reserved4 = (byte)((FormatLayersResponse[5] & 0x0C) >> 2); + decoded.OnlineFormatLayer = (byte)(FormatLayersResponse[5] & 0x03); decoded.FormatLayers = new ushort[(FormatLayersResponse.Length - 6) / 2]; @@ -150,28 +150,28 @@ namespace DiscImageChef.Decoders.SCSI.MMC { sb.AppendFormat("Layer {0} is of type Blu-ray", i).AppendLine(); if(response.DefaultFormatLayer == i) sb.AppendLine("This is the default layer."); - if(response.OnlineFormatLayer == i) sb.AppendLine("This is the layer actually in use."); + if(response.OnlineFormatLayer == i) sb.AppendLine("This is the layer actually in use."); break; } case (ushort)FormatLayerTypeCodes.CDLayer: { sb.AppendFormat("Layer {0} is of type CD", i).AppendLine(); if(response.DefaultFormatLayer == i) sb.AppendLine("This is the default layer."); - if(response.OnlineFormatLayer == i) sb.AppendLine("This is the layer actually in use."); + if(response.OnlineFormatLayer == i) sb.AppendLine("This is the layer actually in use."); break; } case (ushort)FormatLayerTypeCodes.DVDLayer: { sb.AppendFormat("Layer {0} is of type DVD", i).AppendLine(); if(response.DefaultFormatLayer == i) sb.AppendLine("This is the default layer."); - if(response.OnlineFormatLayer == i) sb.AppendLine("This is the layer actually in use."); + if(response.OnlineFormatLayer == i) sb.AppendLine("This is the layer actually in use."); break; } case (ushort)FormatLayerTypeCodes.HDDVDLayer: { sb.AppendFormat("Layer {0} is of type HD DVD", i).AppendLine(); if(response.DefaultFormatLayer == i) sb.AppendLine("This is the default layer."); - if(response.OnlineFormatLayer == i) sb.AppendLine("This is the layer actually in use."); + if(response.OnlineFormatLayer == i) sb.AppendLine("This is the layer actually in use."); break; } default: @@ -179,7 +179,7 @@ namespace DiscImageChef.Decoders.SCSI.MMC sb.AppendFormat("Layer {0} is of unknown type 0x{1:X4}", i, response.FormatLayers[i]) .AppendLine(); if(response.DefaultFormatLayer == i) sb.AppendLine("This is the default layer."); - if(response.OnlineFormatLayer == i) sb.AppendLine("This is the layer actually in use."); + if(response.OnlineFormatLayer == i) sb.AppendLine("This is the layer actually in use."); break; } } diff --git a/SCSI/MMC/WriteProtect.cs b/SCSI/MMC/WriteProtect.cs index 1ad0fedb8..ad3307389 100644 --- a/SCSI/MMC/WriteProtect.cs +++ b/SCSI/MMC/WriteProtect.cs @@ -125,16 +125,16 @@ namespace DiscImageChef.Decoders.SCSI.MMC BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; decoded.DataLength = BigEndianBitConverter.ToUInt16(WPSResponse, 0); - decoded.Reserved1 = WPSResponse[2]; - decoded.Reserved2 = WPSResponse[3]; - decoded.Reserved3 = (byte)((WPSResponse[4] & 0xF0) >> 4); - decoded.MSWI = Convert.ToBoolean(WPSResponse[4] & 0x08); - decoded.CWP = Convert.ToBoolean(WPSResponse[4] & 0x04); - decoded.PWP = Convert.ToBoolean(WPSResponse[4] & 0x02); - decoded.SWPP = Convert.ToBoolean(WPSResponse[4] & 0x01); - decoded.Reserved4 = WPSResponse[5]; - decoded.Reserved5 = WPSResponse[6]; - decoded.Reserved6 = WPSResponse[7]; + decoded.Reserved1 = WPSResponse[2]; + decoded.Reserved2 = WPSResponse[3]; + decoded.Reserved3 = (byte)((WPSResponse[4] & 0xF0) >> 4); + decoded.MSWI = Convert.ToBoolean(WPSResponse[4] & 0x08); + decoded.CWP = Convert.ToBoolean(WPSResponse[4] & 0x04); + decoded.PWP = Convert.ToBoolean(WPSResponse[4] & 0x02); + decoded.SWPP = Convert.ToBoolean(WPSResponse[4] & 0x01); + decoded.Reserved4 = WPSResponse[5]; + decoded.Reserved5 = WPSResponse[6]; + decoded.Reserved6 = WPSResponse[7]; return decoded; } @@ -152,14 +152,14 @@ namespace DiscImageChef.Decoders.SCSI.MMC if(response.PWP) sb.AppendLine("Media surface sets write protection"); if(response.SWPP) sb.AppendLine("Software write protection is set until power down"); -#if DEBUG + #if DEBUG if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine(); if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine(); if(response.Reserved3 != 0) sb.AppendFormat("Reserved3 = 0x{0:X2}", response.Reserved3).AppendLine(); if(response.Reserved4 != 0) sb.AppendFormat("Reserved4 = 0x{0:X2}", response.Reserved4).AppendLine(); if(response.Reserved5 != 0) sb.AppendFormat("Reserved5 = 0x{0:X2}", response.Reserved5).AppendLine(); if(response.Reserved6 != 0) sb.AppendFormat("Reserved6 = 0x{0:X2}", response.Reserved6).AppendLine(); -#endif + #endif return sb.ToString(); } diff --git a/SCSI/Modes/00_SFF.cs b/SCSI/Modes/00_SFF.cs index d03542e64..8844dcdbf 100644 --- a/SCSI/Modes/00_SFF.cs +++ b/SCSI/Modes/00_SFF.cs @@ -103,7 +103,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; ModePage_00_SFF page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Drive Operation Mode page:"); diff --git a/SCSI/Modes/01.cs b/SCSI/Modes/01.cs index 4b84e6f4f..8cffdf546 100644 --- a/SCSI/Modes/01.cs +++ b/SCSI/Modes/01.cs @@ -127,26 +127,26 @@ namespace DiscImageChef.Decoders.SCSI ModePage_01 decoded = new ModePage_01(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.AWRE |= (pageResponse[2] & 0x80) == 0x80; decoded.ARRE |= (pageResponse[2] & 0x40) == 0x40; - decoded.TB |= (pageResponse[2] & 0x20) == 0x20; - decoded.RC |= (pageResponse[2] & 0x10) == 0x10; - decoded.EER |= (pageResponse[2] & 0x08) == 0x08; - decoded.PER |= (pageResponse[2] & 0x04) == 0x04; - decoded.DTE |= (pageResponse[2] & 0x02) == 0x02; - decoded.DCR |= (pageResponse[2] & 0x01) == 0x01; + decoded.TB |= (pageResponse[2] & 0x20) == 0x20; + decoded.RC |= (pageResponse[2] & 0x10) == 0x10; + decoded.EER |= (pageResponse[2] & 0x08) == 0x08; + decoded.PER |= (pageResponse[2] & 0x04) == 0x04; + decoded.DTE |= (pageResponse[2] & 0x02) == 0x02; + decoded.DCR |= (pageResponse[2] & 0x01) == 0x01; - decoded.ReadRetryCount = pageResponse[3]; - decoded.CorrectionSpan = pageResponse[4]; - decoded.HeadOffsetCount = (sbyte)pageResponse[5]; + decoded.ReadRetryCount = pageResponse[3]; + decoded.CorrectionSpan = pageResponse[4]; + decoded.HeadOffsetCount = (sbyte)pageResponse[5]; decoded.DataStrobeOffsetCount = (sbyte)pageResponse[6]; if(pageResponse.Length < 12) return decoded; - decoded.WriteRetryCount = pageResponse[8]; - decoded.RecoveryTimeLimit = (ushort)((pageResponse[10] << 8) + pageResponse[11]); - decoded.LBPERE |= (pageResponse[7] & 0x80) == 0x80; + decoded.WriteRetryCount = pageResponse[8]; + decoded.RecoveryTimeLimit = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.LBPERE |= (pageResponse[7] & 0x80) == 0x80; return decoded; } @@ -160,8 +160,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_01 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_01 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Read-write error recovery page:"); @@ -197,15 +197,15 @@ namespace DiscImageChef.Decoders.SCSI pg[0] = 0x01; pg[1] = 6; - if(page.PS) pg[0] += 0x80; + if(page.PS) pg[0] += 0x80; if(page.AWRE) pg[2] += 0x80; if(page.ARRE) pg[2] += 0x40; - if(page.TB) pg[2] += 0x20; - if(page.RC) pg[2] += 0x10; - if(page.EER) pg[2] += 0x08; - if(page.PER) pg[2] += 0x04; - if(page.DTE) pg[2] += 0x02; - if(page.DCR) pg[2] += 0x01; + if(page.TB) pg[2] += 0x20; + if(page.RC) pg[2] += 0x10; + if(page.EER) pg[2] += 0x08; + if(page.PER) pg[2] += 0x04; + if(page.DTE) pg[2] += 0x02; + if(page.DCR) pg[2] += 0x01; pg[3] = page.ReadRetryCount; pg[4] = page.CorrectionSpan; diff --git a/SCSI/Modes/01_MMC.cs b/SCSI/Modes/01_MMC.cs index fc750aae1..3230f2e05 100644 --- a/SCSI/Modes/01_MMC.cs +++ b/SCSI/Modes/01_MMC.cs @@ -83,13 +83,13 @@ namespace DiscImageChef.Decoders.SCSI ModePage_01_MMC decoded = new ModePage_01_MMC(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.Parameter = pageResponse[2]; - decoded.ReadRetryCount = pageResponse[3]; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.Parameter = pageResponse[2]; + decoded.ReadRetryCount = pageResponse[3]; if(pageResponse.Length < 12) return decoded; - decoded.WriteRetryCount = pageResponse[8]; + decoded.WriteRetryCount = pageResponse[8]; decoded.RecoveryTimeLimit = (ushort)((pageResponse[10] << 8) + pageResponse[11]); return decoded; @@ -105,7 +105,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; ModePage_01_MMC page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Read error recovery page for MultiMedia Devices:"); @@ -113,17 +113,18 @@ namespace DiscImageChef.Decoders.SCSI if(page.ReadRetryCount > 0) sb.AppendFormat("\tDrive will repeat read operations {0} times", page.ReadRetryCount).AppendLine(); - string AllUsed = "\tAll available recovery procedures will be used.\n"; - string CIRCRetriesUsed = "\tOnly retries and CIRC are used.\n"; - string RetriesUsed = "\tOnly retries are used.\n"; + string AllUsed = "\tAll available recovery procedures will be used.\n"; + string CIRCRetriesUsed = "\tOnly retries and CIRC are used.\n"; + string RetriesUsed = "\tOnly retries are used.\n"; string RecoveredNotReported = "\tRecovered errors will not be reported.\n"; - string RecoveredReported = "\tRecovered errors will be reported.\n"; - string RecoveredAbort = "\tRecovered errors will be reported and aborted with CHECK CONDITION.\n"; - string UnrecECCAbort = "\tUnrecovered ECC errors will return CHECK CONDITION."; - string UnrecCIRCAbort = "\tUnrecovered CIRC errors will return CHECK CONDITION."; - string UnrecECCNotAbort = "\tUnrecovered ECC errors will not abort the transfer."; - string UnrecCIRCNotAbort = "\tUnrecovered CIRC errors will not abort the transfer."; - string UnrecECCAbortData = "\tUnrecovered ECC errors will return CHECK CONDITION and the uncorrected data."; + string RecoveredReported = "\tRecovered errors will be reported.\n"; + string RecoveredAbort = "\tRecovered errors will be reported and aborted with CHECK CONDITION.\n"; + string UnrecECCAbort = "\tUnrecovered ECC errors will return CHECK CONDITION."; + string UnrecCIRCAbort = "\tUnrecovered CIRC errors will return CHECK CONDITION."; + string UnrecECCNotAbort = "\tUnrecovered ECC errors will not abort the transfer."; + string UnrecCIRCNotAbort = "\tUnrecovered CIRC errors will not abort the transfer."; + string UnrecECCAbortData = + "\tUnrecovered ECC errors will return CHECK CONDITION and the uncorrected data."; string UnrecCIRCAbortData = "\tUnrecovered CIRC errors will return CHECK CONDITION and the uncorrected data."; @@ -209,7 +210,7 @@ namespace DiscImageChef.Decoders.SCSI // This is from a newer version of SCSI unknown what happen for drives expecting an 8 byte page - pg[8] = page.WriteRetryCount; + pg[8] = page.WriteRetryCount; pg[10] = (byte)((page.RecoveryTimeLimit & 0xFF00) << 8); pg[11] = (byte)(page.RecoveryTimeLimit & 0xFF); diff --git a/SCSI/Modes/02.cs b/SCSI/Modes/02.cs index 84e2d7380..071e3e611 100644 --- a/SCSI/Modes/02.cs +++ b/SCSI/Modes/02.cs @@ -112,20 +112,20 @@ namespace DiscImageChef.Decoders.SCSI ModePage_02 decoded = new ModePage_02(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.BufferFullRatio = pageResponse[2]; - decoded.BufferEmptyRatio = pageResponse[3]; - decoded.BusInactivityLimit = (ushort)((pageResponse[4] << 8) + pageResponse[5]); - decoded.DisconnectTimeLimit = (ushort)((pageResponse[6] << 8) + pageResponse[7]); - decoded.ConnectTimeLimit = (ushort)((pageResponse[8] << 8) + pageResponse[9]); - decoded.MaxBurstSize = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.BufferFullRatio = pageResponse[2]; + decoded.BufferEmptyRatio = pageResponse[3]; + decoded.BusInactivityLimit = (ushort)((pageResponse[4] << 8) + pageResponse[5]); + decoded.DisconnectTimeLimit = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.ConnectTimeLimit = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.MaxBurstSize = (ushort)((pageResponse[10] << 8) + pageResponse[11]); if(pageResponse.Length >= 13) { - decoded.EMDP |= (pageResponse[12] & 0x80) == 0x80; - decoded.DIMM |= (pageResponse[12] & 0x08) == 0x08; - decoded.FairArbitration = (byte)((pageResponse[12] & 0x70) >> 4); - decoded.DTDC = (byte)(pageResponse[12] & 0x07); + decoded.EMDP |= (pageResponse[12] & 0x80) == 0x80; + decoded.DIMM |= (pageResponse[12] & 0x08) == 0x08; + decoded.FairArbitration = (byte)((pageResponse[12] & 0x70) >> 4); + decoded.DTDC = (byte)(pageResponse[12] & 0x07); } if(pageResponse.Length >= 16) decoded.FirstBurstSize = (ushort)((pageResponse[14] << 8) + pageResponse[15]); @@ -142,8 +142,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_02 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_02 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Disconnect-Reconnect mode page:"); @@ -162,15 +162,15 @@ namespace DiscImageChef.Decoders.SCSI page.DisconnectTimeLimit * 100).AppendLine(); if(page.ConnectTimeLimit > 0) sb - .AppendFormat("\t{0} µs allowed to use the bus before disconnecting, if granted the privilege and not restricted", - page.ConnectTimeLimit * 100).AppendLine(); + .AppendFormat("\t{0} µs allowed to use the bus before disconnecting, if granted the privilege and not restricted", + page.ConnectTimeLimit * 100).AppendLine(); if(page.MaxBurstSize > 0) sb.AppendFormat("\t{0} bytes maximum can be transferred before disconnecting", page.MaxBurstSize * 512) .AppendLine(); if(page.FirstBurstSize > 0) sb - .AppendFormat("\t{0} bytes maximum can be transferred for a command along with the disconnect command", - page.FirstBurstSize * 512).AppendLine(); + .AppendFormat("\t{0} bytes maximum can be transferred for a command along with the disconnect command", + page.FirstBurstSize * 512).AppendLine(); if(page.DIMM) sb.AppendLine("\tTarget shall not transfer data for a command during the same interconnect tenancy"); diff --git a/SCSI/Modes/03.cs b/SCSI/Modes/03.cs index f6e0549a3..2128d9701 100644 --- a/SCSI/Modes/03.cs +++ b/SCSI/Modes/03.cs @@ -119,20 +119,20 @@ namespace DiscImageChef.Decoders.SCSI ModePage_03 decoded = new ModePage_03(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.TracksPerZone = (ushort)((pageResponse[2] << 8) + pageResponse[3]); - decoded.AltSectorsPerZone = (ushort)((pageResponse[4] << 8) + pageResponse[5]); - decoded.AltTracksPerZone = (ushort)((pageResponse[6] << 8) + pageResponse[7]); - decoded.AltTracksPerLun = (ushort)((pageResponse[8] << 8) + pageResponse[9]); - decoded.SectorsPerTrack = (ushort)((pageResponse[10] << 8) + pageResponse[11]); - decoded.BytesPerSector = (ushort)((pageResponse[12] << 8) + pageResponse[13]); - decoded.Interleave = (ushort)((pageResponse[14] << 8) + pageResponse[15]); - decoded.TrackSkew = (ushort)((pageResponse[16] << 8) + pageResponse[17]); - decoded.CylinderSkew = (ushort)((pageResponse[18] << 8) + pageResponse[19]); - decoded.SSEC |= (pageResponse[20] & 0x80) == 0x80; - decoded.HSEC |= (pageResponse[20] & 0x40) == 0x40; - decoded.RMB |= (pageResponse[20] & 0x20) == 0x20; - decoded.SURF |= (pageResponse[20] & 0x10) == 0x10; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.TracksPerZone = (ushort)((pageResponse[2] << 8) + pageResponse[3]); + decoded.AltSectorsPerZone = (ushort)((pageResponse[4] << 8) + pageResponse[5]); + decoded.AltTracksPerZone = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.AltTracksPerLun = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.SectorsPerTrack = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.BytesPerSector = (ushort)((pageResponse[12] << 8) + pageResponse[13]); + decoded.Interleave = (ushort)((pageResponse[14] << 8) + pageResponse[15]); + decoded.TrackSkew = (ushort)((pageResponse[16] << 8) + pageResponse[17]); + decoded.CylinderSkew = (ushort)((pageResponse[18] << 8) + pageResponse[19]); + decoded.SSEC |= (pageResponse[20] & 0x80) == 0x80; + decoded.HSEC |= (pageResponse[20] & 0x40) == 0x40; + decoded.RMB |= (pageResponse[20] & 0x20) == 0x20; + decoded.SURF |= (pageResponse[20] & 0x10) == 0x10; return decoded; } @@ -146,16 +146,16 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_03 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_03 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Format device page:"); if(page.PS) sb.AppendLine("\tParameters can be saved"); sb - .AppendFormat("\t{0} tracks per zone to use in dividing the capacity for the purpose of allocating alternate sectors", - page.TracksPerZone).AppendLine(); + .AppendFormat("\t{0} tracks per zone to use in dividing the capacity for the purpose of allocating alternate sectors", + page.TracksPerZone).AppendLine(); sb.AppendFormat("\t{0} sectors per zone that shall be reserved for defect handling", page.AltSectorsPerZone) .AppendLine(); sb.AppendFormat("\t{0} tracks per zone that shall be reserved for defect handling", page.AltTracksPerZone) diff --git a/SCSI/Modes/04.cs b/SCSI/Modes/04.cs index 60bec2dbc..8834ed481 100644 --- a/SCSI/Modes/04.cs +++ b/SCSI/Modes/04.cs @@ -102,14 +102,16 @@ namespace DiscImageChef.Decoders.SCSI ModePage_04 decoded = new ModePage_04(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.Cylinders = (uint)((pageResponse[2] << 16) + (pageResponse[3] << 8) + pageResponse[4]); - decoded.Heads = pageResponse[5]; - decoded.WritePrecompCylinder = (uint)((pageResponse[6] << 16) + (pageResponse[7] << 8) + pageResponse[8]); - decoded.WriteReduceCylinder = (uint)((pageResponse[9] << 16) + (pageResponse[10] << 8) + pageResponse[11]); - decoded.DriveStepRate = (ushort)((pageResponse[12] << 8) + pageResponse[13]); - decoded.LandingCylinder = (pageResponse[14] << 16) + (pageResponse[15] << 8) + pageResponse[16]; - decoded.RPL = (byte)(pageResponse[17] & 0x03); + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.Cylinders = (uint)((pageResponse[2] << 16) + (pageResponse[3] << 8) + pageResponse[4]); + decoded.Heads = pageResponse[5]; + decoded.WritePrecompCylinder = (uint)((pageResponse[6] << 16) + (pageResponse[7] << 8) + pageResponse[8]); + decoded.WriteReduceCylinder = + (uint)((pageResponse[9] << 16) + (pageResponse[10] << 8) + pageResponse[11]); + decoded.DriveStepRate = + (ushort)((pageResponse[12] << 8) + pageResponse[13]); + decoded.LandingCylinder = (pageResponse[14] << 16) + (pageResponse[15] << 8) + pageResponse[16]; + decoded.RPL = (byte)(pageResponse[17] & 0x03); decoded.RotationalOffset = pageResponse[18]; if(pageResponse.Length >= 22) @@ -127,8 +129,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_04 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_04 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Rigid disk drive geometry page:"); diff --git a/SCSI/Modes/05.cs b/SCSI/Modes/05.cs index 3e7badb81..d4207a637 100644 --- a/SCSI/Modes/05.cs +++ b/SCSI/Modes/05.cs @@ -167,31 +167,31 @@ namespace DiscImageChef.Decoders.SCSI ModePage_05 decoded = new ModePage_05(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.TransferRate = (ushort)((pageResponse[2] << 8) + pageResponse[3]); - decoded.Heads = pageResponse[4]; - decoded.SectorsPerTrack = pageResponse[5]; - decoded.BytesPerSector = (ushort)((pageResponse[6] << 8) + pageResponse[7]); - decoded.Cylinders = (ushort)((pageResponse[8] << 8) + pageResponse[9]); - decoded.WritePrecompCylinder = (ushort)((pageResponse[10] << 8) + pageResponse[11]); - decoded.WriteReduceCylinder = (ushort)((pageResponse[12] << 8) + pageResponse[13]); - decoded.DriveStepRate = (ushort)((pageResponse[14] << 8) + pageResponse[15]); - decoded.DriveStepPulse = pageResponse[16]; - decoded.HeadSettleDelay = (ushort)((pageResponse[17] << 8) + pageResponse[18]); - decoded.MotorOnDelay = pageResponse[19]; - decoded.MotorOffDelay = pageResponse[20]; - decoded.TRDY |= (pageResponse[21] & 0x80) == 0x80; - decoded.SSN |= (pageResponse[21] & 0x40) == 0x40; - decoded.MO |= (pageResponse[21] & 0x20) == 0x20; - decoded.SPC = (byte)(pageResponse[22] & 0x0F); - decoded.WriteCompensation = pageResponse[23]; - decoded.HeadLoadDelay = pageResponse[24]; - decoded.HeadUnloadDelay = pageResponse[25]; - decoded.Pin34 = (byte)((pageResponse[26] & 0xF0) >> 4); - decoded.Pin2 = (byte)(pageResponse[26] & 0x0F); - decoded.Pin4 = (byte)((pageResponse[27] & 0xF0) >> 4); - decoded.Pin1 = (byte)(pageResponse[27] & 0x0F); - decoded.MediumRotationRate = (ushort)((pageResponse[28] << 8) + pageResponse[29]); + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.TransferRate = (ushort)((pageResponse[2] << 8) + pageResponse[3]); + decoded.Heads = pageResponse[4]; + decoded.SectorsPerTrack = pageResponse[5]; + decoded.BytesPerSector = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.Cylinders = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.WritePrecompCylinder = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.WriteReduceCylinder = (ushort)((pageResponse[12] << 8) + pageResponse[13]); + decoded.DriveStepRate = (ushort)((pageResponse[14] << 8) + pageResponse[15]); + decoded.DriveStepPulse = pageResponse[16]; + decoded.HeadSettleDelay = (ushort)((pageResponse[17] << 8) + pageResponse[18]); + decoded.MotorOnDelay = pageResponse[19]; + decoded.MotorOffDelay = pageResponse[20]; + decoded.TRDY |= (pageResponse[21] & 0x80) == 0x80; + decoded.SSN |= (pageResponse[21] & 0x40) == 0x40; + decoded.MO |= (pageResponse[21] & 0x20) == 0x20; + decoded.SPC = (byte)(pageResponse[22] & 0x0F); + decoded.WriteCompensation = pageResponse[23]; + decoded.HeadLoadDelay = pageResponse[24]; + decoded.HeadUnloadDelay = pageResponse[25]; + decoded.Pin34 = (byte)((pageResponse[26] & 0xF0) >> 4); + decoded.Pin2 = (byte)(pageResponse[26] & 0x0F); + decoded.Pin4 = (byte)((pageResponse[27] & 0xF0) >> 4); + decoded.Pin1 = (byte)(pageResponse[27] & 0x0F); + decoded.MediumRotationRate = (ushort)((pageResponse[28] << 8) + pageResponse[29]); return decoded; } @@ -205,8 +205,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_05 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_05 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Flexible disk page:"); @@ -232,17 +232,17 @@ namespace DiscImageChef.Decoders.SCSI if(!page.TRDY) sb - .AppendFormat("\tTarget shall wait {0} seconds before attempting to access the medium after motor on is asserted", - (double)page.MotorOnDelay * 10).AppendLine(); + .AppendFormat("\tTarget shall wait {0} seconds before attempting to access the medium after motor on is asserted", + (double)page.MotorOnDelay * 10).AppendLine(); else sb - .AppendFormat("\tTarget shall wait {0} seconds after drive is ready before aborting medium access attemps", - (double)page.MotorOnDelay * 10).AppendLine(); + .AppendFormat("\tTarget shall wait {0} seconds after drive is ready before aborting medium access attemps", + (double)page.MotorOnDelay * 10).AppendLine(); if(page.MotorOffDelay != 0xFF) sb - .AppendFormat("\tTarget shall wait {0} seconds before releasing the motor on signal after becoming idle", - (double)page.MotorOffDelay * 10).AppendLine(); + .AppendFormat("\tTarget shall wait {0} seconds before releasing the motor on signal after becoming idle", + (double)page.MotorOffDelay * 10).AppendLine(); else sb.AppendLine("\tTarget shall never release the motor on signal"); if(page.TRDY) sb.AppendLine("\tThere is a drive ready signal"); diff --git a/SCSI/Modes/06.cs b/SCSI/Modes/06.cs index 2de55c080..12f642441 100644 --- a/SCSI/Modes/06.cs +++ b/SCSI/Modes/06.cs @@ -70,7 +70,7 @@ namespace DiscImageChef.Decoders.SCSI ModePage_06 decoded = new ModePage_06(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.RUBR |= (pageResponse[2] & 0x01) == 0x01; return decoded; @@ -85,8 +85,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_06 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_06 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI optical memory:"); diff --git a/SCSI/Modes/07.cs b/SCSI/Modes/07.cs index 7ca4d38f7..b61426d12 100644 --- a/SCSI/Modes/07.cs +++ b/SCSI/Modes/07.cs @@ -95,14 +95,14 @@ namespace DiscImageChef.Decoders.SCSI ModePage_07 decoded = new ModePage_07(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.EER |= (pageResponse[2] & 0x08) == 0x08; decoded.PER |= (pageResponse[2] & 0x04) == 0x04; decoded.DTE |= (pageResponse[2] & 0x02) == 0x02; decoded.DCR |= (pageResponse[2] & 0x01) == 0x01; - decoded.VerifyRetryCount = pageResponse[3]; - decoded.CorrectionSpan = pageResponse[4]; + decoded.VerifyRetryCount = pageResponse[3]; + decoded.CorrectionSpan = pageResponse[4]; decoded.RecoveryTimeLimit = (ushort)((pageResponse[10] << 8) + pageResponse[11]); return decoded; @@ -117,8 +117,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_07 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_07 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Verify error recovery page:"); diff --git a/SCSI/Modes/07_MMC.cs b/SCSI/Modes/07_MMC.cs index 8a3e802b8..0f3c6e46d 100644 --- a/SCSI/Modes/07_MMC.cs +++ b/SCSI/Modes/07_MMC.cs @@ -74,9 +74,9 @@ namespace DiscImageChef.Decoders.SCSI ModePage_07_MMC decoded = new ModePage_07_MMC(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.Parameter = pageResponse[2]; - decoded.VerifyRetryCount = pageResponse[3]; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.Parameter = pageResponse[2]; + decoded.VerifyRetryCount = pageResponse[3]; return decoded; } @@ -91,7 +91,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; ModePage_07_MMC page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Verify error recovery page for MultiMedia Devices:"); @@ -99,17 +99,18 @@ namespace DiscImageChef.Decoders.SCSI if(page.VerifyRetryCount > 0) sb.AppendFormat("\tDrive will repeat verify operations {0} times", page.VerifyRetryCount).AppendLine(); - string AllUsed = "\tAll available recovery procedures will be used.\n"; - string CIRCRetriesUsed = "\tOnly retries and CIRC are used.\n"; - string RetriesUsed = "\tOnly retries are used.\n"; + string AllUsed = "\tAll available recovery procedures will be used.\n"; + string CIRCRetriesUsed = "\tOnly retries and CIRC are used.\n"; + string RetriesUsed = "\tOnly retries are used.\n"; string RecoveredNotReported = "\tRecovered errors will not be reported.\n"; - string RecoveredReported = "\tRecovered errors will be reported.\n"; - string RecoveredAbort = "\tRecovered errors will be reported and aborted with CHECK CONDITION.\n"; - string UnrecECCAbort = "\tUnrecovered ECC errors will return CHECK CONDITION."; - string UnrecCIRCAbort = "\tUnrecovered CIRC errors will return CHECK CONDITION."; - string UnrecECCNotAbort = "\tUnrecovered ECC errors will not abort the transfer."; - string UnrecCIRCNotAbort = "\tUnrecovered CIRC errors will not abort the transfer."; - string UnrecECCAbortData = "\tUnrecovered ECC errors will return CHECK CONDITION and the uncorrected data."; + string RecoveredReported = "\tRecovered errors will be reported.\n"; + string RecoveredAbort = "\tRecovered errors will be reported and aborted with CHECK CONDITION.\n"; + string UnrecECCAbort = "\tUnrecovered ECC errors will return CHECK CONDITION."; + string UnrecCIRCAbort = "\tUnrecovered CIRC errors will return CHECK CONDITION."; + string UnrecECCNotAbort = "\tUnrecovered ECC errors will not abort the transfer."; + string UnrecCIRCNotAbort = "\tUnrecovered CIRC errors will not abort the transfer."; + string UnrecECCAbortData = + "\tUnrecovered ECC errors will return CHECK CONDITION and the uncorrected data."; string UnrecCIRCAbortData = "\tUnrecovered CIRC errors will return CHECK CONDITION and the uncorrected data."; diff --git a/SCSI/Modes/08.cs b/SCSI/Modes/08.cs index 84d5afca7..55ef31d99 100644 --- a/SCSI/Modes/08.cs +++ b/SCSI/Modes/08.cs @@ -150,32 +150,32 @@ namespace DiscImageChef.Decoders.SCSI ModePage_08 decoded = new ModePage_08(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.WCE |= (pageResponse[2] & 0x04) == 0x04; - decoded.MF |= (pageResponse[2] & 0x02) == 0x02; + decoded.MF |= (pageResponse[2] & 0x02) == 0x02; decoded.RCD |= (pageResponse[2] & 0x01) == 0x01; decoded.DemandReadRetentionPrio = (byte)((pageResponse[3] & 0xF0) >> 4); - decoded.WriteRetentionPriority = (byte)(pageResponse[3] & 0x0F); - decoded.DisablePreFetch = (ushort)((pageResponse[4] << 8) + pageResponse[5]); - decoded.MinimumPreFetch = (ushort)((pageResponse[6] << 8) + pageResponse[7]); - decoded.MaximumPreFetch = (ushort)((pageResponse[8] << 8) + pageResponse[9]); - decoded.MaximumPreFetchCeiling = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.WriteRetentionPriority = (byte)(pageResponse[3] & 0x0F); + decoded.DisablePreFetch = (ushort)((pageResponse[4] << 8) + pageResponse[5]); + decoded.MinimumPreFetch = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.MaximumPreFetch = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.MaximumPreFetchCeiling = (ushort)((pageResponse[10] << 8) + pageResponse[11]); if(pageResponse.Length < 20) return decoded; - decoded.IC |= (pageResponse[2] & 0x80) == 0x80; + decoded.IC |= (pageResponse[2] & 0x80) == 0x80; decoded.ABPF |= (pageResponse[2] & 0x40) == 0x40; - decoded.CAP |= (pageResponse[2] & 0x20) == 0x20; + decoded.CAP |= (pageResponse[2] & 0x20) == 0x20; decoded.Disc |= (pageResponse[2] & 0x10) == 0x10; decoded.Size |= (pageResponse[2] & 0x08) == 0x08; - decoded.FSW |= (pageResponse[12] & 0x80) == 0x80; + decoded.FSW |= (pageResponse[12] & 0x80) == 0x80; decoded.LBCSS |= (pageResponse[12] & 0x40) == 0x40; - decoded.DRA |= (pageResponse[12] & 0x20) == 0x20; + decoded.DRA |= (pageResponse[12] & 0x20) == 0x20; - decoded.CacheSegments = pageResponse[13]; - decoded.CacheSegmentSize = (ushort)((pageResponse[14] << 8) + pageResponse[15]); + decoded.CacheSegments = pageResponse[13]; + decoded.CacheSegmentSize = (ushort)((pageResponse[14] << 8) + pageResponse[15]); decoded.NonCacheSegmentSize = (uint)((pageResponse[17] << 16) + (pageResponse[18] << 8) + pageResponse[19]); decoded.NV_DIS |= (pageResponse[12] & 0x01) == 0x01; @@ -192,8 +192,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_08 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_08 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Caching mode page:"); @@ -254,8 +254,8 @@ namespace DiscImageChef.Decoders.SCSI .AppendLine(); if(page.MaximumPreFetchCeiling > 0) sb - .AppendFormat("\tA maximum of {0} blocks will be pre-fetched even if it is commanded to pre-fetch more", - page.MaximumPreFetchCeiling).AppendLine(); + .AppendFormat("\tA maximum of {0} blocks will be pre-fetched even if it is commanded to pre-fetch more", + page.MaximumPreFetchCeiling).AppendLine(); if(page.IC) sb.AppendLine("\tDevice should use number of cache segments or cache segment size for caching"); @@ -286,8 +286,8 @@ namespace DiscImageChef.Decoders.SCSI if(page.NonCacheSegmentSize > 0) sb - .AppendFormat("\tDrive shall allocate {0} bytes to buffer even when all cached data cannot be evicted", - page.NonCacheSegmentSize).AppendLine(); + .AppendFormat("\tDrive shall allocate {0} bytes to buffer even when all cached data cannot be evicted", + page.NonCacheSegmentSize).AppendLine(); if(page.NV_DIS) sb.AppendLine("\tNon-Volatile cache is disabled"); diff --git a/SCSI/Modes/0A.cs b/SCSI/Modes/0A.cs index 1c3064f3f..3040b4d09 100644 --- a/SCSI/Modes/0A.cs +++ b/SCSI/Modes/0A.cs @@ -177,17 +177,17 @@ namespace DiscImageChef.Decoders.SCSI ModePage_0A decoded = new ModePage_0A(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.RLEC |= (pageResponse[2] & 0x01) == 0x01; decoded.QueueAlgorithm = (byte)((pageResponse[3] & 0xF0) >> 4); - decoded.QErr = (byte)((pageResponse[3] & 0x06) >> 1); + decoded.QErr = (byte)((pageResponse[3] & 0x06) >> 1); - decoded.DQue |= (pageResponse[3] & 0x01) == 0x01; - decoded.EECA |= (pageResponse[4] & 0x80) == 0x80; - decoded.RAENP |= (pageResponse[4] & 0x04) == 0x04; + decoded.DQue |= (pageResponse[3] & 0x01) == 0x01; + decoded.EECA |= (pageResponse[4] & 0x80) == 0x80; + decoded.RAENP |= (pageResponse[4] & 0x04) == 0x04; decoded.UAAENP |= (pageResponse[4] & 0x02) == 0x02; - decoded.EAENP |= (pageResponse[4] & 0x01) == 0x01; + decoded.EAENP |= (pageResponse[4] & 0x01) == 0x01; decoded.ReadyAENHoldOffPeriod = (ushort)((pageResponse[6] << 8) + pageResponse[7]); @@ -195,30 +195,30 @@ namespace DiscImageChef.Decoders.SCSI // SPC-1 decoded.GLTSD |= (pageResponse[2] & 0x02) == 0x02; - decoded.RAC |= (pageResponse[4] & 0x40) == 0x40; - decoded.SWP |= (pageResponse[4] & 0x08) == 0x08; + decoded.RAC |= (pageResponse[4] & 0x40) == 0x40; + decoded.SWP |= (pageResponse[4] & 0x08) == 0x08; decoded.BusyTimeoutPeriod = (ushort)((pageResponse[8] << 8) + pageResponse[9]); // SPC-2 - decoded.TST = (byte)((pageResponse[2] & 0xE0) >> 5); - decoded.TAS |= (pageResponse[4] & 0x80) == 0x80; - decoded.AutoloadMode = (byte)(pageResponse[5] & 0x07); - decoded.BusyTimeoutPeriod = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.TST = (byte)((pageResponse[2] & 0xE0) >> 5); + decoded.TAS |= (pageResponse[4] & 0x80) == 0x80; + decoded.AutoloadMode = (byte)(pageResponse[5] & 0x07); + decoded.BusyTimeoutPeriod = (ushort)((pageResponse[10] << 8) + pageResponse[11]); // SPC-3 - decoded.TMF_ONLY |= (pageResponse[2] & 0x10) == 0x10; - decoded.D_SENSE |= (pageResponse[2] & 0x04) == 0x04; - decoded.UA_INTLCK_CTRL = (byte)((pageResponse[4] & 0x30) >> 4); - decoded.TAS |= (pageResponse[5] & 0x40) == 0x40; - decoded.ATO |= (pageResponse[5] & 0x80) == 0x80; + decoded.TMF_ONLY |= (pageResponse[2] & 0x10) == 0x10; + decoded.D_SENSE |= (pageResponse[2] & 0x04) == 0x04; + decoded.UA_INTLCK_CTRL = (byte)((pageResponse[4] & 0x30) >> 4); + decoded.TAS |= (pageResponse[5] & 0x40) == 0x40; + decoded.ATO |= (pageResponse[5] & 0x80) == 0x80; // SPC-5 decoded.DPICZ |= (pageResponse[2] & 0x08) == 0x08; - decoded.NUAR |= (pageResponse[3] & 0x08) == 0x08; + decoded.NUAR |= (pageResponse[3] & 0x08) == 0x08; decoded.ATMPE |= (pageResponse[5] & 0x20) == 0x20; - decoded.RWWP |= (pageResponse[5] & 0x10) == 0x10; - decoded.SBLP |= (pageResponse[5] & 0x08) == 0x08; + decoded.RWWP |= (pageResponse[5] & 0x10) == 0x10; + decoded.SBLP |= (pageResponse[5] & 0x08) == 0x08; return decoded; } @@ -232,8 +232,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_0A page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_0A page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Control mode page:"); @@ -412,8 +412,8 @@ namespace DiscImageChef.Decoders.SCSI decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.IALUAE |= (pageResponse[4] & 0x01) == 0x01; - decoded.SCSIP |= (pageResponse[4] & 0x02) == 0x02; - decoded.TCMOS |= (pageResponse[4] & 0x04) == 0x04; + decoded.SCSIP |= (pageResponse[4] & 0x02) == 0x02; + decoded.TCMOS |= (pageResponse[4] & 0x04) == 0x04; decoded.InitialPriority = (byte)(pageResponse[5] & 0x0F); @@ -430,7 +430,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; ModePage_0A_S01 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Control extension page:"); diff --git a/SCSI/Modes/0B.cs b/SCSI/Modes/0B.cs index 0673c674b..b5b753ba8 100644 --- a/SCSI/Modes/0B.cs +++ b/SCSI/Modes/0B.cs @@ -70,11 +70,11 @@ namespace DiscImageChef.Decoders.SCSI ModePage_0B decoded = new ModePage_0B(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.MediumType1 = (MediumTypes)pageResponse[4]; - decoded.MediumType2 = (MediumTypes)pageResponse[5]; - decoded.MediumType3 = (MediumTypes)pageResponse[6]; - decoded.MediumType4 = (MediumTypes)pageResponse[7]; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.MediumType1 = (MediumTypes)pageResponse[4]; + decoded.MediumType2 = (MediumTypes)pageResponse[5]; + decoded.MediumType3 = (MediumTypes)pageResponse[6]; + decoded.MediumType4 = (MediumTypes)pageResponse[7]; return decoded; } @@ -88,8 +88,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_0B page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_0B page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Medium types supported page:"); diff --git a/SCSI/Modes/0D.cs b/SCSI/Modes/0D.cs index 9a52eadf4..edae3552e 100644 --- a/SCSI/Modes/0D.cs +++ b/SCSI/Modes/0D.cs @@ -78,10 +78,10 @@ namespace DiscImageChef.Decoders.SCSI ModePage_0D decoded = new ModePage_0D(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.InactivityTimerMultiplier = (byte)(pageResponse[3] & 0xF); - decoded.SecondsPerMinute = (ushort)((pageResponse[4] << 8) + pageResponse[5]); - decoded.FramesPerSecond = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.InactivityTimerMultiplier = (byte)(pageResponse[3] & 0xF); + decoded.SecondsPerMinute = (ushort)((pageResponse[4] << 8) + pageResponse[5]); + decoded.FramesPerSecond = (ushort)((pageResponse[6] << 8) + pageResponse[7]); return decoded; } @@ -95,8 +95,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_0D page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_0D page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI CD-ROM parameters page:"); diff --git a/SCSI/Modes/0E.cs b/SCSI/Modes/0E.cs index 404a5712c..2c27c014a 100644 --- a/SCSI/Modes/0E.cs +++ b/SCSI/Modes/0E.cs @@ -118,20 +118,20 @@ namespace DiscImageChef.Decoders.SCSI ModePage_0E decoded = new ModePage_0E(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.Immed |= (pageResponse[2] & 0x04) == 0x04; - decoded.SOTC |= (pageResponse[2] & 0x02) == 0x02; - decoded.APRVal |= (pageResponse[5] & 0x80) == 0x80; - decoded.LBAFormat = (byte)(pageResponse[5] & 0x0F); - decoded.BlocksPerSecondOfAudio = (ushort)((pageResponse[6] << 8) + pageResponse[7]); - decoded.OutputPort0ChannelSelection = (byte)(pageResponse[8] & 0x0F); - decoded.OutputPort0Volume = pageResponse[9]; - decoded.OutputPort1ChannelSelection = (byte)(pageResponse[10] & 0x0F); - decoded.OutputPort1Volume = pageResponse[11]; - decoded.OutputPort2ChannelSelection = (byte)(pageResponse[12] & 0x0F); - decoded.OutputPort2Volume = pageResponse[13]; - decoded.OutputPort3ChannelSelection = (byte)(pageResponse[14] & 0x0F); - decoded.OutputPort3Volume = pageResponse[15]; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.Immed |= (pageResponse[2] & 0x04) == 0x04; + decoded.SOTC |= (pageResponse[2] & 0x02) == 0x02; + decoded.APRVal |= (pageResponse[5] & 0x80) == 0x80; + decoded.LBAFormat = (byte)(pageResponse[5] & 0x0F); + decoded.BlocksPerSecondOfAudio = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.OutputPort0ChannelSelection = (byte)(pageResponse[8] & 0x0F); + decoded.OutputPort0Volume = pageResponse[9]; + decoded.OutputPort1ChannelSelection = (byte)(pageResponse[10] & 0x0F); + decoded.OutputPort1Volume = pageResponse[11]; + decoded.OutputPort2ChannelSelection = (byte)(pageResponse[12] & 0x0F); + decoded.OutputPort2Volume = pageResponse[13]; + decoded.OutputPort3ChannelSelection = (byte)(pageResponse[14] & 0x0F); + decoded.OutputPort3Volume = pageResponse[15]; return decoded; } @@ -145,8 +145,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_0E page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_0E page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI CD-ROM audio control parameters page:"); @@ -160,7 +160,7 @@ namespace DiscImageChef.Decoders.SCSI { double blocks; if(page.LBAFormat == 8) blocks = page.BlocksPerSecondOfAudio * (1 / 256); - else blocks = page.BlocksPerSecondOfAudio; + else blocks = page.BlocksPerSecondOfAudio; sb.AppendFormat("\tThere are {0} blocks per each second of audio", blocks).AppendLine(); } diff --git a/SCSI/Modes/0F.cs b/SCSI/Modes/0F.cs index b46f4caa5..52ac20b5a 100644 --- a/SCSI/Modes/0F.cs +++ b/SCSI/Modes/0F.cs @@ -95,12 +95,12 @@ namespace DiscImageChef.Decoders.SCSI decoded.DCE |= (pageResponse[2] & 0x80) == 0x80; decoded.DCC |= (pageResponse[2] & 0x40) == 0x40; decoded.DDE |= (pageResponse[3] & 0x80) == 0x80; - decoded.RED = (byte)((pageResponse[3] & 0x60) >> 5); + decoded.RED = (byte)((pageResponse[3] & 0x60) >> 5); decoded.CompressionAlgo = (uint)((pageResponse[4] << 24) + (pageResponse[5] << 16) + - (pageResponse[6] << 8) + pageResponse[7]); - decoded.DecompressionAlgo = (uint)((pageResponse[8] << 24) + (pageResponse[9] << 16) + - (pageResponse[10] << 8) + pageResponse[11]); + (pageResponse[6] << 8) + pageResponse[7]); + decoded.DecompressionAlgo = (uint)((pageResponse[8] << 24) + (pageResponse[9] << 16) + + (pageResponse[10] << 8) + pageResponse[11]); return decoded; } @@ -114,8 +114,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_0F page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_0F page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Data compression page:"); diff --git a/SCSI/Modes/10.cs b/SCSI/Modes/10.cs index d0821049f..812a943ed 100644 --- a/SCSI/Modes/10.cs +++ b/SCSI/Modes/10.cs @@ -92,9 +92,9 @@ namespace DiscImageChef.Decoders.SCSI decoded.MaxXorWrite = (uint)((pageResponse[4] << 24) + (pageResponse[5] << 16) + (pageResponse[6] << 8) + pageResponse[7]); decoded.MaxRegenSize = (uint)((pageResponse[12] << 24) + (pageResponse[13] << 16) + - (pageResponse[14] << 8) + pageResponse[15]); + (pageResponse[14] << 8) + pageResponse[15]); decoded.MaxRebuildRead = (uint)((pageResponse[16] << 24) + (pageResponse[17] << 16) + - (pageResponse[18] << 8) + pageResponse[19]); + (pageResponse[18] << 8) + pageResponse[19]); decoded.RebuildDelay = (ushort)((pageResponse[22] << 8) + pageResponse[23]); return decoded; @@ -109,8 +109,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_10 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_10 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI XOR control mode page:"); diff --git a/SCSI/Modes/10_SSC.cs b/SCSI/Modes/10_SSC.cs index 4b1f1328e..4403711b0 100644 --- a/SCSI/Modes/10_SSC.cs +++ b/SCSI/Modes/10_SSC.cs @@ -176,39 +176,39 @@ namespace DiscImageChef.Decoders.SCSI ModePage_10_SSC decoded = new ModePage_10_SSC(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.CAP |= (pageResponse[2] & 0x40) == 0x40; - decoded.CAF |= (pageResponse[2] & 0x20) == 0x20; - decoded.ActiveFormat = (byte)(pageResponse[2] & 0x1F); - decoded.ActivePartition = pageResponse[3]; - decoded.WriteBufferFullRatio = pageResponse[4]; - decoded.ReadBufferEmptyRatio = pageResponse[5]; - decoded.WriteDelayTime = (ushort)((pageResponse[6] << 8) + pageResponse[7]); - decoded.DBR |= (pageResponse[8] & 0x80) == 0x80; - decoded.BIS |= (pageResponse[8] & 0x40) == 0x40; - decoded.RSmk |= (pageResponse[8] & 0x20) == 0x20; - decoded.AVC |= (pageResponse[8] & 0x10) == 0x10; - decoded.RBO |= (pageResponse[8] & 0x02) == 0x02; - decoded.REW |= (pageResponse[8] & 0x01) == 0x01; - decoded.EEG |= (pageResponse[10] & 0x10) == 0x10; - decoded.SEW |= (pageResponse[10] & 0x08) == 0x08; - decoded.SOCF = (byte)((pageResponse[8] & 0x0C) >> 2); + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.CAP |= (pageResponse[2] & 0x40) == 0x40; + decoded.CAF |= (pageResponse[2] & 0x20) == 0x20; + decoded.ActiveFormat = (byte)(pageResponse[2] & 0x1F); + decoded.ActivePartition = pageResponse[3]; + decoded.WriteBufferFullRatio = pageResponse[4]; + decoded.ReadBufferEmptyRatio = pageResponse[5]; + decoded.WriteDelayTime = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.DBR |= (pageResponse[8] & 0x80) == 0x80; + decoded.BIS |= (pageResponse[8] & 0x40) == 0x40; + decoded.RSmk |= (pageResponse[8] & 0x20) == 0x20; + decoded.AVC |= (pageResponse[8] & 0x10) == 0x10; + decoded.RBO |= (pageResponse[8] & 0x02) == 0x02; + decoded.REW |= (pageResponse[8] & 0x01) == 0x01; + decoded.EEG |= (pageResponse[10] & 0x10) == 0x10; + decoded.SEW |= (pageResponse[10] & 0x08) == 0x08; + decoded.SOCF = (byte)((pageResponse[8] & 0x0C) >> 2); decoded.BufferSizeEarlyWarning = (uint)((pageResponse[11] << 16) + (pageResponse[12] << 8) + pageResponse[13]); decoded.SelectedCompression = pageResponse[14]; - decoded.SWP |= (pageResponse[10] & 0x04) == 0x04; + decoded.SWP |= (pageResponse[10] & 0x04) == 0x04; decoded.ASOCWP |= (pageResponse[15] & 0x04) == 0x04; decoded.PERSWP |= (pageResponse[15] & 0x02) == 0x02; - decoded.PRMWP |= (pageResponse[15] & 0x01) == 0x01; + decoded.PRMWP |= (pageResponse[15] & 0x01) == 0x01; decoded.BAML |= (pageResponse[10] & 0x02) == 0x02; - decoded.BAM |= (pageResponse[10] & 0x01) == 0x01; + decoded.BAM |= (pageResponse[10] & 0x01) == 0x01; decoded.RewindOnReset = (byte)((pageResponse[15] & 0x18) >> 3); - decoded.OIR |= (pageResponse[15] & 0x20) == 0x20; - decoded.WTRE = (byte)((pageResponse[15] & 0xC0) >> 6); + decoded.OIR |= (pageResponse[15] & 0x20) == 0x20; + decoded.WTRE = (byte)((pageResponse[15] & 0xC0) >> 6); return decoded; } @@ -223,7 +223,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; ModePage_10_SSC page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Device configuration page:"); @@ -236,8 +236,8 @@ namespace DiscImageChef.Decoders.SCSI sb.AppendFormat("\tRead buffer shall have an empty ratio of {0} before more data is read from medium", page.ReadBufferEmptyRatio).AppendLine(); sb - .AppendFormat("\tDrive will delay {0} ms before buffered data is forcefully written to the medium even before buffer is full", - page.WriteDelayTime * 100).AppendLine(); + .AppendFormat("\tDrive will delay {0} ms before buffered data is forcefully written to the medium even before buffer is full", + page.WriteDelayTime * 100).AppendLine(); if(page.DBR) { sb.AppendLine("\tDrive supports recovering data from buffer"); @@ -245,6 +245,7 @@ namespace DiscImageChef.Decoders.SCSI ? "\tRecovered buffer data comes in LIFO order" : "\tRecovered buffer data comes in FIFO order"); } + if(page.BIS) sb.AppendLine("\tMedium supports block IDs"); if(page.RSmk) sb.AppendLine("\tDrive reports setmarks"); switch(page.SOCF) diff --git a/SCSI/Modes/11.cs b/SCSI/Modes/11.cs index bec32a979..46630e133 100644 --- a/SCSI/Modes/11.cs +++ b/SCSI/Modes/11.cs @@ -144,22 +144,22 @@ namespace DiscImageChef.Decoders.SCSI decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.MaxAdditionalPartitions = pageResponse[2]; - decoded.AdditionalPartitionsDefined = pageResponse[3]; - decoded.FDP |= (pageResponse[4] & 0x80) == 0x80; - decoded.SDP |= (pageResponse[4] & 0x40) == 0x40; - decoded.IDP |= (pageResponse[4] & 0x20) == 0x20; - decoded.PSUM = (PartitionSizeUnitOfMeasures)((pageResponse[4] & 0x18) >> 3); - decoded.POFM |= (pageResponse[4] & 0x04) == 0x04; - decoded.CLEAR |= (pageResponse[4] & 0x02) == 0x02; - decoded.ADDP |= (pageResponse[4] & 0x01) == 0x01; - decoded.PartitionUnits = (byte)(pageResponse[6] & 0x0F); - decoded.MediumFormatRecognition = (MediumFormatRecognitionValues)pageResponse[5]; - decoded.PartitionSizes = new ushort[(pageResponse.Length - 8) / 2]; + decoded.MaxAdditionalPartitions = pageResponse[2]; + decoded.AdditionalPartitionsDefined = pageResponse[3]; + decoded.FDP |= (pageResponse[4] & 0x80) == 0x80; + decoded.SDP |= (pageResponse[4] & 0x40) == 0x40; + decoded.IDP |= (pageResponse[4] & 0x20) == 0x20; + decoded.PSUM = (PartitionSizeUnitOfMeasures)((pageResponse[4] & 0x18) >> 3); + decoded.POFM |= (pageResponse[4] & 0x04) == 0x04; + decoded.CLEAR |= (pageResponse[4] & 0x02) == 0x02; + decoded.ADDP |= (pageResponse[4] & 0x01) == 0x01; + decoded.PartitionUnits = (byte)(pageResponse[6] & 0x0F); + decoded.MediumFormatRecognition = (MediumFormatRecognitionValues)pageResponse[5]; + decoded.PartitionSizes = new ushort[(pageResponse.Length - 8) / 2]; for(int i = 8; i < pageResponse.Length; i += 2) { - decoded.PartitionSizes[(i - 8) / 2] = (ushort)(pageResponse[i] << 8); + decoded.PartitionSizes[(i - 8) / 2] = (ushort)(pageResponse[i] << 8); decoded.PartitionSizes[(i - 8) / 2] += pageResponse[i + 1]; } @@ -175,8 +175,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_11 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_11 page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI medium partition page:"); @@ -251,7 +251,8 @@ namespace DiscImageChef.Decoders.SCSI if(page.PartitionSizes[i] == 0) if(page.PartitionSizes.Length == 1) sb.AppendLine("\tDevice recognizes one single partition spanning whole medium"); - else sb.AppendFormat("\tPartition {0} runs for rest of medium", i).AppendLine(); + else + sb.AppendFormat("\tPartition {0} runs for rest of medium", i).AppendLine(); else sb.AppendFormat("\tPartition {0} is {1} {2} long", i, page.PartitionSizes[i], measure).AppendLine(); diff --git a/SCSI/Modes/12_13_14.cs b/SCSI/Modes/12_13_14.cs index c9a2bd369..2c29baa36 100644 --- a/SCSI/Modes/12_13_14.cs +++ b/SCSI/Modes/12_13_14.cs @@ -78,7 +78,7 @@ namespace DiscImageChef.Decoders.SCSI for(int i = 2; i < pageResponse.Length; i += 2) { - decoded.PartitionSizes[(i - 2) / 2] = (ushort)(pageResponse[i] << 8); + decoded.PartitionSizes[(i - 2) / 2] = (ushort)(pageResponse[i] << 8); decoded.PartitionSizes[(i - 2) / 2] += pageResponse[i + 1]; } @@ -95,7 +95,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; ModePage_12_13_14 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI medium partition page (extra):"); diff --git a/SCSI/Modes/1A.cs b/SCSI/Modes/1A.cs index a50bc5d73..7ba240082 100644 --- a/SCSI/Modes/1A.cs +++ b/SCSI/Modes/1A.cs @@ -118,7 +118,7 @@ namespace DiscImageChef.Decoders.SCSI decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.Standby |= (pageResponse[3] & 0x01) == 0x01; - decoded.Idle |= (pageResponse[3] & 0x02) == 0x02; + decoded.Idle |= (pageResponse[3] & 0x02) == 0x02; decoded.IdleTimer = (uint)((pageResponse[4] << 24) + (pageResponse[5] << 16) + (pageResponse[6] << 8) + pageResponse[7]); @@ -127,19 +127,19 @@ namespace DiscImageChef.Decoders.SCSI if(pageResponse.Length < 40) return decoded; - decoded.PM_BG_Precedence = (byte)((pageResponse[2] & 0xC0) >> 6); - decoded.Standby_Y |= (pageResponse[2] & 0x01) == 0x01; - decoded.Idle_B |= (pageResponse[3] & 0x04) == 0x04; - decoded.Idle_C |= (pageResponse[3] & 0x08) == 0x08; + decoded.PM_BG_Precedence = (byte)((pageResponse[2] & 0xC0) >> 6); + decoded.Standby_Y |= (pageResponse[2] & 0x01) == 0x01; + decoded.Idle_B |= (pageResponse[3] & 0x04) == 0x04; + decoded.Idle_C |= (pageResponse[3] & 0x08) == 0x08; decoded.IdleTimer_B = (uint)((pageResponse[12] << 24) + (pageResponse[13] << 16) + (pageResponse[14] << 8) + pageResponse[15]); decoded.IdleTimer_C = (uint)((pageResponse[16] << 24) + (pageResponse[17] << 16) + (pageResponse[18] << 8) + pageResponse[19]); decoded.StandbyTimer_Y = (uint)((pageResponse[20] << 24) + (pageResponse[21] << 16) + - (pageResponse[22] << 8) + pageResponse[23]); + (pageResponse[22] << 8) + pageResponse[23]); - decoded.CCF_Idle = (byte)((pageResponse[39] & 0xC0) >> 6); + decoded.CCF_Idle = (byte)((pageResponse[39] & 0xC0) >> 6); decoded.CCF_Standby = (byte)((pageResponse[39] & 0x30) >> 4); decoded.CCF_Stopped = (byte)((pageResponse[39] & 0x0C) >> 2); @@ -155,8 +155,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_1A page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_1A page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Power condition page:"); @@ -171,7 +171,7 @@ namespace DiscImageChef.Decoders.SCSI } else sb.AppendLine("\tDrive will not enter standy mode"); - if(page.Idle && page.IdleTimer > 0 || page.Idle_B && page.IdleTimer_B > 0 || + if(page.Idle && page.IdleTimer > 0 || page.Idle_B && page.IdleTimer_B > 0 || page.Idle_C && page.IdleTimer_C > 0) { if(page.Idle && page.IdleTimer > 0) @@ -235,9 +235,9 @@ namespace DiscImageChef.Decoders.SCSI ModePage_1A_S01 decoded = new ModePage_1A_S01(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.ActiveLevel = (byte)(pageResponse[6] & 0x03); - decoded.PowerConsumptionIdentifier = pageResponse[7]; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.ActiveLevel = (byte)(pageResponse[6] & 0x03); + decoded.PowerConsumptionIdentifier = pageResponse[7]; return decoded; } @@ -252,7 +252,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; ModePage_1A_S01 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Power Consumption page:"); diff --git a/SCSI/Modes/1B.cs b/SCSI/Modes/1B.cs index 5eace4e96..f21049302 100644 --- a/SCSI/Modes/1B.cs +++ b/SCSI/Modes/1B.cs @@ -86,11 +86,11 @@ namespace DiscImageChef.Decoders.SCSI ModePage_1B decoded = new ModePage_1B(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.SFLP |= (pageResponse[2] & 0x80) == 0x80; decoded.SRFP |= (pageResponse[2] & 0x40) == 0x40; - decoded.NCD |= (pageResponse[3] & 0x80) == 0x80; - decoded.SML |= (pageResponse[3] & 0x40) == 0x40; + decoded.NCD |= (pageResponse[3] & 0x80) == 0x80; + decoded.SML |= (pageResponse[3] & 0x40) == 0x40; decoded.TLUN = (byte)(pageResponse[3] & 0x07); @@ -106,8 +106,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_1B page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_1B page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Removable Block Access Capabilities page:"); diff --git a/SCSI/Modes/1C.cs b/SCSI/Modes/1C.cs index b8def2bcf..56ad338cf 100644 --- a/SCSI/Modes/1C.cs +++ b/SCSI/Modes/1C.cs @@ -110,9 +110,9 @@ namespace DiscImageChef.Decoders.SCSI decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.Perf |= (pageResponse[2] & 0x80) == 0x80; + decoded.Perf |= (pageResponse[2] & 0x80) == 0x80; decoded.DExcpt |= (pageResponse[2] & 0x08) == 0x08; - decoded.Test |= (pageResponse[2] & 0x04) == 0x04; + decoded.Test |= (pageResponse[2] & 0x04) == 0x04; decoded.LogErr |= (pageResponse[2] & 0x01) == 0x01; decoded.MRIE = (byte)(pageResponse[3] & 0x0F); @@ -120,14 +120,14 @@ namespace DiscImageChef.Decoders.SCSI decoded.IntervalTimer = (uint)((pageResponse[4] << 24) + (pageResponse[5] << 16) + (pageResponse[6] << 8) + pageResponse[7]); - decoded.EBF |= (pageResponse[2] & 0x20) == 0x20; + decoded.EBF |= (pageResponse[2] & 0x20) == 0x20; decoded.EWasc |= (pageResponse[2] & 0x10) == 0x10; decoded.EBACKERR |= (pageResponse[2] & 0x02) == 0x02; if(pageResponse.Length >= 12) - decoded.ReportCount = (uint)((pageResponse[8] << 24) + (pageResponse[9] << 16) + - (pageResponse[10] << 8) + pageResponse[11]); + decoded.ReportCount = (uint)((pageResponse[8] << 24) + (pageResponse[9] << 16) + + (pageResponse[10] << 8) + pageResponse[11]); return decoded; } @@ -141,8 +141,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_1C page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_1C page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Informational exceptions control page:"); @@ -186,8 +186,10 @@ namespace DiscImageChef.Decoders.SCSI if(page.LogErr) sb.AppendLine("\tDrive shall log informational exception conditions"); if(page.IntervalTimer > 0) - if(page.IntervalTimer == 0xFFFFFFFF) sb.AppendLine("\tTimer interval is vendor-specific"); - else sb.AppendFormat("\tTimer interval is {0} ms", page.IntervalTimer * 100).AppendLine(); + if(page.IntervalTimer == 0xFFFFFFFF) + sb.AppendLine("\tTimer interval is vendor-specific"); + else + sb.AppendFormat("\tTimer interval is {0} ms", page.IntervalTimer * 100).AppendLine(); if(page.ReportCount > 0) sb.AppendFormat("\tInformational exception conditions will be reported a maximum of {0} times", @@ -266,14 +268,14 @@ namespace DiscImageChef.Decoders.SCSI decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.S_L_Full |= (pageResponse[4] & 0x04) == 0x04; - decoded.LOWIR |= (pageResponse[4] & 0x02) == 0x02; - decoded.En_Bms |= (pageResponse[4] & 0x01) == 0x01; - decoded.En_Ps |= (pageResponse[5] & 0x01) == 0x01; + decoded.LOWIR |= (pageResponse[4] & 0x02) == 0x02; + decoded.En_Bms |= (pageResponse[4] & 0x01) == 0x01; + decoded.En_Ps |= (pageResponse[5] & 0x01) == 0x01; - decoded.BackgroundScanInterval = (ushort)((pageResponse[6] << 8) + pageResponse[7]); - decoded.BackgroundPrescanTimeLimit = (ushort)((pageResponse[8] << 8) + pageResponse[9]); - decoded.MinIdleBeforeBgScan = (ushort)((pageResponse[10] << 8) + pageResponse[11]); - decoded.MaxTimeSuspendBgScan = (ushort)((pageResponse[12] << 8) + pageResponse[13]); + decoded.BackgroundScanInterval = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.BackgroundPrescanTimeLimit = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.MinIdleBeforeBgScan = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.MaxTimeSuspendBgScan = (ushort)((pageResponse[12] << 8) + pageResponse[13]); return decoded; } @@ -288,7 +290,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; ModePage_1C_S01 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Background Control page:"); @@ -313,8 +315,8 @@ namespace DiscImageChef.Decoders.SCSI if(page.MaxTimeSuspendBgScan > 0) sb - .AppendFormat("\tAt most {0} ms must be before suspending a background scan operation and processing received commands", - page.MaxTimeSuspendBgScan).AppendLine(); + .AppendFormat("\tAt most {0} ms must be before suspending a background scan operation and processing received commands", + page.MaxTimeSuspendBgScan).AppendLine(); return sb.ToString(); } diff --git a/SCSI/Modes/1C_SFF.cs b/SCSI/Modes/1C_SFF.cs index c943ca902..eed8be82b 100644 --- a/SCSI/Modes/1C_SFF.cs +++ b/SCSI/Modes/1C_SFF.cs @@ -78,7 +78,7 @@ namespace DiscImageChef.Decoders.SCSI ModePage_1C_SFF decoded = new ModePage_1C_SFF(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.DISP |= (pageResponse[2] & 0x02) == 0x02; decoded.SWPP |= (pageResponse[3] & 0x01) == 0x01; @@ -97,7 +97,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; ModePage_1C_SFF page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Timer & Protect page:"); diff --git a/SCSI/Modes/1D.cs b/SCSI/Modes/1D.cs index 4ddd99742..287add1cb 100644 --- a/SCSI/Modes/1D.cs +++ b/SCSI/Modes/1D.cs @@ -64,10 +64,10 @@ namespace DiscImageChef.Decoders.SCSI ModePage_1D decoded = new ModePage_1D(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.WORMM |= (pageResponse[2] & 0x01) == 0x01; - decoded.WormModeLabelRestrictions = pageResponse[4]; - decoded.WormModeFilemarkRestrictions = pageResponse[5]; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.WORMM |= (pageResponse[2] & 0x01) == 0x01; + decoded.WormModeLabelRestrictions = pageResponse[4]; + decoded.WormModeFilemarkRestrictions = pageResponse[5]; return decoded; } @@ -81,8 +81,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_1D page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_1D page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI Medium Configuration Mode Page:"); diff --git a/SCSI/Modes/21_Certance.cs b/SCSI/Modes/21_Certance.cs index f9ba75d08..4e9d65226 100644 --- a/SCSI/Modes/21_Certance.cs +++ b/SCSI/Modes/21_Certance.cs @@ -69,15 +69,15 @@ namespace DiscImageChef.Decoders.SCSI Certance_ModePage_21 decoded = new Certance_ModePage_21(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.OperatingSystemsSupport = pageResponse[2]; - decoded.FirmwareTestControl2 = pageResponse[3]; - decoded.ExtendedPOSTMode = pageResponse[4]; - decoded.InquiryStringControl = pageResponse[5]; - decoded.FirmwareTestControl = pageResponse[6]; - decoded.DataCompressionControl = pageResponse[7]; - decoded.HostUnloadOverride |= (pageResponse[8] & 0x80) == 0x80; - decoded.AutoUnloadMode = (byte)(pageResponse[8] & 0x7F); + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.OperatingSystemsSupport = pageResponse[2]; + decoded.FirmwareTestControl2 = pageResponse[3]; + decoded.ExtendedPOSTMode = pageResponse[4]; + decoded.InquiryStringControl = pageResponse[5]; + decoded.FirmwareTestControl = pageResponse[6]; + decoded.DataCompressionControl = pageResponse[7]; + decoded.HostUnloadOverride |= (pageResponse[8] & 0x80) == 0x80; + decoded.AutoUnloadMode = (byte)(pageResponse[8] & 0x7F); return decoded; } @@ -92,7 +92,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; Certance_ModePage_21 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("Certance Drive Capabilities Control Mode Page:"); diff --git a/SCSI/Modes/22_Certance.cs b/SCSI/Modes/22_Certance.cs index db1f05687..25aff1f89 100644 --- a/SCSI/Modes/22_Certance.cs +++ b/SCSI/Modes/22_Certance.cs @@ -73,18 +73,18 @@ namespace DiscImageChef.Decoders.SCSI Certance_ModePage_22 decoded = new Certance_ModePage_22(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.BaudRate = pageResponse[2]; - decoded.CmdFwd = (byte)((pageResponse[3] & 0x18) >> 3); - decoded.StopBits |= (pageResponse[3] & 0x04) == 0x04; - decoded.CmdFwd = (byte)(pageResponse[3] & 0x03); - decoded.PortATransportType = pageResponse[4]; - decoded.PortAPresentSelectionID = pageResponse[7]; - decoded.NextSelectionID = pageResponse[12]; - decoded.JumperedSelectionID = pageResponse[13]; - decoded.TargetInitiatedBusControl = pageResponse[14]; - decoded.PortAEnabled |= (pageResponse[15] & 0x10) == 0x10; - decoded.PortAEnabledOnPower |= (pageResponse[15] & 0x04) == 0x04; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.BaudRate = pageResponse[2]; + decoded.CmdFwd = (byte)((pageResponse[3] & 0x18) >> 3); + decoded.StopBits |= (pageResponse[3] & 0x04) == 0x04; + decoded.CmdFwd = (byte)(pageResponse[3] & 0x03); + decoded.PortATransportType = pageResponse[4]; + decoded.PortAPresentSelectionID = pageResponse[7]; + decoded.NextSelectionID = pageResponse[12]; + decoded.JumperedSelectionID = pageResponse[13]; + decoded.TargetInitiatedBusControl = pageResponse[14]; + decoded.PortAEnabled |= (pageResponse[15] & 0x10) == 0x10; + decoded.PortAEnabledOnPower |= (pageResponse[15] & 0x04) == 0x04; return decoded; } @@ -99,7 +99,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; Certance_ModePage_22 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("Certance Interface Control Mode Page:"); diff --git a/SCSI/Modes/24_IBM.cs b/SCSI/Modes/24_IBM.cs index 0f7f8c8f4..f0e88a843 100644 --- a/SCSI/Modes/24_IBM.cs +++ b/SCSI/Modes/24_IBM.cs @@ -65,9 +65,9 @@ namespace DiscImageChef.Decoders.SCSI IBM_ModePage_24 decoded = new IBM_ModePage_24(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.ModeControl = pageResponse[2]; - decoded.VelocitySetting = pageResponse[3]; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.ModeControl = pageResponse[2]; + decoded.VelocitySetting = pageResponse[3]; decoded.EncryptionEnabled |= (pageResponse[7] & 0x08) == 0x08; decoded.EncryptionCapable |= (pageResponse[7] & 0x01) == 0x01; @@ -84,13 +84,13 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; IBM_ModePage_24 page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("IBM Vendor-Specific Control Mode Page:"); if(page.PS) sb.AppendLine("\tParameters can be saved"); - sb.AppendFormat("\tVendor-specific mode control: {0}", page.ModeControl); + sb.AppendFormat("\tVendor-specific mode control: {0}", page.ModeControl); sb.AppendFormat("\tVendor-specific velocity setting: {0}", page.VelocitySetting); if(!page.EncryptionCapable) return sb.ToString(); diff --git a/SCSI/Modes/2A.cs b/SCSI/Modes/2A.cs index 0758a29e1..e1a732e3d 100644 --- a/SCSI/Modes/2A.cs +++ b/SCSI/Modes/2A.cs @@ -162,30 +162,30 @@ namespace DiscImageChef.Decoders.SCSI public bool RCK; public bool BCK; - public bool TestWrite; + public bool TestWrite; public ushort MaxWriteSpeed; public ushort CurrentWriteSpeed; public bool ReadBarcode; - public bool ReadDVDRAM; - public bool ReadDVDR; - public bool ReadDVDROM; - public bool WriteDVDRAM; - public bool WriteDVDR; - public bool LeadInPW; - public bool SCC; + public bool ReadDVDRAM; + public bool ReadDVDR; + public bool ReadDVDROM; + public bool WriteDVDRAM; + public bool WriteDVDR; + public bool LeadInPW; + public bool SCC; public ushort CMRSupported; - public bool BUF; - public byte RotationControlSelected; - public ushort CurrentWriteSpeedSelected; + public bool BUF; + public byte RotationControlSelected; + public ushort CurrentWriteSpeedSelected; public ModePage_2A_WriteDescriptor[] WriteSpeedPerformanceDescriptors; } public struct ModePage_2A_WriteDescriptor { - public byte RotationControl; + public byte RotationControl; public ushort WriteSpeed; } @@ -203,81 +203,81 @@ namespace DiscImageChef.Decoders.SCSI decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.AudioPlay |= (pageResponse[4] & 0x01) == 0x01; - decoded.Mode2Form1 |= (pageResponse[4] & 0x10) == 0x10; - decoded.Mode2Form2 |= (pageResponse[4] & 0x20) == 0x20; + decoded.AudioPlay |= (pageResponse[4] & 0x01) == 0x01; + decoded.Mode2Form1 |= (pageResponse[4] & 0x10) == 0x10; + decoded.Mode2Form2 |= (pageResponse[4] & 0x20) == 0x20; decoded.MultiSession |= (pageResponse[4] & 0x40) == 0x40; - decoded.CDDACommand |= (pageResponse[5] & 0x01) == 0x01; - decoded.AccurateCDDA |= (pageResponse[5] & 0x02) == 0x02; - decoded.Subchannel |= (pageResponse[5] & 0x04) == 0x04; + decoded.CDDACommand |= (pageResponse[5] & 0x01) == 0x01; + decoded.AccurateCDDA |= (pageResponse[5] & 0x02) == 0x02; + decoded.Subchannel |= (pageResponse[5] & 0x04) == 0x04; decoded.DeinterlaveSubchannel |= (pageResponse[5] & 0x08) == 0x08; - decoded.C2Pointer |= (pageResponse[5] & 0x10) == 0x10; - decoded.UPC |= (pageResponse[5] & 0x20) == 0x20; - decoded.ISRC |= (pageResponse[5] & 0x40) == 0x40; + decoded.C2Pointer |= (pageResponse[5] & 0x10) == 0x10; + decoded.UPC |= (pageResponse[5] & 0x20) == 0x20; + decoded.ISRC |= (pageResponse[5] & 0x40) == 0x40; - decoded.LoadingMechanism = (byte)((pageResponse[6] & 0xE0) >> 5); - decoded.Lock |= (pageResponse[6] & 0x01) == 0x01; - decoded.LockState |= (pageResponse[6] & 0x02) == 0x02; - decoded.PreventJumper |= (pageResponse[6] & 0x04) == 0x04; - decoded.Eject |= (pageResponse[6] & 0x08) == 0x08; + decoded.LoadingMechanism = (byte)((pageResponse[6] & 0xE0) >> 5); + decoded.Lock |= (pageResponse[6] & 0x01) == 0x01; + decoded.LockState |= (pageResponse[6] & 0x02) == 0x02; + decoded.PreventJumper |= (pageResponse[6] & 0x04) == 0x04; + decoded.Eject |= (pageResponse[6] & 0x08) == 0x08; decoded.SeparateChannelVolume |= (pageResponse[7] & 0x01) == 0x01; - decoded.SeparateChannelMute |= (pageResponse[7] & 0x02) == 0x02; + decoded.SeparateChannelMute |= (pageResponse[7] & 0x02) == 0x02; - decoded.MaximumSpeed = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.MaximumSpeed = (ushort)((pageResponse[8] << 8) + pageResponse[9]); decoded.SupportedVolumeLevels = (ushort)((pageResponse[10] << 8) + pageResponse[11]); - decoded.BufferSize = (ushort)((pageResponse[12] << 8) + pageResponse[13]); - decoded.CurrentSpeed = (ushort)((pageResponse[14] << 8) + pageResponse[15]); + decoded.BufferSize = (ushort)((pageResponse[12] << 8) + pageResponse[13]); + decoded.CurrentSpeed = (ushort)((pageResponse[14] << 8) + pageResponse[15]); if(pageResponse.Length < 20) return decoded; - decoded.Method2 |= (pageResponse[2] & 0x04) == 0x04; + decoded.Method2 |= (pageResponse[2] & 0x04) == 0x04; decoded.ReadCDRW |= (pageResponse[2] & 0x02) == 0x02; - decoded.ReadCDR |= (pageResponse[2] & 0x01) == 0x01; + decoded.ReadCDR |= (pageResponse[2] & 0x01) == 0x01; decoded.WriteCDRW |= (pageResponse[3] & 0x02) == 0x02; - decoded.WriteCDR |= (pageResponse[3] & 0x01) == 0x01; + decoded.WriteCDR |= (pageResponse[3] & 0x01) == 0x01; - decoded.Composite |= (pageResponse[4] & 0x02) == 0x02; + decoded.Composite |= (pageResponse[4] & 0x02) == 0x02; decoded.DigitalPort1 |= (pageResponse[4] & 0x04) == 0x04; decoded.DigitalPort2 |= (pageResponse[4] & 0x08) == 0x08; decoded.SDP |= (pageResponse[7] & 0x04) == 0x04; decoded.SSS |= (pageResponse[7] & 0x08) == 0x08; - decoded.Length = (byte)((pageResponse[17] & 0x30) >> 4); - decoded.LSBF |= (pageResponse[17] & 0x08) == 0x08; - decoded.RCK |= (pageResponse[17] & 0x04) == 0x04; - decoded.BCK |= (pageResponse[17] & 0x02) == 0x02; + decoded.Length = (byte)((pageResponse[17] & 0x30) >> 4); + decoded.LSBF |= (pageResponse[17] & 0x08) == 0x08; + decoded.RCK |= (pageResponse[17] & 0x04) == 0x04; + decoded.BCK |= (pageResponse[17] & 0x02) == 0x02; if(pageResponse.Length < 22) return decoded; - decoded.TestWrite |= (pageResponse[3] & 0x04) == 0x04; - decoded.MaxWriteSpeed = (ushort)((pageResponse[18] << 8) + pageResponse[19]); - decoded.CurrentWriteSpeed = (ushort)((pageResponse[20] << 8) + pageResponse[21]); + decoded.TestWrite |= (pageResponse[3] & 0x04) == 0x04; + decoded.MaxWriteSpeed = (ushort)((pageResponse[18] << 8) + pageResponse[19]); + decoded.CurrentWriteSpeed = (ushort)((pageResponse[20] << 8) + pageResponse[21]); decoded.ReadBarcode |= (pageResponse[5] & 0x80) == 0x80; if(pageResponse.Length < 26) return decoded; decoded.ReadDVDRAM |= (pageResponse[2] & 0x20) == 0x20; - decoded.ReadDVDR |= (pageResponse[2] & 0x10) == 0x10; + decoded.ReadDVDR |= (pageResponse[2] & 0x10) == 0x10; decoded.ReadDVDROM |= (pageResponse[2] & 0x08) == 0x08; decoded.WriteDVDRAM |= (pageResponse[3] & 0x20) == 0x20; - decoded.WriteDVDR |= (pageResponse[3] & 0x10) == 0x10; + decoded.WriteDVDR |= (pageResponse[3] & 0x10) == 0x10; decoded.LeadInPW |= (pageResponse[3] & 0x20) == 0x20; - decoded.SCC |= (pageResponse[3] & 0x10) == 0x10; + decoded.SCC |= (pageResponse[3] & 0x10) == 0x10; decoded.CMRSupported = (ushort)((pageResponse[22] << 8) + pageResponse[23]); if(pageResponse.Length < 32) return decoded; - decoded.BUF |= (pageResponse[4] & 0x80) == 0x80; - decoded.RotationControlSelected = (byte)(pageResponse[27] & 0x03); - decoded.CurrentWriteSpeedSelected = (ushort)((pageResponse[28] << 8) + pageResponse[29]); + decoded.BUF |= (pageResponse[4] & 0x80) == 0x80; + decoded.RotationControlSelected = (byte)(pageResponse[27] & 0x03); + decoded.CurrentWriteSpeedSelected = (ushort)((pageResponse[28] << 8) + pageResponse[29]); ushort descriptors = (ushort)((pageResponse.Length - 32) / 4); decoded.WriteSpeedPerformanceDescriptors = new ModePage_2A_WriteDescriptor[descriptors]; @@ -285,7 +285,8 @@ namespace DiscImageChef.Decoders.SCSI for(int i = 0; i < descriptors; i++) decoded.WriteSpeedPerformanceDescriptors[i] = new ModePage_2A_WriteDescriptor { - RotationControl = (byte)(pageResponse[1 + 32 + i * 4] & 0x07), + RotationControl = + (byte)(pageResponse[1 + 32 + i * 4] & 0x07), WriteSpeed = (ushort)((pageResponse[2 + 32 + i * 4] << 8) + pageResponse[3 + 32 + i * 4]) }; @@ -301,8 +302,8 @@ namespace DiscImageChef.Decoders.SCSI { if(!modePage.HasValue) return null; - ModePage_2A page = modePage.Value; - StringBuilder sb = new StringBuilder(); + ModePage_2A page = modePage.Value; + StringBuilder sb = new StringBuilder(); sb.AppendLine("SCSI CD-ROM capabilities page:"); @@ -356,6 +357,7 @@ namespace DiscImageChef.Decoders.SCSI sb.AppendLine(page.LockState ? "\tDrive is locked, media cannot be ejected, but if empty, can be inserted" : "\tDrive is not locked, media can be ejected and inserted"); + if(page.Eject) sb.AppendLine("\tDrive can eject media"); if(page.SeparateChannelMute) sb.AppendLine("\tEach channel can be muted independently"); diff --git a/SCSI/Modes/2F_IBM.cs b/SCSI/Modes/2F_IBM.cs index a34128dd9..f375e5c33 100644 --- a/SCSI/Modes/2F_IBM.cs +++ b/SCSI/Modes/2F_IBM.cs @@ -73,17 +73,17 @@ namespace DiscImageChef.Decoders.SCSI return new IBM_ModePage_2F { - PS = (pageResponse[0] & 0x80) == 0x80, - FenceBehaviour = pageResponse[2], - CleanBehaviour = pageResponse[3], - WORMEmulation = pageResponse[4], - SenseDataBehaviour = pageResponse[5], - CCDM = (pageResponse[6] & 0x04) == 0x04, - DDEOR = (pageResponse[6] & 0x02) == 0x02, - CLNCHK = (pageResponse[6] & 0x01) == 0x01, + PS = (pageResponse[0] & 0x80) == 0x80, + FenceBehaviour = pageResponse[2], + CleanBehaviour = pageResponse[3], + WORMEmulation = pageResponse[4], + SenseDataBehaviour = pageResponse[5], + CCDM = (pageResponse[6] & 0x04) == 0x04, + DDEOR = (pageResponse[6] & 0x02) == 0x02, + CLNCHK = (pageResponse[6] & 0x01) == 0x01, FirmwareUpdateBehaviour = pageResponse[7], - UOE_C = (byte)((pageResponse[8] & 0x30) >> 4), - UOE_F = (byte)((pageResponse[8] & 0x0C) >> 2) + UOE_C = (byte)((pageResponse[8] & 0x30) >> 4), + UOE_F = (byte)((pageResponse[8] & 0x0C) >> 2) }; } @@ -97,7 +97,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; IBM_ModePage_2F page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("IBM Behaviour Configuration Mode Page:"); diff --git a/SCSI/Modes/3B_HP.cs b/SCSI/Modes/3B_HP.cs index 0ea4b412a..37f4dded2 100644 --- a/SCSI/Modes/3B_HP.cs +++ b/SCSI/Modes/3B_HP.cs @@ -48,7 +48,7 @@ namespace DiscImageChef.Decoders.SCSI /// Parameters can be saved /// public bool PS; - public byte MSN; + public byte MSN; public byte[] SerialNumber; } @@ -64,9 +64,9 @@ namespace DiscImageChef.Decoders.SCSI HP_ModePage_3B decoded = new HP_ModePage_3B(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.MSN = (byte)(pageResponse[2] & 0x03); - decoded.SerialNumber = new byte[10]; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.MSN = (byte)(pageResponse[2] & 0x03); + decoded.SerialNumber = new byte[10]; Array.Copy(pageResponse, 6, decoded.SerialNumber, 0, 10); return decoded; @@ -82,7 +82,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; HP_ModePage_3B page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("HP Serial Number Override Mode Page:"); diff --git a/SCSI/Modes/3C_HP.cs b/SCSI/Modes/3C_HP.cs index b1407154d..27e836d7a 100644 --- a/SCSI/Modes/3C_HP.cs +++ b/SCSI/Modes/3C_HP.cs @@ -48,18 +48,18 @@ namespace DiscImageChef.Decoders.SCSI /// Parameters can be saved /// public bool PS; - public bool LT; - public bool WT; - public bool PT; + public bool LT; + public bool WT; + public bool PT; public ushort CurrentPowerOn; - public uint PowerOnTime; - public bool UTC; - public bool NTP; - public uint WorldTime; - public byte LibraryHours; - public byte LibraryMinutes; - public byte LibrarySeconds; - public uint CumulativePowerOn; + public uint PowerOnTime; + public bool UTC; + public bool NTP; + public uint WorldTime; + public byte LibraryHours; + public byte LibraryMinutes; + public byte LibrarySeconds; + public uint CumulativePowerOn; } public static HP_ModePage_3C? DecodeHPModePage_3C(byte[] pageResponse) @@ -74,22 +74,22 @@ namespace DiscImageChef.Decoders.SCSI HP_ModePage_3C decoded = new HP_ModePage_3C(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.LT |= (pageResponse[2] & 0x04) == 0x04; - decoded.WT |= (pageResponse[2] & 0x02) == 0x02; - decoded.PT |= (pageResponse[2] & 0x01) == 0x01; - decoded.CurrentPowerOn = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.LT |= (pageResponse[2] & 0x04) == 0x04; + decoded.WT |= (pageResponse[2] & 0x02) == 0x02; + decoded.PT |= (pageResponse[2] & 0x01) == 0x01; + decoded.CurrentPowerOn = (ushort)((pageResponse[6] << 8) + pageResponse[7]); decoded.PowerOnTime = (uint)((pageResponse[8] << 24) + (pageResponse[9] << 16) + (pageResponse[10] << 8) + pageResponse[11]); decoded.UTC |= (pageResponse[14] & 0x02) == 0x02; decoded.NTP |= (pageResponse[14] & 0x01) == 0x01; decoded.WorldTime = (uint)((pageResponse[16] << 24) + (pageResponse[17] << 16) + (pageResponse[18] << 8) + pageResponse[19]); - decoded.LibraryHours = pageResponse[23]; + decoded.LibraryHours = pageResponse[23]; decoded.LibraryMinutes = pageResponse[24]; decoded.LibrarySeconds = pageResponse[25]; decoded.CumulativePowerOn = (uint)((pageResponse[32] << 24) + (pageResponse[33] << 16) + - (pageResponse[34] << 8) + pageResponse[35]); + (pageResponse[34] << 8) + pageResponse[35]); return decoded; } @@ -104,7 +104,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; HP_ModePage_3C page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("HP Device Time Mode Page:"); diff --git a/SCSI/Modes/3D_HP.cs b/SCSI/Modes/3D_HP.cs index 7239a3a9d..ee028706b 100644 --- a/SCSI/Modes/3D_HP.cs +++ b/SCSI/Modes/3D_HP.cs @@ -62,8 +62,8 @@ namespace DiscImageChef.Decoders.SCSI HP_ModePage_3D decoded = new HP_ModePage_3D(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.ResetBehaviour = (byte)(pageResponse[2] & 0x03); + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.ResetBehaviour = (byte)(pageResponse[2] & 0x03); return decoded; } @@ -78,7 +78,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; HP_ModePage_3D page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("HP Extended Reset Mode Page:"); diff --git a/SCSI/Modes/3D_IBM.cs b/SCSI/Modes/3D_IBM.cs index 417401bed..fbd13328f 100644 --- a/SCSI/Modes/3D_IBM.cs +++ b/SCSI/Modes/3D_IBM.cs @@ -62,8 +62,8 @@ namespace DiscImageChef.Decoders.SCSI IBM_ModePage_3D decoded = new IBM_ModePage_3D(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; - decoded.NumberOfWraps = (ushort)((pageResponse[3] << 8) + pageResponse[4]); + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.NumberOfWraps = (ushort)((pageResponse[3] << 8) + pageResponse[4]); return decoded; } @@ -78,7 +78,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; IBM_ModePage_3D page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("IBM LEOT Mode Page:"); diff --git a/SCSI/Modes/3E_Fujitsu.cs b/SCSI/Modes/3E_Fujitsu.cs index 430cb7b7a..0feb3b92e 100644 --- a/SCSI/Modes/3E_Fujitsu.cs +++ b/SCSI/Modes/3E_Fujitsu.cs @@ -102,12 +102,12 @@ namespace DiscImageChef.Decoders.SCSI decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.audioVisualMode |= (pageResponse[2] & 0x80) == 0x80; - decoded.streamingMode |= (pageResponse[2] & 0x40) == 0x40; - decoded.Reserved1 = (byte)((pageResponse[2] & 0x3C) >> 2); - decoded.verifyMode = (Fujitsu_VerifyModes)(pageResponse[2] & 0x03); + decoded.streamingMode |= (pageResponse[2] & 0x40) == 0x40; + decoded.Reserved1 = (byte)((pageResponse[2] & 0x3C) >> 2); + decoded.verifyMode = (Fujitsu_VerifyModes)(pageResponse[2] & 0x03); decoded.Reserved2 = (byte)((pageResponse[3] & 0xE0) >> 5); - decoded.devType = (PeripheralDeviceTypes)(pageResponse[3] & 0x1F); + decoded.devType = (PeripheralDeviceTypes)(pageResponse[3] & 0x1F); decoded.Reserved3 = new byte[4]; Array.Copy(pageResponse, 4, decoded.Reserved3, 0, 4); @@ -125,7 +125,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; Fujitsu_ModePage_3E page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("Fujitsu Verify Control Page:"); diff --git a/SCSI/Modes/3E_HP.cs b/SCSI/Modes/3E_HP.cs index 769275946..97118bd29 100644 --- a/SCSI/Modes/3E_HP.cs +++ b/SCSI/Modes/3E_HP.cs @@ -63,9 +63,9 @@ namespace DiscImageChef.Decoders.SCSI HP_ModePage_3E decoded = new HP_ModePage_3E(); - decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; decoded.NonAuto |= (pageResponse[2] & 0x02) == 0x02; - decoded.CDmode |= (pageResponse[2] & 0x01) == 0x01; + decoded.CDmode |= (pageResponse[2] & 0x01) == 0x01; return decoded; } @@ -80,7 +80,7 @@ namespace DiscImageChef.Decoders.SCSI if(!modePage.HasValue) return null; HP_ModePage_3E page = modePage.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.AppendLine("HP CD-ROM Emulation/Disaster Recovery Mode Page:"); diff --git a/SCSI/Modes/Headers.cs b/SCSI/Modes/Headers.cs index 569a279c2..adaa112b1 100644 --- a/SCSI/Modes/Headers.cs +++ b/SCSI/Modes/Headers.cs @@ -74,16 +74,16 @@ namespace DiscImageChef.Decoders.SCSI case MediumTypes.Unspecified_DS: return "Unspecified double sided flexible disk"; */ - case MediumTypes.X3_73: return "ANSI X3.73-1980: 200 mm, 6631 ftprad, 1,9 Tracks per mm, 1 side"; + case MediumTypes.X3_73: return "ANSI X3.73-1980: 200 mm, 6631 ftprad, 1,9 Tracks per mm, 1 side"; case MediumTypes.X3_73_DS: return "ANSI X3.73-1980: 200 mm, 6631 ftprad, 1,9 Tracks per mm, 2 sides"; - case MediumTypes.X3_82: return "ANSI X3.80-1980: 130 mm, 3979 ftprad, 1,9 Tracks per mm, 1 side"; + case MediumTypes.X3_82: return "ANSI X3.80-1980: 130 mm, 3979 ftprad, 1,9 Tracks per mm, 1 side"; case MediumTypes.Type3Floppy: return "3.5-inch, 135 tpi, 12362 bits/radian, double-sided MFM (aka 1.25Mb)"; case MediumTypes.HDFloppy: return "3.5-inch, 135 tpi, 15916 bits/radian, double-sided MFM (aka 1.44Mb)"; case MediumTypes.ReadOnly: return "a Read-only optical"; - case MediumTypes.WORM: return "a Write-once Read-many optical"; + case MediumTypes.WORM: return "a Write-once Read-many optical"; case MediumTypes.Erasable: return "a Erasable optical"; - case MediumTypes.RO_WORM: return "a combination of read-only and write-once optical"; + case MediumTypes.RO_WORM: return "a combination of read-only and write-once optical"; // These magneto-opticals were never manufactured /* case MediumTypes.RO_RW: @@ -93,7 +93,7 @@ namespace DiscImageChef.Decoders.SCSI return "a combination of write-once and erasable optical"; */ case MediumTypes.DOW: return "a direct-overwrite optical"; - default: return $"Unknown medium type 0x{(byte)type:X2}"; + default: return $"Unknown medium type 0x{(byte)type:X2}"; } } @@ -1415,8 +1415,8 @@ namespace DiscImageChef.Decoders.SCSI if(descriptor.Blocks == 0) if(descriptor.BlockLength == 0) sb - .AppendFormat("\tAll remaining blocks conform to {0} and have a variable length", - density).AppendLine(); + .AppendFormat("\tAll remaining blocks conform to {0} and have a variable length", + density).AppendLine(); else sb.AppendFormat("\tAll remaining blocks conform to {0} and are {1} bytes each", density, descriptor.BlockLength).AppendLine(); diff --git a/SCSI/Modes/Mode10.cs b/SCSI/Modes/Mode10.cs index 59641ddb9..417c2b508 100644 --- a/SCSI/Modes/Mode10.cs +++ b/SCSI/Modes/Mode10.cs @@ -46,7 +46,7 @@ namespace DiscImageChef.Decoders.SCSI { if(modeResponse == null || modeResponse.Length < 8) return null; - ushort modeLength = (ushort)((modeResponse[0] << 8) + modeResponse[1]); + ushort modeLength = (ushort)((modeResponse[0] << 8) + modeResponse[1]); ushort blockDescLength = (ushort)((modeResponse[6] << 8) + modeResponse[7]); if(modeResponse.Length < modeLength) return null; @@ -65,15 +65,15 @@ namespace DiscImageChef.Decoders.SCSI header.BlockDescriptors[i] = new BlockDescriptor {Density = DensityType.Default}; byte[] temp = new byte[8]; - temp[0] = modeResponse[7 + i * 16 + 8]; - temp[1] = modeResponse[6 + i * 16 + 8]; - temp[2] = modeResponse[5 + i * 16 + 8]; - temp[3] = modeResponse[4 + i * 16 + 8]; - temp[4] = modeResponse[3 + i * 16 + 8]; - temp[5] = modeResponse[2 + i * 16 + 8]; - temp[6] = modeResponse[1 + i * 16 + 8]; - temp[7] = modeResponse[0 + i * 16 + 8]; - header.BlockDescriptors[i].Blocks = BitConverter.ToUInt64(temp, 0); + temp[0] = modeResponse[7 + i * 16 + 8]; + temp[1] = modeResponse[6 + i * 16 + 8]; + temp[2] = modeResponse[5 + i * 16 + 8]; + temp[3] = modeResponse[4 + i * 16 + 8]; + temp[4] = modeResponse[3 + i * 16 + 8]; + temp[5] = modeResponse[2 + i * 16 + 8]; + temp[6] = modeResponse[1 + i * 16 + 8]; + temp[7] = modeResponse[0 + i * 16 + 8]; + header.BlockDescriptors[i].Blocks = BitConverter.ToUInt64(temp, 0); header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[15 + i * 16 + 8] << 24); header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[14 + i * 16 + 8] << 16); header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[13 + i * 16 + 8] << 8); @@ -92,12 +92,13 @@ namespace DiscImageChef.Decoders.SCSI header.BlockDescriptors[i].Density = (DensityType)modeResponse[0 + i * 8 + 8]; else { - header.BlockDescriptors[i].Density = DensityType.Default; - header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[0 + i * 8 + 8] << 24); + header.BlockDescriptors[i].Density = DensityType.Default; + header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[0 + i * 8 + 8] << 24); } - header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[1 + i * 8 + 8] << 16); - header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[2 + i * 8 + 8] << 8); - header.BlockDescriptors[i].Blocks += modeResponse[3 + i * 8 + 8]; + + header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[1 + i * 8 + 8] << 16); + header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[2 + i * 8 + 8] << 8); + header.BlockDescriptors[i].Blocks += modeResponse[3 + i * 8 + 8]; header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[5 + i * 8 + 8] << 16); header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[6 + i * 8 + 8] << 8); header.BlockDescriptors[i].BlockLength += modeResponse[7 + i * 8 + 8]; @@ -109,20 +110,20 @@ namespace DiscImageChef.Decoders.SCSI case PeripheralDeviceTypes.DirectAccess: case PeripheralDeviceTypes.MultiMediaDevice: header.WriteProtected = (modeResponse[3] & 0x80) == 0x80; - header.DPOFUA = (modeResponse[3] & 0x10) == 0x10; + header.DPOFUA = (modeResponse[3] & 0x10) == 0x10; break; case PeripheralDeviceTypes.SequentialAccess: - header.WriteProtected = (modeResponse[3] & 0x80) == 0x80; - header.Speed = (byte)(modeResponse[3] & 0x0F); - header.BufferedMode = (byte)((modeResponse[3] & 0x70) >> 4); + header.WriteProtected = (modeResponse[3] & 0x80) == 0x80; + header.Speed = (byte)(modeResponse[3] & 0x0F); + header.BufferedMode = (byte)((modeResponse[3] & 0x70) >> 4); break; case PeripheralDeviceTypes.PrinterDevice: header.BufferedMode = (byte)((modeResponse[3] & 0x70) >> 4); break; case PeripheralDeviceTypes.OpticalDevice: header.WriteProtected = (modeResponse[3] & 0x80) == 0x80; - header.EBC = (modeResponse[3] & 0x01) == 0x01; - header.DPOFUA = (modeResponse[3] & 0x10) == 0x10; + header.EBC = (modeResponse[3] & 0x01) == 0x01; + header.DPOFUA = (modeResponse[3] & 0x10) == 0x10; break; } @@ -140,13 +141,13 @@ namespace DiscImageChef.Decoders.SCSI if(!hdr.HasValue) return null; DecodedMode decoded = new DecodedMode {Header = hdr.Value}; - bool longlba = (modeResponse[4] & 0x01) == 0x01; - int offset; - int blkDrLength = 0; + bool longlba = (modeResponse[4] & 0x01) == 0x01; + int offset; + int blkDrLength = 0; if(decoded.Header.BlockDescriptors != null) blkDrLength = decoded.Header.BlockDescriptors.Length; if(longlba) offset = 8 + blkDrLength * 16; - else offset = 8 + blkDrLength * 8; + else offset = 8 + blkDrLength * 8; int length = modeResponse[0] << 8; length += modeResponse[1]; length += 2; @@ -157,17 +158,17 @@ namespace DiscImageChef.Decoders.SCSI while(offset < modeResponse.Length) { - bool isSubpage = (modeResponse[offset] & 0x40) == 0x40; - ModePage pg = new ModePage(); - byte pageNo = (byte)(modeResponse[offset] & 0x3F); + bool isSubpage = (modeResponse[offset] & 0x40) == 0x40; + ModePage pg = new ModePage(); + byte pageNo = (byte)(modeResponse[offset] & 0x3F); if(pageNo == 0) { pg.PageResponse = new byte[modeResponse.Length - offset]; Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); - pg.Page = 0; - pg.Subpage = 0; - offset += pg.PageResponse.Length; + pg.Page = 0; + pg.Subpage = 0; + offset += pg.PageResponse.Length; } else { @@ -178,9 +179,9 @@ namespace DiscImageChef.Decoders.SCSI if(pg.PageResponse.Length + offset > modeResponse.Length) return decoded; Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); - pg.Page = (byte)(modeResponse[offset] & 0x3F); - pg.Subpage = modeResponse[offset + 1]; - offset += pg.PageResponse.Length; + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = modeResponse[offset + 1]; + offset += pg.PageResponse.Length; } else { @@ -189,9 +190,9 @@ namespace DiscImageChef.Decoders.SCSI if(pg.PageResponse.Length + offset > modeResponse.Length) return decoded; Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); - pg.Page = (byte)(modeResponse[offset] & 0x3F); - pg.Subpage = 0; - offset += pg.PageResponse.Length; + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = 0; + offset += pg.PageResponse.Length; } } @@ -204,7 +205,7 @@ namespace DiscImageChef.Decoders.SCSI } public static byte[] EncodeModeHeader10(ModeHeader header, PeripheralDeviceTypes deviceType, - bool longLBA = false) + bool longLBA = false) { byte[] hdr; @@ -221,11 +222,11 @@ namespace DiscImageChef.Decoders.SCSI case PeripheralDeviceTypes.DirectAccess: case PeripheralDeviceTypes.MultiMediaDevice: if(header.WriteProtected) hdr[3] += 0x80; - if(header.DPOFUA) hdr[3] += 0x10; + if(header.DPOFUA) hdr[3] += 0x10; break; case PeripheralDeviceTypes.SequentialAccess: if(header.WriteProtected) hdr[3] += 0x80; - hdr[3] += (byte)(header.Speed & 0x0F); + hdr[3] += (byte)(header.Speed & 0x0F); hdr[3] += (byte)((header.BufferedMode << 4) & 0x70); break; case PeripheralDeviceTypes.PrinterDevice: @@ -233,8 +234,8 @@ namespace DiscImageChef.Decoders.SCSI break; case PeripheralDeviceTypes.OpticalDevice: if(header.WriteProtected) hdr[3] += 0x80; - if(header.EBC) hdr[3] += 0x01; - if(header.DPOFUA) hdr[3] += 0x10; + if(header.EBC) hdr[3] += 0x01; + if(header.DPOFUA) hdr[3] += 0x10; break; } @@ -246,30 +247,30 @@ namespace DiscImageChef.Decoders.SCSI for(int i = 0; i < header.BlockDescriptors.Length; i++) { byte[] temp = BitConverter.GetBytes(header.BlockDescriptors[i].Blocks); - hdr[7 + i * 16 + 8] = temp[0]; - hdr[6 + i * 16 + 8] = temp[1]; - hdr[5 + i * 16 + 8] = temp[2]; - hdr[4 + i * 16 + 8] = temp[3]; - hdr[3 + i * 16 + 8] = temp[4]; - hdr[2 + i * 16 + 8] = temp[5]; - hdr[1 + i * 16 + 8] = temp[6]; - hdr[0 + i * 16 + 8] = temp[7]; + hdr[7 + i * 16 + 8] = temp[0]; + hdr[6 + i * 16 + 8] = temp[1]; + hdr[5 + i * 16 + 8] = temp[2]; + hdr[4 + i * 16 + 8] = temp[3]; + hdr[3 + i * 16 + 8] = temp[4]; + hdr[2 + i * 16 + 8] = temp[5]; + hdr[1 + i * 16 + 8] = temp[6]; + hdr[0 + i * 16 + 8] = temp[7]; hdr[12 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF000000) >> 24); - hdr[13 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF0000) >> 16); - hdr[14 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8); + hdr[13 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF0000) >> 16); + hdr[14 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8); hdr[15 + i * 16 + 8] = (byte)(header.BlockDescriptors[i].BlockLength & 0xFF); } else for(int i = 0; i < header.BlockDescriptors.Length; i++) { if(deviceType != PeripheralDeviceTypes.DirectAccess) - hdr[0 + i * 8 + 8] = (byte)header.BlockDescriptors[i].Density; + hdr[0 + i * 8 + 8] = (byte)header.BlockDescriptors[i].Density; else hdr[0 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF000000) >> 24); hdr[1 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF0000) >> 16); - hdr[2 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF00) >> 8); + hdr[2 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF00) >> 8); hdr[3 + i * 8 + 8] = (byte)(header.BlockDescriptors[i].Blocks & 0xFF); hdr[5 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF0000) >> 16); - hdr[6 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8); + hdr[6 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8); hdr[7 + i * 8 + 8] = (byte)(header.BlockDescriptors[i].BlockLength & 0xFF); } @@ -278,7 +279,7 @@ namespace DiscImageChef.Decoders.SCSI public static byte[] EncodeMode10(DecodedMode mode, PeripheralDeviceTypes deviceType) { - int modeSize = 0; + int modeSize = 0; if(mode.Pages != null) modeSize += mode.Pages.Sum(page => page.PageResponse.Length); byte[] hdr = EncodeModeHeader10(mode.Header, deviceType); diff --git a/SCSI/Modes/Mode6.cs b/SCSI/Modes/Mode6.cs index 1a229cac6..9759e3400 100644 --- a/SCSI/Modes/Mode6.cs +++ b/SCSI/Modes/Mode6.cs @@ -54,10 +54,10 @@ namespace DiscImageChef.Decoders.SCSI header.BlockDescriptors = new BlockDescriptor[modeResponse[3] / 8]; for(int i = 0; i < header.BlockDescriptors.Length; i++) { - header.BlockDescriptors[i].Density = (DensityType)modeResponse[0 + i * 8 + 4]; - header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[1 + i * 8 + 4] << 16); - header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[2 + i * 8 + 4] << 8); - header.BlockDescriptors[i].Blocks += modeResponse[3 + i * 8 + 4]; + header.BlockDescriptors[i].Density = (DensityType)modeResponse[0 + i * 8 + 4]; + header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[1 + i * 8 + 4] << 16); + header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[2 + i * 8 + 4] << 8); + header.BlockDescriptors[i].Blocks += modeResponse[3 + i * 8 + 4]; header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[5 + i * 8 + 4] << 16); header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[6 + i * 8 + 4] << 8); header.BlockDescriptors[i].BlockLength += modeResponse[7 + i * 8 + 4]; @@ -69,20 +69,20 @@ namespace DiscImageChef.Decoders.SCSI case PeripheralDeviceTypes.DirectAccess: case PeripheralDeviceTypes.MultiMediaDevice: header.WriteProtected = (modeResponse[2] & 0x80) == 0x80; - header.DPOFUA = (modeResponse[2] & 0x10) == 0x10; + header.DPOFUA = (modeResponse[2] & 0x10) == 0x10; break; case PeripheralDeviceTypes.SequentialAccess: - header.WriteProtected = (modeResponse[2] & 0x80) == 0x80; - header.Speed = (byte)(modeResponse[2] & 0x0F); - header.BufferedMode = (byte)((modeResponse[2] & 0x70) >> 4); + header.WriteProtected = (modeResponse[2] & 0x80) == 0x80; + header.Speed = (byte)(modeResponse[2] & 0x0F); + header.BufferedMode = (byte)((modeResponse[2] & 0x70) >> 4); break; case PeripheralDeviceTypes.PrinterDevice: header.BufferedMode = (byte)((modeResponse[2] & 0x70) >> 4); break; case PeripheralDeviceTypes.OpticalDevice: header.WriteProtected = (modeResponse[2] & 0x80) == 0x80; - header.EBC = (modeResponse[2] & 0x01) == 0x01; - header.DPOFUA = (modeResponse[2] & 0x10) == 0x10; + header.EBC = (modeResponse[2] & 0x01) == 0x01; + header.DPOFUA = (modeResponse[2] & 0x10) == 0x10; break; } @@ -99,11 +99,11 @@ namespace DiscImageChef.Decoders.SCSI ModeHeader? hdr = DecodeModeHeader6(modeResponse, deviceType); if(!hdr.HasValue) return null; - DecodedMode decoded = new DecodedMode {Header = hdr.Value}; - int blkDrLength = 0; + DecodedMode decoded = new DecodedMode {Header = hdr.Value}; + int blkDrLength = 0; if(decoded.Header.BlockDescriptors != null) blkDrLength = decoded.Header.BlockDescriptors.Length; - int offset = 4 + blkDrLength * 8; + int offset = 4 + blkDrLength * 8; int length = modeResponse[0] + 1; if(length != modeResponse.Length) return decoded; @@ -112,17 +112,17 @@ namespace DiscImageChef.Decoders.SCSI while(offset < modeResponse.Length) { - bool isSubpage = (modeResponse[offset] & 0x40) == 0x40; - ModePage pg = new ModePage(); - byte pageNo = (byte)(modeResponse[offset] & 0x3F); + bool isSubpage = (modeResponse[offset] & 0x40) == 0x40; + ModePage pg = new ModePage(); + byte pageNo = (byte)(modeResponse[offset] & 0x3F); if(pageNo == 0) { pg.PageResponse = new byte[modeResponse.Length - offset]; Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); - pg.Page = 0; - pg.Subpage = 0; - offset += pg.PageResponse.Length; + pg.Page = 0; + pg.Subpage = 0; + offset += pg.PageResponse.Length; } else { @@ -134,9 +134,9 @@ namespace DiscImageChef.Decoders.SCSI if(pg.PageResponse.Length + offset > modeResponse.Length) return decoded; Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); - pg.Page = (byte)(modeResponse[offset] & 0x3F); - pg.Subpage = modeResponse[offset + 1]; - offset += pg.PageResponse.Length; + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = modeResponse[offset + 1]; + offset += pg.PageResponse.Length; } else { @@ -146,9 +146,9 @@ namespace DiscImageChef.Decoders.SCSI if(pg.PageResponse.Length + offset > modeResponse.Length) return decoded; Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); - pg.Page = (byte)(modeResponse[offset] & 0x3F); - pg.Subpage = 0; - offset += pg.PageResponse.Length; + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = 0; + offset += pg.PageResponse.Length; } } @@ -173,11 +173,11 @@ namespace DiscImageChef.Decoders.SCSI case PeripheralDeviceTypes.DirectAccess: case PeripheralDeviceTypes.MultiMediaDevice: if(header.WriteProtected) hdr[2] += 0x80; - if(header.DPOFUA) hdr[2] += 0x10; + if(header.DPOFUA) hdr[2] += 0x10; break; case PeripheralDeviceTypes.SequentialAccess: if(header.WriteProtected) hdr[2] += 0x80; - hdr[2] += (byte)(header.Speed & 0x0F); + hdr[2] += (byte)(header.Speed & 0x0F); hdr[2] += (byte)((header.BufferedMode << 4) & 0x70); break; case PeripheralDeviceTypes.PrinterDevice: @@ -185,8 +185,8 @@ namespace DiscImageChef.Decoders.SCSI break; case PeripheralDeviceTypes.OpticalDevice: if(header.WriteProtected) hdr[2] += 0x80; - if(header.EBC) hdr[2] += 0x01; - if(header.DPOFUA) hdr[2] += 0x10; + if(header.EBC) hdr[2] += 0x01; + if(header.DPOFUA) hdr[2] += 0x10; break; } @@ -198,10 +198,10 @@ namespace DiscImageChef.Decoders.SCSI { hdr[0 + i * 8 + 4] = (byte)header.BlockDescriptors[i].Density; hdr[1 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF0000) >> 16); - hdr[2 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF00) >> 8); + hdr[2 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF00) >> 8); hdr[3 + i * 8 + 4] = (byte)(header.BlockDescriptors[i].Blocks & 0xFF); hdr[5 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF0000) >> 16); - hdr[6 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8); + hdr[6 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8); hdr[7 + i * 8 + 4] = (byte)(header.BlockDescriptors[i].BlockLength & 0xFF); } @@ -210,7 +210,7 @@ namespace DiscImageChef.Decoders.SCSI public static byte[] EncodeMode6(DecodedMode mode, PeripheralDeviceTypes deviceType) { - int modeSize = 0; + int modeSize = 0; if(mode.Pages != null) modeSize += mode.Pages.Sum(page => page.PageResponse.Length); byte[] hdr = EncodeModeHeader6(mode.Header, deviceType); diff --git a/SCSI/Modes/Structs.cs b/SCSI/Modes/Structs.cs index 966055c9d..82f114693 100644 --- a/SCSI/Modes/Structs.cs +++ b/SCSI/Modes/Structs.cs @@ -42,25 +42,25 @@ namespace DiscImageChef.Decoders.SCSI public struct BlockDescriptor { public DensityType Density; - public ulong Blocks; - public uint BlockLength; + public ulong Blocks; + public uint BlockLength; } public struct ModeHeader { - public MediumTypes MediumType; - public bool WriteProtected; + public MediumTypes MediumType; + public bool WriteProtected; public BlockDescriptor[] BlockDescriptors; - public byte Speed; - public byte BufferedMode; - public bool EBC; - public bool DPOFUA; + public byte Speed; + public byte BufferedMode; + public bool EBC; + public bool DPOFUA; } public struct ModePage { - public byte Page; - public byte Subpage; + public byte Page; + public byte Subpage; public byte[] PageResponse; } diff --git a/SCSI/SSC/BlockLimits.cs b/SCSI/SSC/BlockLimits.cs index 8ea720997..e195ce869 100644 --- a/SCSI/SSC/BlockLimits.cs +++ b/SCSI/SSC/BlockLimits.cs @@ -65,7 +65,7 @@ namespace DiscImageChef.Decoders.SCSI.SSC { granularity = (byte)(response[0] & 0x1F), maxBlockLen = (uint)((response[1] << 16) + (response[2] << 8) + response[3]), - minBlockLen = (ushort)((response[4] << 8) + response[5]) + minBlockLen = (ushort)((response[4] << 8) + response[5]) }; } diff --git a/SCSI/SSC/DensitySupport.cs b/SCSI/SSC/DensitySupport.cs index 3933a7adf..bb717da8e 100644 --- a/SCSI/SSC/DensitySupport.cs +++ b/SCSI/SSC/DensitySupport.cs @@ -45,32 +45,32 @@ namespace DiscImageChef.Decoders.SCSI.SSC { public struct DensitySupportHeader { - public ushort length; - public ushort reserved; + public ushort length; + public ushort reserved; public DensitySupportDescriptor[] descriptors; } public struct MediaTypeSupportHeader { - public ushort length; - public ushort reserved; + public ushort length; + public ushort reserved; public MediaTypeSupportDescriptor[] descriptors; } public struct DensitySupportDescriptor { - public byte primaryCode; - public byte secondaryCode; - public bool writable; - public bool duplicate; - public bool defaultDensity; - public byte reserved; - public bool lenvalid; + public byte primaryCode; + public byte secondaryCode; + public bool writable; + public bool duplicate; + public bool defaultDensity; + public byte reserved; + public bool lenvalid; public ushort len; - public uint bpmm; + public uint bpmm; public ushort width; public ushort tracks; - public uint capacity; + public uint capacity; public string organization; public string name; public string description; @@ -78,15 +78,15 @@ namespace DiscImageChef.Decoders.SCSI.SSC public struct MediaTypeSupportDescriptor { - public byte mediumType; - public byte reserved1; + public byte mediumType; + public byte reserved1; public ushort len; - public byte numberOfCodes; + public byte numberOfCodes; public byte[] densityCodes; public ushort width; public ushort length; - public byte reserved2; - public byte reserved3; + public byte reserved2; + public byte reserved3; public string organization; public string name; public string description; @@ -103,46 +103,52 @@ namespace DiscImageChef.Decoders.SCSI.SSC if(response.Length != responseLen) return null; List descriptors = new List(); - int offset = 4; + int offset = 4; while(offset < response.Length) { DensitySupportDescriptor descriptor = new DensitySupportDescriptor { - primaryCode = response[offset + 0], - secondaryCode = response[offset + 1], - writable = (response[offset + 2] & 0x80) == 0x80, - duplicate = (response[offset + 2] & 0x40) == 0x40, + primaryCode = response[offset + 0], + secondaryCode = response[offset + 1], + writable = (response[offset + 2] & 0x80) == 0x80, + duplicate = (response[offset + 2] & 0x40) == 0x40, defaultDensity = (response[offset + 2] & 0x20) == 0x20, - reserved = (byte)((response[offset + 2] & 0x1E) >> 1), - lenvalid = (response[offset + 2] & 0x01) == 0x01, - len = (ushort)((response[offset + 3] << 8) + response[offset + 4]), - bpmm = (uint)((response[offset + 5] << 16) + (response[offset + 6] << 8) + response[offset + 7]), - width = (ushort)((response[offset + 8] << 8) + response[offset + 9]), - tracks = (ushort)((response[offset + 10] << 8) + response[offset + 11]), + reserved = (byte)((response[offset + 2] & 0x1E) >> 1), + lenvalid = + (response[offset + 2] & + 0x01) == 0x01, + len = + (ushort)((response[offset + 3] << 8) + response[offset + 4]), + bpmm = + (uint)((response[offset + 5] << 16) + (response[offset + 6] << 8) + response[offset + 7]), + width = + (ushort)((response[offset + 8] << 8) + response[offset + 9]), + tracks = + (ushort)((response[offset + 10] << 8) + response[offset + 11]), capacity = (uint)((response[offset + 12] << 24) + (response[offset + 13] << 16) + - (response[offset + 14] << 8) + response[offset + 15]) + (response[offset + 14] << 8) + response[offset + 15]) }; byte[] tmp = new byte[8]; Array.Copy(response, offset + 16, tmp, 0, 8); descriptor.organization = StringHandlers.CToString(tmp).Trim(); - tmp = new byte[8]; + tmp = new byte[8]; Array.Copy(response, offset + 24, tmp, 0, 8); descriptor.name = StringHandlers.CToString(tmp).Trim(); - tmp = new byte[20]; + tmp = new byte[20]; Array.Copy(response, offset + 32, tmp, 0, 20); descriptor.description = StringHandlers.CToString(tmp).Trim(); if(descriptor.lenvalid) offset += descriptor.len + 5; - else offset += 52; + else offset += 52; descriptors.Add(descriptor); } DensitySupportHeader decoded = new DensitySupportHeader { - length = responseLen, - reserved = (ushort)((response[2] << 8) + response[3] + 2), + length = responseLen, + reserved = (ushort)((response[2] << 8) + response[3] + 2), descriptors = descriptors.ToArray() }; @@ -154,7 +160,7 @@ namespace DiscImageChef.Decoders.SCSI.SSC if(density == null) return null; DensitySupportHeader decoded = density.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); foreach(DensitySupportDescriptor descriptor in decoded.descriptors) { @@ -192,32 +198,32 @@ namespace DiscImageChef.Decoders.SCSI.SSC if(response.Length != responseLen) return null; List descriptors = new List(); - int offset = 4; + int offset = 4; while(offset < response.Length) { MediaTypeSupportDescriptor descriptor = new MediaTypeSupportDescriptor { mediumType = response[offset + 0], - reserved1 = response[offset + 1], - len = (ushort)((response[offset + 2] << 8) + response[offset + 3]) + reserved1 = response[offset + 1], + len = (ushort)((response[offset + 2] << 8) + response[offset + 3]) }; if(descriptor.len != 52) return null; descriptor.numberOfCodes = response[offset + 4]; - descriptor.densityCodes = new byte[9]; - Array.Copy(response, offset + 5, descriptor.densityCodes, 0, 9); - descriptor.width = (ushort)((response[offset + 14] << 8) + response[offset + 15]); - descriptor.length = (ushort)((response[offset + 16] << 8) + response[offset + 17]); + descriptor.densityCodes = new byte[9]; + Array.Copy(response, offset + 5, descriptor.densityCodes, 0, 9); + descriptor.width = (ushort)((response[offset + 14] << 8) + response[offset + 15]); + descriptor.length = (ushort)((response[offset + 16] << 8) + response[offset + 17]); descriptor.reserved1 = response[offset + 18]; descriptor.reserved1 = response[offset + 19]; byte[] tmp = new byte[8]; Array.Copy(response, offset + 20, tmp, 0, 8); descriptor.organization = StringHandlers.CToString(tmp).Trim(); - tmp = new byte[8]; + tmp = new byte[8]; Array.Copy(response, offset + 28, tmp, 0, 8); descriptor.name = StringHandlers.CToString(tmp).Trim(); - tmp = new byte[20]; + tmp = new byte[20]; Array.Copy(response, offset + 36, tmp, 0, 20); descriptor.description = StringHandlers.CToString(tmp).Trim(); @@ -228,8 +234,8 @@ namespace DiscImageChef.Decoders.SCSI.SSC MediaTypeSupportHeader decoded = new MediaTypeSupportHeader { - length = responseLen, - reserved = (ushort)((response[2] << 8) + response[3] + 2), + length = responseLen, + reserved = (ushort)((response[2] << 8) + response[3] + 2), descriptors = descriptors.ToArray() }; @@ -241,7 +247,7 @@ namespace DiscImageChef.Decoders.SCSI.SSC if(mediumType == null) return null; MediaTypeSupportHeader decoded = mediumType.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); foreach(MediaTypeSupportDescriptor descriptor in decoded.descriptors) { diff --git a/SCSI/Sense.cs b/SCSI/Sense.cs index 63f00449e..4495e1130 100644 --- a/SCSI/Sense.cs +++ b/SCSI/Sense.cs @@ -200,7 +200,7 @@ namespace DiscImageChef.Decoders.SCSI /// If set, is valid /// public bool SKSV; - public uint SenseKeySpecific; + public uint SenseKeySpecific; public byte[] AdditionalSense; } @@ -234,9 +234,9 @@ namespace DiscImageChef.Decoders.SCSI public struct AnotherProgressIndicationSenseDescriptor { public SenseKeys SenseKey; - public byte ASC; - public byte ASCQ; - public ushort Progress; + public byte ASC; + public byte ASCQ; + public ushort Progress; } [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] @@ -257,10 +257,10 @@ namespace DiscImageChef.Decoders.SCSI switch(sense[0] & 0x0F) { - case 0: return SenseType.ExtendedSenseFixedCurrent; - case 1: return SenseType.ExtendedSenseFixedPast; - case 2: return SenseType.ExtendedSenseDescriptorCurrent; - case 3: return SenseType.ExtendedSenseDescriptorPast; + case 0: return SenseType.ExtendedSenseFixedCurrent; + case 1: return SenseType.ExtendedSenseFixedPast; + case 2: return SenseType.ExtendedSenseDescriptorCurrent; + case 3: return SenseType.ExtendedSenseDescriptorPast; default: return SenseType.Unknown; } } @@ -271,10 +271,10 @@ namespace DiscImageChef.Decoders.SCSI StandardSense decoded = new StandardSense(); decoded.AddressValid |= (sense[0] & 0x80) == 0x80; - decoded.ErrorClass = (byte)((sense[0] & 0x70) >> 4); - decoded.ErrorType = (byte)(sense[0] & 0x0F); - decoded.Private = (byte)((sense[1] & 0x80) >> 4); - decoded.LBA = (uint)(((sense[1] & 0x0F) << 16) + (sense[2] << 8) + sense[3]); + decoded.ErrorClass = (byte)((sense[0] & 0x70) >> 4); + decoded.ErrorType = (byte)(sense[0] & 0x0F); + decoded.Private = (byte)((sense[1] & 0x80) >> 4); + decoded.LBA = (uint)(((sense[1] & 0x0F) << 16) + (sense[2] << 8) + sense[3]); return decoded; } @@ -294,12 +294,12 @@ namespace DiscImageChef.Decoders.SCSI FixedSense decoded = new FixedSense { InformationValid = (sense[0] & 0x80) == 0x80, - SegmentNumber = sense[1], - Filemark = (sense[2] & 0x80) == 0x80, - EOM = (sense[2] & 0x40) == 0x40, - ILI = (sense[2] & 0x20) == 0x20, - SenseKey = (SenseKeys)(sense[2] & 0x0F), - Information = (uint)((sense[3] << 24) + (sense[4] << 16) + (sense[5] << 8) + sense[6]), + SegmentNumber = sense[1], + Filemark = (sense[2] & 0x80) == 0x80, + EOM = (sense[2] & 0x40) == 0x40, + ILI = (sense[2] & 0x20) == 0x20, + SenseKey = (SenseKeys)(sense[2] & 0x0F), + Information = (uint)((sense[3] << 24) + (sense[4] << 16) + (sense[5] << 8) + sense[6]), AdditionalLength = sense[7] }; @@ -308,8 +308,8 @@ namespace DiscImageChef.Decoders.SCSI if(sense.Length >= 14) { - decoded.ASC = sense[12]; - decoded.ASCQ = sense[13]; + decoded.ASC = sense[12]; + decoded.ASCQ = sense[13]; senseDescription = GetSenseDescription(decoded.ASC, decoded.ASCQ); } @@ -340,10 +340,10 @@ namespace DiscImageChef.Decoders.SCSI DescriptorSense decoded = new DescriptorSense { - SenseKey = (SenseKeys)(sense[1] & 0x0F), - ASC = sense[2], - ASCQ = sense[3], - Overflow = (sense[4] & 0x80) == 0x80, + SenseKey = (SenseKeys)(sense[1] & 0x0F), + ASC = sense[2], + ASCQ = sense[3], + Overflow = (sense[4] & 0x80) == 0x80, Descriptors = new Dictionary() }; @@ -354,7 +354,7 @@ namespace DiscImageChef.Decoders.SCSI if(offset + 2 < sense.Length) { byte descType = sense[offset]; - int descLen = sense[offset + 1] + 1; + int descLen = sense[offset + 1] + 1; byte[] desc = new byte[descLen]; Array.Copy(sense, offset, desc, 0, descLen); @@ -363,7 +363,8 @@ namespace DiscImageChef.Decoders.SCSI offset += descLen; } - else break; + else + break; return decoded; } @@ -554,8 +555,8 @@ namespace DiscImageChef.Decoders.SCSI return new AnotherProgressIndicationSenseDescriptor { SenseKey = (SenseKeys)descriptor[2], - ASC = descriptor[3], - ASCQ = descriptor[4], + ASC = descriptor[3], + ASCQ = descriptor[4], Progress = (ushort)((descriptor[6] << 8) + descriptor[7]) }; } @@ -589,13 +590,13 @@ namespace DiscImageChef.Decoders.SCSI { return new AtaErrorRegistersLba48 { - Error = descriptor[3], - SectorCount = (ushort)((descriptor[4] << 8) + descriptor[5]), - LbaLow = (ushort)((descriptor[6] << 8) + descriptor[7]), - LbaMid = (ushort)((descriptor[8] << 8) + descriptor[9]), - LbaHigh = (ushort)((descriptor[10] << 8) + descriptor[11]), - DeviceHead = descriptor[12], - Status = descriptor[13] + Error = descriptor[3], + SectorCount = (ushort)((descriptor[4] << 8) + descriptor[5]), + LbaLow = (ushort)((descriptor[6] << 8) + descriptor[7]), + LbaMid = (ushort)((descriptor[8] << 8) + descriptor[9]), + LbaHigh = (ushort)((descriptor[10] << 8) + descriptor[11]), + DeviceHead = descriptor[12], + Status = descriptor[13] }; } @@ -624,21 +625,21 @@ namespace DiscImageChef.Decoders.SCSI switch(key) { case SenseKeys.AbortedCommand: return "ABORTED COMMAND"; - case SenseKeys.BlankCheck: return "BLANK CHECK"; - case SenseKeys.CopyAborted: return "COPY ABORTED"; - case SenseKeys.DataProtect: return "DATA PROTECT"; - case SenseKeys.Equal: return "EQUAL"; - case SenseKeys.HardwareError: return "HARDWARE ERROR"; + case SenseKeys.BlankCheck: return "BLANK CHECK"; + case SenseKeys.CopyAborted: return "COPY ABORTED"; + case SenseKeys.DataProtect: return "DATA PROTECT"; + case SenseKeys.Equal: return "EQUAL"; + case SenseKeys.HardwareError: return "HARDWARE ERROR"; case SenseKeys.IllegalRequest: return "ILLEGAL REQUEST"; - case SenseKeys.MediumError: return "MEDIUM ERROR"; - case SenseKeys.Miscompare: return "MISCOMPARE"; - case SenseKeys.NoSense: return "NO SENSE"; - case SenseKeys.PrivateUse: return "PRIVATE USE"; + case SenseKeys.MediumError: return "MEDIUM ERROR"; + case SenseKeys.Miscompare: return "MISCOMPARE"; + case SenseKeys.NoSense: return "NO SENSE"; + case SenseKeys.PrivateUse: return "PRIVATE USE"; case SenseKeys.RecoveredError: return "RECOVERED ERROR"; - case SenseKeys.Completed: return "COMPLETED"; - case SenseKeys.UnitAttention: return "UNIT ATTENTION"; + case SenseKeys.Completed: return "COMPLETED"; + case SenseKeys.UnitAttention: return "UNIT ATTENTION"; case SenseKeys.VolumeOverflow: return "VOLUME OVERFLOW"; - default: return "UNKNOWN"; + default: return "UNKNOWN"; } } @@ -1460,7 +1461,7 @@ namespace DiscImageChef.Decoders.SCSI switch(ASCQ) { case 0x00: return "RAM FAILURE"; - default: return $"DIAGNOSTIC FAILURE ON COMPONENT {ASCQ:X2}h"; + default: return $"DIAGNOSTIC FAILURE ON COMPONENT {ASCQ:X2}h"; } case 0x41: switch(ASCQ) diff --git a/SCSI/VendorString.cs b/SCSI/VendorString.cs index 8b063957b..6605e7635 100644 --- a/SCSI/VendorString.cs +++ b/SCSI/VendorString.cs @@ -38,805 +38,805 @@ namespace DiscImageChef.Decoders.SCSI { switch(scsiVendorString) { - case "0B4C": return "MOOSIK Ltd."; - case "13FE": return "PHISON"; - case "2AI": return "2AI (Automatisme et Avenir Informatique)"; - case "3M": return "3M Company"; - case "3nhtech": return "3NH Technologies"; - case "3PARdata": return "3PARdata, Inc."; - case "A-Max": return "A-Max Technology Co., Ltd"; - case "ABSOLUTE": return "Absolute Analysis"; - case "ACARD": return "ACARD Technology Corp."; - case "Accusys": return "Accusys INC."; - case "Acer": return "Acer, Inc."; - case "ACL": return "Automated Cartridge Librarys, Inc."; - case "Actifio": return "Actifio"; - case "Acuid": return "Acuid Corporation Ltd."; - case "AcuLab": return "AcuLab, Inc. (Tulsa, OK)"; - case "ADAPTEC": return "Adaptec"; - case "ADIC": return "Advanced Digital Information Corporation"; - case "ADSI": return "Adaptive Data Systems, Inc. (a Western Digital subsidiary)"; - case "ADTX": return "ADTX Co., Ltd."; - case "ADVA": return "ADVA Optical Networking AG"; - case "AEM": return "AEM Performance Electronics"; - case "AERONICS": return "Aeronics, Inc."; - case "AGFA": return "AGFA"; - case "Agilent": return "Agilent Technologies"; - case "AIC": return "Advanced Industrial Computer, Inc."; - case "AIPTEK": return "AIPTEK International Inc."; - case "Alcohol": return "Alcohol Soft"; - case "ALCOR": return "Alcor Micro, Corp."; - case "AMCC": return "Applied Micro Circuits Corporation"; - case "AMCODYNE": return "Amcodyne"; - case "Amgeon": return "Amgeon LLC"; - case "AMI": return "American Megatrends, Inc."; - case "AMPEX": return "Ampex Data Systems"; - case "Amphenol": return "Amphenol"; - case "Amtl": return "Tenlon Technology Co.,Ltd"; - case "ANAMATIC": return "Anamartic Limited (England)"; - case "Ancor": return "Ancor Communications, Inc."; - case "ANCOT": return "ANCOT Corp."; - case "ANDATACO": return "Andataco"; - case "andiamo": return "Andiamo Systems, Inc."; - case "ANOBIT": return "Anobit"; - case "ANRITSU": return "Anritsu Corporation"; - case "ANTONIO": return "Antonio Precise Products Manufactory Ltd."; - case "AoT": return "Art of Technology AG"; - case "APPLE": return "Apple Computer, Inc."; - case "ARCHIVE": return "Archive"; - case "ARDENCE": return "Ardence Inc"; - case "Areca": return "Areca Technology Corporation"; - case "Arena": return "MaxTronic International Co., Ltd."; - case "Argent": return "Argent Data Systems, Inc."; - case "ARIO": return "Ario Data Networks, Inc."; - case "ARISTOS": return "Aristos Logic Corp."; - case "ARK": return "ARK Research Corporation"; - case "ARL:UT@A": return "Applied Research Laboratories : University of Texas at Austin"; - case "ARTECON": return "Artecon Inc."; - case "Artistic": return "Artistic Licence (UK) Ltd"; - case "ARTON": return "Arton Int."; - case "ASACA": return "ASACA Corp."; - case "ASC": return "Advanced Storage Concepts, Inc."; - case "ASPEN": return "Aspen Peripherals"; - case "AST": return "AST Research"; - case "ASTEK": return "Astek Corporation"; - case "ASTK": return "Alcatel STK A/S"; - case "AStor": return "AccelStor, Inc."; - case "ASTUTE": return "Astute Networks, Inc."; - case "AT&T": return "AT&T"; - case "ATA": return "SCSI / ATA Translator Software (Organization Not Specified)"; - case "ATARI": return "Atari Corporation"; - case "ATech": return "ATech electronics"; - case "ATG CYG": return "ATG Cygnet Inc."; - case "ATL": return "Quantum|ATL Products"; - case "ATTO": return "ATTO Technology Inc."; - case "ATTRATEC": return "Attratech Ltd liab. Co"; - case "ATX": return "Alphatronix"; - case "AURASEN": return "Aurasen Limited"; - case "Avago": return "Avago Technologies"; - case "AVC": return "AVC Technology Ltd"; - case "AVIDVIDR": return "AVID Technologies, Inc."; - case "AVR": return "Advanced Vision Research"; - case "AXSTOR": return "AXSTOR"; - case "Axxana": return "Axxana Ltd."; - case "B*BRIDGE": return "Blockbridge Networks LLC"; - case "BALLARD": return "Ballard Synergy Corp."; - case "Barco": return "Barco"; - case "BAROMTEC": return "Barom Technologies Co., Ltd."; - case "Bassett": return "Bassett Electronic Systems Ltd"; - case "BC Hydro": return "BC Hydro"; - case "BDT": return "BDT AG"; - case "BECEEM": return "Beceem Communications, Inc"; - case "BENQ": return "BENQ Corporation."; - case "BERGSWD": return "Berg Software Design"; - case "BEZIER": return "Bezier Systems, Inc."; - case "BHTi": return "Breece Hill Technologies"; - case "biodata": return "Biodata Devices SL"; - case "BIOS": return "BIOS Corporation"; - case "BIR": return "Bio-Imaging Research, Inc."; - case "BiT": return "BiT Microsystems"; - case "BITMICRO": return "BiT Microsystems, Inc."; - case "Blendlgy": return "Blendology Limited"; - case "BLOOMBAS": return "Bloombase Technologies Limited"; - case "BlueArc": return "BlueArc Corporation"; - case "bluecog": return "bluecog"; - case "BME-HVT": return "Broadband Infocommunicatons and Electromagnetic Theory Department"; - case "BNCHMARK": return "Benchmark Tape Systems Corporation"; - case "Bosch": return "Robert Bosch GmbH"; - case "Botman": return "Botmanfamily Electronics"; - case "BoxHill": return "Box Hill Systems Corporation"; - case "BRDGWRKS": return "Bridgeworks Ltd."; - case "BREA": return "BREA Technologies, Inc."; - case "BREECE": return "Breece Hill LLC"; - case "BreqLabs": return "BreqLabs Inc."; - case "Broadcom": return "Broadcom Corporation"; - case "BROCADE": return "Brocade Communications Systems, Incorporated"; - case "BUFFALO": return "BUFFALO INC."; - case "BULL": return "Bull Peripherals Corp."; - case "BUSLOGIC": return "BusLogic Inc."; - case "BVIRTUAL": return "B-Virtual N.V."; - case "CACHEIO": return "CacheIO LLC"; - case "CalComp": return "CalComp, A Lockheed Company"; - case "CALCULEX": return "CALCULEX, Inc."; - case "CALIPER": return "Caliper (California Peripheral Corp.)"; - case "CAMBEX": return "Cambex Corporation"; - case "CAMEOSYS": return "Cameo Systems Inc."; - case "CANDERA": return "Candera Inc."; - case "CAPTION": return "CAPTION BANK"; - case "CAST": return "Advanced Storage Tech"; - case "CATALYST": return "Catalyst Enterprises"; - case "CCDISK": return "iSCSI Cake"; - case "CDC": return "Control Data or MPI"; - case "CDP": return "Columbia Data Products"; - case "Celsia": return "A M Bromley Limited"; - case "CenData": return "Central Data Corporation"; - case "Cereva": return "Cereva Networks Inc."; - case "CERTANCE": return "Certance"; - case "Chantil": return "Chantil Technology"; - case "CHEROKEE": return "Cherokee Data Systems"; - case "CHINON": return "Chinon"; - case "CHRISTMA": return "Christmann Informationstechnik + Medien GmbH & Co KG"; - case "CIE&YED": return "YE Data, C.Itoh Electric Corp."; - case "CIPHER": return "Cipher Data Products"; - case "Ciprico": return "Ciprico, Inc."; - case "CIRRUSL": return "Cirrus Logic Inc."; - case "CISCO": return "Cisco Systems, Inc."; - case "CLEARSKY": return "ClearSky Data, Inc."; - case "CLOVERLF": return "Cloverleaf Communications, Inc"; - case "CLS": return "Celestica"; - case "CMD": return "CMD Technology Inc."; - case "CMTechno": return "CMTech"; - case "CNGR SFW": return "Congruent Software, Inc."; - case "CNSi": return "Chaparral Network Storage, Inc."; - case "CNT": return "Computer Network Technology"; - case "COBY": return "Coby Electronics Corporation, USA"; - case "COGITO": return "Cogito"; - case "COMAY": return "Corerise Electronics"; - case "COMPAQ": return "Compaq Computer Corporation"; - case "COMPELNT": return "Compellent Technologies, Inc."; - case "COMPORT": return "Comport Corp."; - case "COMPSIG": return "Computer Signal Corporation"; - case "COMPTEX": return "Comptex Pty Limited"; - case "CONNER": return "Conner Peripherals"; - case "COPANSYS": return "COPAN SYSTEMS INC"; - case "CORAID": return "Coraid, Inc"; - case "CORE": return "Core International, Inc."; - case "CORERISE": return "Corerise Electronics"; - case "COVOTE": return "Covote GmbH & Co KG"; - case "COWON": return "COWON SYSTEMS, Inc."; - case "CPL": return "Cross Products Ltd"; - case "CPU TECH": return "CPU Technology, Inc."; - case "CREO": return "Creo Products Inc."; - case "CROSFLD": return "Crosfield Electronics"; - case "CROSSRDS": return "Crossroads Systems, Inc."; - case "crosswlk": return "Crosswalk, Inc."; - case "CSCOVRTS": return "Cisco - Veritas"; - case "CSM, INC": return "Computer SM, Inc."; - case "Cunuqui": return "CUNUQUI SLU"; - case "CYBERNET": return "Cybernetics"; - case "Cygnal": return "Dekimo"; - case "CYPRESS": return "Cypress Semiconductor Corp."; - case "D Bit": return "Digby's Bitpile, Inc. DBA D Bit"; - case "DALSEMI": return "Dallas Semiconductor"; - case "DANEELEC": return "Dane-Elec"; - case "DANGER": return "Danger Inc."; - case "DAT-MG": return "DAT Manufacturers Group"; - case "Data Com": return "Data Com Information Systems Pty. Ltd."; - case "DATABOOK": return "Databook, Inc."; - case "DATACOPY": return "Datacopy Corp."; - case "DataCore": return "DataCore Software Corporation"; - case "DataG": return "DataGravity"; - case "DATAPT": return "Datapoint Corp."; - case "DATARAM": return "Dataram Corporation"; - case "DATC": return "Datum Champion Technology Co., Ltd"; - case "DAVIS": return "Daviscomms (S) Pte Ltd"; - case "DCS": return "ShenZhen DCS Group Co.,Ltd"; - case "DDN": return "DataDirect Networks, Inc."; - case "DDRDRIVE": return "DDRdrive LLC"; - case "DE": return "Dimension Engineering LLC"; - case "DEC": return "Digital Equipment Corporation"; - case "DEI": return "Digital Engineering, Inc."; - case "DELL": return "Dell, Inc."; - case "Dell(tm)": return "Dell, Inc"; - case "DELPHI": return "Delphi Data Div. of Sparks Industries, Inc."; - case "DENON": return "Denon/Nippon Columbia"; - case "DenOptix": return "DenOptix, Inc."; - case "DEST": return "DEST Corp."; - case "DFC": return "DavioFranke.com"; - case "DFT": return "Data Fault Tolerance System CO.,LTD."; - case "DGC": return "Data General Corp."; - case "DIGIDATA": return "Digi-Data Corporation"; - case "DigiIntl": return "Digi International"; - case "Digital": return "Digital Equipment Corporation"; - case "DILOG": return "Distributed Logic Corp."; - case "DISC": return "Document Imaging Systems Corp."; - case "DiscSoft": return "Disc Soft Ltd"; - case "DLNET": return "Driveline"; - case "DNS": return "Data and Network Security"; - case "DNUK": return "Digital Networks Uk Ltd"; - case "DotHill": return "Dot Hill Systems Corp."; - case "DP": return "Dell, Inc."; - case "DPT": return "Distributed Processing Technology"; - case "Drewtech": return "Drew Technologies, Inc."; - case "DROBO": return "Data Robotics, Inc."; - case "DSC": return "DigitalStream Corporation"; - case "DSI": return "Data Spectrum, Inc."; - case "DSM": return "Deterner Steuerungs- und Maschinenbau GmbH & Co."; - case "DSNET": return "Cleversafe, Inc."; - case "DT": return "Double-Take Software, INC."; - case "DTC QUME": return "Data Technology Qume"; - case "DXIMAGIN": return "DX Imaging"; - case "E-Motion": return "E-Motion LLC"; - case "EARTHLAB": return "EarthLabs"; - case "EarthLCD": return "Earth Computer Technologies, Inc."; - case "ECCS": return "ECCS, Inc."; - case "ECMA": return "European Computer Manufacturers Association"; - case "EDS": return "Embedded Data Systems"; - case "EIM": return "InfoCore"; - case "ELE Intl": return "ELE International"; - case "ELEGANT": return "Elegant Invention, LLC"; - case "Elektron": return "Elektron Music Machines MAV AB"; - case "elipsan": return "Elipsan UK Ltd."; - case "Elms": return "Elms Systems Corporation"; - case "ELSE": return "ELSE Ltd."; - case "ELSEC": return "Littlemore Scientific"; - case "EMASS": return "EMASS, Inc."; - case "EMC": return "EMC Corp."; - case "EMiT": return "EMiT Conception Eletronique"; - case "EMTEC": return "EMTEC Magnetics"; - case "EMULEX": return "Emulex"; - case "ENERGY-B": return "Energybeam Corporation"; - case "ENGENIO": return "Engenio Information Technologies, Inc."; - case "ENMOTUS": return "Enmotus Inc"; - case "Entacore": return "Entacore"; - case "EPOS": return "EPOS Technologies Ltd."; - case "EPSON": return "Epson"; - case "EQLOGIC": return "EqualLogic"; - case "Eris/RSI": return "RSI Systems, Inc."; - case "ETERNE": return "EterneData Technology Co.,Ltd.(China PRC.)"; - case "EuroLogc": return "Eurologic Systems Limited"; - case "evolve": return "Evolution Technologies, Inc"; - case "EXABYTE": return "Exabyte Corp."; - case "EXATEL": return "Exatelecom Co., Ltd."; - case "EXAVIO": return "Exavio, Inc."; - case "Exsequi": return "Exsequi Ltd"; - case "Exxotest": return "Annecy Electronique"; - case "FAIRHAVN": return "Fairhaven Health, LLC"; - case "FALCON": return "FalconStor, Inc."; - case "FDS": return "Formation Data Systems"; - case "FFEILTD": return "FujiFilm Electonic Imaging Ltd"; - case "Fibxn": return "Fiberxon, Inc."; - case "FID": return "First International Digital, Inc."; - case "FILENET": return "FileNet Corp."; - case "FirmFact": return "Firmware Factory Ltd"; - case "FLYFISH": return "Flyfish Technologies"; - case "FOXCONN": return "Foxconn Technology Group"; - case "FRAMDRV": return "FRAMEDRIVE Corp."; - case "FREECION": return "Nable Communications, Inc."; - case "FRESHDTK": return "FreshDetect GmbH"; - case "FSC": return "Fujitsu Siemens Computers"; - case "FTPL": return "Frontline Technologies Pte Ltd"; - case "FUJI": return "Fuji Electric Co., Ltd. (Japan)"; - case "FUJIFILM": return "Fuji Photo Film, Co., Ltd."; - case "FUJITSU": return "Fujitsu"; - case "FUNAI": return "Funai Electric Co., Ltd."; - case "FUSIONIO": return "Fusion-io Inc."; - case "FUTURED": return "Future Domain Corp."; - case "G&D": return "Giesecke & Devrient GmbH"; - case "G.TRONIC": return "Globaltronic - Electronica e Telecomunicacoes, S.A."; - case "Gadzoox": return "Gadzoox Networks, Inc."; - case "Gammaflx": return "Gammaflux L.P."; - case "GDI": return "Generic Distribution International"; - case "GEMALTO": return "gemalto"; - case "Gen_Dyn": return "General Dynamics"; - case "Generic": return "Generic Technology Co., Ltd."; - case "GENSIG": return "General Signal Networks"; - case "GEO": return "Green Energy Options Ltd"; - case "GIGATAPE": return "GIGATAPE GmbH"; - case "GIGATRND": return "GigaTrend Incorporated"; - case "Global": return "Global Memory Test Consortium"; - case "Gnutek": return "Gnutek Ltd."; - case "Goidelic": return "Goidelic Precision, Inc."; - case "GoldKey": return "GoldKey Security Corporation"; - case "GoldStar": return "LG Electronics Inc."; - case "GOOGLE": return "Google, Inc."; - case "GORDIUS": return "Gordius"; - case "GOULD": return "Gould"; - case "HAGIWARA": return "Hagiwara Sys-Com Co., Ltd."; - case "HAPP3": return "Inventec Multimedia and Telecom co., ltd"; - case "HDS": return "Horizon Data Systems, Inc."; - case "Helldyne": return "Helldyne, Inc"; - case "Heydays": return "Mazo Technology Co., Ltd."; - case "HGST": return "HGST a Western Digital Company"; - case "HI-TECH": return "HI-TECH Software Pty. Ltd."; - case "HITACHI": return "Hitachi America Ltd or Nissei Sangyo America Ltd"; - case "HL-DT-ST": return "Hitachi-LG Data Storage, Inc."; - case "HONEYWEL": return "Honeywell Inc."; - case "Hoptroff": return "HexWax Ltd"; - case "HORIZONT": return "Horizontigo Software"; - case "HP": return "Hewlett Packard"; - case "HPE": return "Hewlett Packard Enterprise"; - case "HPI": return "HP Inc."; - case "HPQ": return "Hewlett Packard"; - case "HUALU": return "CHINA HUALU GROUP CO., LTD"; - case "HUASY": return "Huawei Symantec Technologies Co., Ltd."; - case "HYLINX": return "Hylinx Ltd."; - case "HYUNWON": return "HYUNWON inc"; - case "i-cubed": return "i-cubed ltd."; - case "IBM": return "International Business Machines"; - case "Icefield": return "Icefield Tools Corporation"; - case "Iceweb": return "Iceweb Storage Corp"; - case "ICL": return "ICL"; - case "ICP": return "ICP vortex Computersysteme GmbH"; - case "IDE": return "International Data Engineering, Inc."; - case "IDG": return "Interface Design Group"; - case "IET": return "ISCSI ENTERPRISE TARGET"; - case "IFT": return "Infortrend Technology, Inc."; - case "IGR": return "Intergraph Corp."; - case "IMAGINE": return "Imagine Communications Corp."; - case "IMAGO": return "IMAGO SOFTWARE SL"; - case "IMATION": return "Imation"; - case "IMPLTD": return "Integrated Micro Products Ltd."; - case "IMPRIMIS": return "Imprimis Technology Inc."; - case "INCIPNT": return "Incipient Technologies Inc."; - case "INCITS": return "InterNational Committee for Information Technology"; - case "INDCOMP": return "Industrial Computing Limited"; - case "Indigita": return "Indigita Corporation"; - case "INFOCORE": return "InfoCore"; - case "INITIO": return "Initio Corporation"; - case "INRANGE": return "INRANGE Technologies Corporation"; - case "Insight": return "L-3 Insight Technology Inc"; - case "INSITE": return "Insite Peripherals"; - case "integrix": return "Integrix, Inc."; - case "INTEL": return "Intel Corporation"; - case "Intransa": return "Intransa, Inc."; - case "IOC": return "I/O Concepts, Inc."; - case "iofy": return "iofy Corporation"; - case "IOMEGA": return "Iomega"; - case "IOT": return "IO Turbine, Inc."; - case "iPaper": return "intelliPaper, LLC"; - case "iqstor": return "iQstor Networks, Inc."; - case "iQue": return "iQue"; - case "ISi": return "Information Storage inc."; - case "Isilon": return "Isilon Systems, Inc."; - case "ISO": return "International Standards Organization"; - case "iStor": return "iStor Networks, Inc."; - case "ITC": return "International Tapetronics Corporation"; - case "iTwin": return "iTwin Pte Ltd"; - case "IVIVITY": return "iVivity, Inc."; - case "IVMMLTD": return "InnoVISION Multimedia Ltd."; - case "JABIL001": return "Jabil Circuit"; - case "JETWAY": return "Jetway Information Co., Ltd"; - case "JMR": return "JMR Electronics Inc."; - case "JOFEMAR": return "Jofemar"; - case "JOLLYLOG": return "Jolly Logic"; - case "JPC Inc.": return "JPC Inc."; - case "JSCSI": return "jSCSI Project"; - case "Juniper": return "Juniper Networks"; - case "JVC": return "JVC Information Products Co."; - case "KASHYA": return "Kashya, Inc."; - case "KENNEDY": return "Kennedy Company"; - case "KENWOOD": return "KENWOOD Corporation"; - case "KEWL": return "Shanghai KEWL Imp&Exp Co., Ltd."; - case "Key Tech": return "Key Technologies, Inc"; - case "KMNRIO": return "Kaminario Technologies Ltd."; - case "KODAK": return "Eastman Kodak"; - case "KONAN": return "Konan"; - case "koncepts": return "koncepts International Ltd."; - case "KONICA": return "Konica Japan"; - case "KOVE": return "KOVE"; - case "KSCOM": return "KSCOM Co. Ltd.,"; - case "KUDELSKI": return "Nagravision SA - Kudelski Group"; - case "Kyocera": return "Kyocera Corporation"; - case "Lapida": return "Gonmalo Electronics"; - case "LAPINE": return "Lapine Technology"; - case "LASERDRV": return "LaserDrive Limited"; - case "LASERGR": return "Lasergraphics, Inc."; - case "LeapFrog": return "LeapFrog Enterprises, Inc."; - case "LEFTHAND": return "LeftHand Networks"; - case "Leica": return "Leica Camera AG"; - case "Lexar": return "Lexar Media, Inc."; - case "LEYIO": return "LEYIO"; - case "LG": return "LG Electronics Inc."; - case "LGE": return "LG Electronics Inc."; - case "LIBNOVA": return "LIBNOVA, SL Digital Preservation Systems"; - case "LION": return "Lion Optics Corporation"; - case "LMS": return "Laser Magnetic Storage International Company"; - case "LoupTech": return "Loup Technologies, Inc."; - case "LSI": return "LSI Corp. (was LSI Logic Corp.)"; - case "LSILOGIC": return "LSI Logic Storage Systems, Inc."; - case "LTO-CVE": return "Linear Tape - Open, Compliance Verification Entity"; - case "LUXPRO": return "Luxpro Corporation"; - case "MacroSAN": return "MacroSAN Technologies Co., Ltd."; - case "Malakite": return "Malachite Technologies (New VID is: Sandial)"; - case "MarcBoon": return "marcboon.com"; - case "Marner": return "Marner Storage Technologies, Inc."; - case "MARVELL": return "Marvell Semiconductor, Inc."; - case "Matrix": return "Matrix Orbital Corp."; - case "MATSHITA": return "Matsushita"; - case "MAXELL": return "Hitachi Maxell, Ltd."; - case "MAXIM-IC": return "Maxim Integrated Products"; - case "MaxOptix": return "Maxoptix Corp."; - case "MAXSTRAT": return "Maximum Strategy, Inc."; - case "MAXTOR": return "Maxtor Corp."; - case "MaXXan": return "MaXXan Systems, Inc."; - case "MAYCOM": return "maycom Co., Ltd."; - case "MBEAT": return "K-WON C&C Co.,Ltd"; - case "MCC": return "Measurement Computing Corporation"; - case "McDATA": return "McDATA Corporation"; - case "MCUBE": return "Mcube Technology Co., Ltd."; - case "MDI": return "Micro Design International, Inc."; - case "MEADE": return "Meade Instruments Corporation"; - case "mediamat": return "mediamatic"; - case "MegaElec": return "Mega Electronics Ltd"; - case "MEII": return "Mountain Engineering II, Inc."; - case "MELA": return "Mitsubishi Electronics America"; - case "MELCO": return "Mitsubishi Electric (Japan)"; - case "mellanox": return "Mellanox Technologies Ltd."; - case "MEMOREX": return "Memorex Telex Japan Ltd."; - case "MEMREL": return "Memrel Corporation"; - case "MEMTECH": return "MemTech Technology"; - case "Mendocin": return "Mendocino Software"; - case "MendoCno": return "Mendocino Software"; - case "MERIDATA": return "Oy Meridata Finland Ltd"; - case "METHODEI": return "Methode Electronics India pvt ltd"; - case "METRUM": return "Metrum, Inc."; - case "MHTL": return "Matsunichi Hi-Tech Limited"; - case "MICROBTX": return "Microbotics Inc."; - case "Microchp": return "Microchip Technology, Inc."; - case "MICROLIT": return "Microlite Corporation"; - case "MICRON": return "Micron Technology, Inc."; - case "MICROP": return "Micropolis"; - case "MICROTEK": return "Microtek Storage Corp"; - case "Minitech": return "Minitech (UK) Limited"; - case "Minolta": return "Minolta Corporation"; - case "MINSCRIB": return "Miniscribe"; - case "MiraLink": return "MiraLink Corporation"; - case "Mirifica": return "Mirifica s.r.l."; - case "MITSUMI": return "Mitsumi Electric Co., Ltd."; - case "MKM": return "Mitsubishi Kagaku Media Co., LTD."; - case "Mobii": return "Mobii Systems (Pty.) Ltd."; - case "MOL": return "Petrosoft Sdn. Bhd."; - case "MOSAID": return "Mosaid Technologies Inc."; - case "MOTOROLA": return "Motorola"; - case "MP-400": return "Daiwa Manufacturing Limited"; - case "MPC": return "MPC Corporation"; - case "MPCCORP": return "MPC Computers"; - case "MPEYE": return "Touchstone Technology Co., Ltd"; - case "MPIO": return "DKT Co.,Ltd"; - case "MPM": return "Mitsubishi Paper Mills, Ltd."; - case "MPMan": return "MPMan.com, Inc."; - case "MSFT": return "Microsoft Corporation"; - case "MSI": return "Micro-Star International Corp."; - case "MST": return "Morning Star Technologies, Inc."; - case "MSystems": return "M-Systems Flash Disk Pioneers"; - case "MTI": return "MTI Technology Corporation"; - case "MTNGATE": return "MountainGate Data Systems"; - case "MXI": return "Memory Experts International"; - case "nac": return "nac Image Technology Inc."; - case "NAGRA": return "Nagravision SA - Kudelski Group"; - case "NAI": return "North Atlantic Industries"; - case "NAKAMICH": return "Nakamichi Corporation"; - case "NatInst": return "National Instruments"; - case "NatSemi": return "National Semiconductor Corp."; - case "NCITS": return "InterNational Committee for Information Technology Standards (INCITS)"; - case "NCL": return "NCL America"; - case "NCR": return "NCR Corporation"; - case "NDBTECH": return "NDB Technologie Inc."; - case "Neartek": return "Neartek, Inc."; - case "NEC": return "NEC"; - case "NETAPP": return "NetApp, Inc. (was Network Appliance)"; - case "NetBSD": return "The NetBSD Foundation"; - case "Netcom": return "Netcom Storage"; - case "NETENGIN": return "NetEngine, Inc."; - case "NEWISYS": return "Newisys Data Storage"; - case "Newtech": return "Newtech Co., Ltd."; - case "NEXSAN": return "Nexsan Technologies, Ltd."; - case "NFINIDAT": return "Infinidat Ltd."; - case "NHR": return "NH Research, Inc."; - case "Nike": return "Nike, Inc."; - case "Nimble": return "Nimble Storage"; - case "NISCA": return "NISCA Inc."; - case "NISHAN": return "Nishan Systems Inc."; - case "Nitz": return "Nitz Associates, Inc."; - case "NKK": return "NKK Corp."; - case "NRC": return "Nakamichi Research Corporation"; - case "NSD": return "Nippon Systems Development Co.,Ltd."; - case "NSM": return "NSM Jukebox GmbH"; - case "nStor": return "nStor Technologies, Inc."; - case "NT": return "Northern Telecom"; - case "NUCONNEX": return "NuConnex"; - case "NUSPEED": return "NuSpeed, Inc."; - case "NVIDIA": return "NVIDIA Corporation"; - case "NVMe": return "NVM Express Working Group"; - case "OAI": return "Optical Access International"; - case "OCE": return "Oce Graphics"; - case "ODS": return "ShenZhen DCS Group Co.,Ltd"; - case "OHDEN": return "Ohden Co., Ltd."; - case "OKI": return "OKI Electric Industry Co.,Ltd (Japan)"; - case "Olidata": return "Olidata S.p.A."; - case "OMI": return "Optical Media International"; - case "OMNIFI": return "Rockford Corporation - Omnifi Media"; - case "OMNIS": return "OMNIS Company (FRANCE)"; - case "Ophidian": return "Ophidian Designs"; - case "opslag": return "Tyrone Systems"; - case "Optelec": return "Optelec BV"; - case "Optiarc": return "Sony Optiarc Inc."; - case "OPTIMEM": return "Cipher/Optimem"; - case "OPTOTECH": return "Optotech"; - case "ORACLE": return "Oracle Corporation"; - case "ORANGE": return "Orange Micro, Inc."; - case "ORCA": return "Orca Technology"; - case "Origin": return "Origin Energy"; - case "OSI": return "Optical Storage International"; - case "OSNEXUS": return "OS NEXUS, Inc."; - case "OTL": return "OTL Engineering"; - case "OVERLAND": return "Overland Storage Inc."; - case "pacdigit": return "Pacific Digital Corp"; - case "Packard": return "Parkard Bell"; - case "Panasas": return "Panasas, Inc."; - case "PARALAN": return "Paralan Corporation"; - case "PASCOsci": return "Pasco Scientific"; - case "PATHLGHT": return "Pathlight Technology, Inc."; - case "PCS": return "Pro Charging Systems, LLC"; - case "PerStor": return "Perstor"; - case "PERTEC": return "Pertec Peripherals Corporation"; - case "PFTI": return "Performance Technology Inc."; - case "PFU": return "PFU Limited"; - case "Phigment": return "Phigment Technologies"; - case "PHILIPS": return "Philips Electronics"; - case "PICO": return "Packard Instrument Company"; - case "PIK": return "TECHNILIENT & MCS"; - case "Pillar": return "Pillar Data Systems"; - case "PIONEER": return "Pioneer Electronic Corp."; - case "Pirus": return "Pirus Networks"; - case "PIVOT3": return "Pivot3, Inc."; - case "PLASMON": return "Plasmon Data"; - case "Pliant": return "Pliant Technology, Inc."; - case "PMCSIERA": return "PMC-Sierra"; - case "PME": return "Precision Measurement Engineering"; - case "PNNMed": return "PNN Medical SA"; - case "POKEN": return "Poken SA"; - case "POLYTRON": return "PT. HARTONO ISTANA TEKNOLOGI"; - case "PRAIRIE": return "PrairieTek"; - case "PREPRESS": return "PrePRESS Solutions"; - case "PRESOFT": return "PreSoft Architects"; - case "PRESTON": return "Preston Scientific"; - case "PRIAM": return "Priam"; - case "PRIMAGFX": return "Primagraphics Ltd"; - case "PRIMOS": return "Primos"; - case "PROCOM": return "Procom Technology"; - case "PROLIFIC": return "Prolific Technology Inc."; - case "PROMISE": return "PROMISE TECHNOLOGY, Inc"; - case "PROSTOR": return "ProStor Systems, Inc."; - case "PROSUM": return "PROSUM"; - case "PROWARE": return "Proware Technology Corp."; - case "PTI": return "Peripheral Technology Inc."; - case "PTICO": return "Pacific Technology International"; - case "PURE": return "PURE Storage"; - case "Qi-Hardw": return "Qi Hardware"; - case "QIC": return "Quarter-Inch Cartridge Drive Standards, Inc."; - case "QLogic": return "QLogic Corporation"; - case "QNAP": return "QNAP Systems"; - case "Qsan": return "QSAN Technology, Inc."; - case "QUALSTAR": return "Qualstar"; - case "QUANTEL": return "Quantel Ltd."; - case "QUANTUM": return "Quantum Corp."; - case "QUIX": return "Quix Computerware AG"; - case "R-BYTE": return "R-Byte, Inc."; - case "RACALREC": return "Racal Recorders"; - case "RADITEC": return "Radikal Technologies Deutschland GmbH"; - case "RADSTONE": return "Radstone Technology"; - case "RAIDINC": return "RAID Inc."; - case "RASSYS": return "Rasilient Systems Inc."; - case "RASVIA": return "Rasvia Systems, Inc."; - case "rave-mp": return "Go Video"; - case "RDKMSTG": return "MMS Dipl. Ing. Rolf-Dieter Klein"; - case "RDStor": return "Rorke China"; - case "Readboy": return "Readboy Ltd Co."; - case "Realm": return "Realm Systems"; - case "realtek": return "Realtek Semiconductor Corp."; - case "REDUXIO": return "Reduxio Systems Ltd."; - case "rehanltd": return "Rehan Electronics Ltd"; - case "REKA": return "REKA HEALTH PTE LTD"; - case "RELDATA": return "RELDATA Inc"; - case "RENAGmbH": return "RENA GmbH"; - case "ReThinkM": return "RETHINK MEDICAL, INC"; - case "Revivio": return "Revivio, Inc."; - case "RGBLaser": return "RGB Lasersysteme GmbH"; - case "RGI": return "Raster Graphics, Inc."; - case "RHAPSODY": return "Rhapsody Networks, Inc."; - case "RHS": return "Racal-Heim Systems GmbH"; - case "RICOH": return "Ricoh"; - case "RODIME": return "Rodime"; - case "Rorke": return "RD DATA Technology (ShenZhen) Limited"; - case "Royaltek": return "RoyalTek company Ltd."; - case "RPS": return "RPS"; - case "RTI": return "Reference Technology"; - case "S-D": return "Sauer-Danfoss"; - case "S-flex": return "Storageflex Inc"; - case "S-SYSTEM": return "S-SYSTEM"; - case "S1": return "storONE"; - case "SAMSUNG": return "Samsung Electronics Co., Ltd."; - case "SAN": return "Storage Area Networks, Ltd."; - case "Sandial": return "Sandial Systems, Inc."; - case "SanDisk": return "SanDisk Corporation"; - case "SANKYO": return "Sankyo Seiki"; - case "SANRAD": return "SANRAD Inc."; - case "SANYO": return "SANYO Electric Co., Ltd."; - case "SC.Net": return "StorageConnections.Net"; - case "SCALE": return "Scale Computing, Inc."; - case "SCIENTEK": return "SCIENTEK CORP"; - case "SCInc.": return "Storage Concepts, Inc."; - case "SCREEN": return "Dainippon Screen Mfg. Co., Ltd."; - case "SDI": return "Storage Dimensions, Inc."; - case "SDS": return "Solid Data Systems"; - case "SEAC": return "SeaChange International, Inc."; - case "SEAGATE": return "Seagate"; - case "SEAGRAND": return "SEAGRAND In Japan"; - case "Seanodes": return "Seanodes"; - case "Sec. Key": return "SecureKey Technologies Inc."; - case "SEQUOIA": return "Sequoia Advanced Technologies, Inc."; - case "SGI": return "Silicon Graphics International"; - case "Shannon": return "Shannon Systems Co., Ltd."; - case "Shinko": return "Shinko Electric Co., Ltd."; - case "SIEMENS": return "Siemens"; - case "SigmaTel": return "SigmaTel, Inc."; - case "SII": return "Seiko Instruments Inc."; - case "SIMPLE": return "SimpleTech, Inc."; - case "SIVMSD": return "IMAGO SOFTWARE SL"; - case "SKhynix": return "SK hynix Inc."; - case "SLCNSTOR": return "SiliconStor, Inc."; - case "SLI": return "Sierra Logic, Inc."; - case "SMCI": return "Super Micro Computer, Inc."; - case "SmrtStor": return "Smart Storage Systems"; - case "SMS": return "Scientific Micro Systems/OMTI"; - case "SMSC": return "SMSC Storage, Inc."; - case "SMX": return "Smartronix, Inc."; - case "SNYSIDE": return "Sunnyside Computing Inc."; - case "SoftLock": return "Softlock Digital Security Provider"; - case "SolidFir": return "SolidFire, Inc."; - case "SONIC": return "Sonic Solutions"; - case "SoniqCas": return "SoniqCast"; - case "SONY": return "Sony Corporation Japan"; - case "SOUL": return "Soul Storage Technology (Wuxi) Co., Ltd"; - case "SPD": return "Storage Products Distribution, Inc."; - case "SPECIAL": return "Special Computing Co."; - case "SPECTRA": return "Spectra Logic, a Division of Western Automation Labs, Inc."; - case "SPERRY": return "Sperry"; - case "Spintso": return "Spintso International AB"; - case "STARBORD": return "Starboard Storage Systems, Inc."; - case "STARWIND": return "StarWind Software, Inc."; - case "STEC": return "STEC, Inc."; - case "Sterling": return "Sterling Diagnostic Imaging, Inc."; - case "STK": return "Storage Technology Corporation"; - case "STNWOOD": return "Stonewood Group"; - case "STONEFLY": return "StoneFly Networks, Inc."; - case "STOR": return "StorageNetworks, Inc."; - case "STORAPP": return "StorageApps, Inc."; - case "STORCIUM": return "Intelligent Systems Services Inc."; - case "STORCOMP": return "Storage Computer Corporation"; - case "STORM": return "Storm Technology, Inc."; - case "StorMagc": return "StorMagic"; - case "Stratus": return "Stratus Technologies"; - case "StrmLgc": return "StreamLogic Corp."; - case "SUMITOMO": return "Sumitomo Electric Industries, Ltd."; - case "SUN": return "Sun Microsystems, Inc."; - case "SUNCORP": return "SunCorporation"; - case "suntx": return "Suntx System Co., Ltd"; - case "SUSE": return "SUSE Linux"; - case "Swinxs": return "Swinxs BV"; - case "SYMANTEC": return "Symantec Corporation"; - case "SYMBIOS": return "Symbios Logic Inc."; - case "SYMWAVE": return "Symwave, Inc."; - case "SYNCSORT": return "Syncsort Incorporated"; - case "SYNERWAY": return "Synerway"; - case "SYNOLOGY": return "Synology, Inc."; - case "SyQuest": return "SyQuest Technology, Inc."; - case "SYSGEN": return "Sysgen"; - case "T-MITTON": return "Transmitton England"; - case "T-MOBILE": return "T-Mobile USA, Inc."; - case "T11": return "INCITS Technical Committee T11"; - case "TALARIS": return "Talaris Systems, Inc."; - case "TALLGRAS": return "Tallgrass Technologies"; - case "TANDBERG": return "Tandberg Data A/S"; - case "TANDEM": return "Tandem"; - case "TANDON": return "Tandon"; - case "TCL": return "TCL Shenzhen ASIC MIcro-electronics Ltd"; - case "TDK": return "TDK Corporation"; - case "TEAC": return "TEAC Japan"; - case "TECOLOTE": return "Tecolote Designs"; - case "TEGRA": return "Tegra Varityper"; - case "Teilch": return "Teilch"; - case "Tek": return "Tektronix"; - case "TELLERT": return "Tellert Elektronik GmbH"; - case "TENTIME": return "Laura Technologies, Inc."; - case "TFDATACO": return "TimeForge"; - case "TGEGROUP": return "TGE Group Co.,LTD."; - case "Thecus": return "Thecus Technology Corp."; - case "TI-DSG": return "Texas Instruments"; - case "TiGi": return "TiGi Corporation"; - case "TILDESGN": return "Tildesign bv"; - case "Tite": return "Tite Technology Limited"; - case "TKS Inc.": return "TimeKeeping Systems, Inc."; - case "TLMKS": return "Telemakus LLC"; - case "TMS": return "Texas Memory Systems, Inc."; - case "TMS100": return "TechnoVas"; - case "TOLISGRP": return "The TOLIS Group"; - case "TOSHIBA": return "Toshiba Japan"; - case "TOYOU": return "TOYOU FEIJI ELECTRONICS CO.,LTD."; - case "Tracker": return "Tracker, LLC"; - case "TRIOFLEX": return "Trioflex Oy"; - case "TRIPACE": return "Tripace"; - case "TRLogger": return "TrueLogger Ltd."; - case "TROIKA": return "Troika Networks, Inc."; - case "TRULY": return "TRULY Electronics MFG. LTD."; - case "TRUSTED": return "Trusted Data Corporation"; - case "TSSTcorp": return "Toshiba Samsung Storage Technology Corporation"; - case "TZM": return "TZ Medical"; - case "UD-DVR": return "Bigstone Project."; - case "UDIGITAL": return "United Digital Limited"; - case "UIT": return "United Infomation Technology"; - case "ULTRA": return "UltraStor Corporation"; - case "UNISTOR": return "Unistor Networks, Inc."; - case "UNISYS": return "Unisys"; - case "USCORE": return "Underscore, Inc."; - case "USDC": return "US Design Corp."; + case "0B4C": return "MOOSIK Ltd."; + case "13FE": return "PHISON"; + case "2AI": return "2AI (Automatisme et Avenir Informatique)"; + case "3M": return "3M Company"; + case "3nhtech": return "3NH Technologies"; + case "3PARdata": return "3PARdata, Inc."; + case "A-Max": return "A-Max Technology Co., Ltd"; + case "ABSOLUTE": return "Absolute Analysis"; + case "ACARD": return "ACARD Technology Corp."; + case "Accusys": return "Accusys INC."; + case "Acer": return "Acer, Inc."; + case "ACL": return "Automated Cartridge Librarys, Inc."; + case "Actifio": return "Actifio"; + case "Acuid": return "Acuid Corporation Ltd."; + case "AcuLab": return "AcuLab, Inc. (Tulsa, OK)"; + case "ADAPTEC": return "Adaptec"; + case "ADIC": return "Advanced Digital Information Corporation"; + case "ADSI": return "Adaptive Data Systems, Inc. (a Western Digital subsidiary)"; + case "ADTX": return "ADTX Co., Ltd."; + case "ADVA": return "ADVA Optical Networking AG"; + case "AEM": return "AEM Performance Electronics"; + case "AERONICS": return "Aeronics, Inc."; + case "AGFA": return "AGFA"; + case "Agilent": return "Agilent Technologies"; + case "AIC": return "Advanced Industrial Computer, Inc."; + case "AIPTEK": return "AIPTEK International Inc."; + case "Alcohol": return "Alcohol Soft"; + case "ALCOR": return "Alcor Micro, Corp."; + case "AMCC": return "Applied Micro Circuits Corporation"; + case "AMCODYNE": return "Amcodyne"; + case "Amgeon": return "Amgeon LLC"; + case "AMI": return "American Megatrends, Inc."; + case "AMPEX": return "Ampex Data Systems"; + case "Amphenol": return "Amphenol"; + case "Amtl": return "Tenlon Technology Co.,Ltd"; + case "ANAMATIC": return "Anamartic Limited (England)"; + case "Ancor": return "Ancor Communications, Inc."; + case "ANCOT": return "ANCOT Corp."; + case "ANDATACO": return "Andataco"; + case "andiamo": return "Andiamo Systems, Inc."; + case "ANOBIT": return "Anobit"; + case "ANRITSU": return "Anritsu Corporation"; + case "ANTONIO": return "Antonio Precise Products Manufactory Ltd."; + case "AoT": return "Art of Technology AG"; + case "APPLE": return "Apple Computer, Inc."; + case "ARCHIVE": return "Archive"; + case "ARDENCE": return "Ardence Inc"; + case "Areca": return "Areca Technology Corporation"; + case "Arena": return "MaxTronic International Co., Ltd."; + case "Argent": return "Argent Data Systems, Inc."; + case "ARIO": return "Ario Data Networks, Inc."; + case "ARISTOS": return "Aristos Logic Corp."; + case "ARK": return "ARK Research Corporation"; + case "ARL:UT@A": return "Applied Research Laboratories : University of Texas at Austin"; + case "ARTECON": return "Artecon Inc."; + case "Artistic": return "Artistic Licence (UK) Ltd"; + case "ARTON": return "Arton Int."; + case "ASACA": return "ASACA Corp."; + case "ASC": return "Advanced Storage Concepts, Inc."; + case "ASPEN": return "Aspen Peripherals"; + case "AST": return "AST Research"; + case "ASTEK": return "Astek Corporation"; + case "ASTK": return "Alcatel STK A/S"; + case "AStor": return "AccelStor, Inc."; + case "ASTUTE": return "Astute Networks, Inc."; + case "AT&T": return "AT&T"; + case "ATA": return "SCSI / ATA Translator Software (Organization Not Specified)"; + case "ATARI": return "Atari Corporation"; + case "ATech": return "ATech electronics"; + case "ATG CYG": return "ATG Cygnet Inc."; + case "ATL": return "Quantum|ATL Products"; + case "ATTO": return "ATTO Technology Inc."; + case "ATTRATEC": return "Attratech Ltd liab. Co"; + case "ATX": return "Alphatronix"; + case "AURASEN": return "Aurasen Limited"; + case "Avago": return "Avago Technologies"; + case "AVC": return "AVC Technology Ltd"; + case "AVIDVIDR": return "AVID Technologies, Inc."; + case "AVR": return "Advanced Vision Research"; + case "AXSTOR": return "AXSTOR"; + case "Axxana": return "Axxana Ltd."; + case "B*BRIDGE": return "Blockbridge Networks LLC"; + case "BALLARD": return "Ballard Synergy Corp."; + case "Barco": return "Barco"; + case "BAROMTEC": return "Barom Technologies Co., Ltd."; + case "Bassett": return "Bassett Electronic Systems Ltd"; + case "BC Hydro": return "BC Hydro"; + case "BDT": return "BDT AG"; + case "BECEEM": return "Beceem Communications, Inc"; + case "BENQ": return "BENQ Corporation."; + case "BERGSWD": return "Berg Software Design"; + case "BEZIER": return "Bezier Systems, Inc."; + case "BHTi": return "Breece Hill Technologies"; + case "biodata": return "Biodata Devices SL"; + case "BIOS": return "BIOS Corporation"; + case "BIR": return "Bio-Imaging Research, Inc."; + case "BiT": return "BiT Microsystems"; + case "BITMICRO": return "BiT Microsystems, Inc."; + case "Blendlgy": return "Blendology Limited"; + case "BLOOMBAS": return "Bloombase Technologies Limited"; + case "BlueArc": return "BlueArc Corporation"; + case "bluecog": return "bluecog"; + case "BME-HVT": return "Broadband Infocommunicatons and Electromagnetic Theory Department"; + case "BNCHMARK": return "Benchmark Tape Systems Corporation"; + case "Bosch": return "Robert Bosch GmbH"; + case "Botman": return "Botmanfamily Electronics"; + case "BoxHill": return "Box Hill Systems Corporation"; + case "BRDGWRKS": return "Bridgeworks Ltd."; + case "BREA": return "BREA Technologies, Inc."; + case "BREECE": return "Breece Hill LLC"; + case "BreqLabs": return "BreqLabs Inc."; + case "Broadcom": return "Broadcom Corporation"; + case "BROCADE": return "Brocade Communications Systems, Incorporated"; + case "BUFFALO": return "BUFFALO INC."; + case "BULL": return "Bull Peripherals Corp."; + case "BUSLOGIC": return "BusLogic Inc."; + case "BVIRTUAL": return "B-Virtual N.V."; + case "CACHEIO": return "CacheIO LLC"; + case "CalComp": return "CalComp, A Lockheed Company"; + case "CALCULEX": return "CALCULEX, Inc."; + case "CALIPER": return "Caliper (California Peripheral Corp.)"; + case "CAMBEX": return "Cambex Corporation"; + case "CAMEOSYS": return "Cameo Systems Inc."; + case "CANDERA": return "Candera Inc."; + case "CAPTION": return "CAPTION BANK"; + case "CAST": return "Advanced Storage Tech"; + case "CATALYST": return "Catalyst Enterprises"; + case "CCDISK": return "iSCSI Cake"; + case "CDC": return "Control Data or MPI"; + case "CDP": return "Columbia Data Products"; + case "Celsia": return "A M Bromley Limited"; + case "CenData": return "Central Data Corporation"; + case "Cereva": return "Cereva Networks Inc."; + case "CERTANCE": return "Certance"; + case "Chantil": return "Chantil Technology"; + case "CHEROKEE": return "Cherokee Data Systems"; + case "CHINON": return "Chinon"; + case "CHRISTMA": return "Christmann Informationstechnik + Medien GmbH & Co KG"; + case "CIE&YED": return "YE Data, C.Itoh Electric Corp."; + case "CIPHER": return "Cipher Data Products"; + case "Ciprico": return "Ciprico, Inc."; + case "CIRRUSL": return "Cirrus Logic Inc."; + case "CISCO": return "Cisco Systems, Inc."; + case "CLEARSKY": return "ClearSky Data, Inc."; + case "CLOVERLF": return "Cloverleaf Communications, Inc"; + case "CLS": return "Celestica"; + case "CMD": return "CMD Technology Inc."; + case "CMTechno": return "CMTech"; + case "CNGR SFW": return "Congruent Software, Inc."; + case "CNSi": return "Chaparral Network Storage, Inc."; + case "CNT": return "Computer Network Technology"; + case "COBY": return "Coby Electronics Corporation, USA"; + case "COGITO": return "Cogito"; + case "COMAY": return "Corerise Electronics"; + case "COMPAQ": return "Compaq Computer Corporation"; + case "COMPELNT": return "Compellent Technologies, Inc."; + case "COMPORT": return "Comport Corp."; + case "COMPSIG": return "Computer Signal Corporation"; + case "COMPTEX": return "Comptex Pty Limited"; + case "CONNER": return "Conner Peripherals"; + case "COPANSYS": return "COPAN SYSTEMS INC"; + case "CORAID": return "Coraid, Inc"; + case "CORE": return "Core International, Inc."; + case "CORERISE": return "Corerise Electronics"; + case "COVOTE": return "Covote GmbH & Co KG"; + case "COWON": return "COWON SYSTEMS, Inc."; + case "CPL": return "Cross Products Ltd"; + case "CPU TECH": return "CPU Technology, Inc."; + case "CREO": return "Creo Products Inc."; + case "CROSFLD": return "Crosfield Electronics"; + case "CROSSRDS": return "Crossroads Systems, Inc."; + case "crosswlk": return "Crosswalk, Inc."; + case "CSCOVRTS": return "Cisco - Veritas"; + case "CSM, INC": return "Computer SM, Inc."; + case "Cunuqui": return "CUNUQUI SLU"; + case "CYBERNET": return "Cybernetics"; + case "Cygnal": return "Dekimo"; + case "CYPRESS": return "Cypress Semiconductor Corp."; + case "D Bit": return "Digby's Bitpile, Inc. DBA D Bit"; + case "DALSEMI": return "Dallas Semiconductor"; + case "DANEELEC": return "Dane-Elec"; + case "DANGER": return "Danger Inc."; + case "DAT-MG": return "DAT Manufacturers Group"; + case "Data Com": return "Data Com Information Systems Pty. Ltd."; + case "DATABOOK": return "Databook, Inc."; + case "DATACOPY": return "Datacopy Corp."; + case "DataCore": return "DataCore Software Corporation"; + case "DataG": return "DataGravity"; + case "DATAPT": return "Datapoint Corp."; + case "DATARAM": return "Dataram Corporation"; + case "DATC": return "Datum Champion Technology Co., Ltd"; + case "DAVIS": return "Daviscomms (S) Pte Ltd"; + case "DCS": return "ShenZhen DCS Group Co.,Ltd"; + case "DDN": return "DataDirect Networks, Inc."; + case "DDRDRIVE": return "DDRdrive LLC"; + case "DE": return "Dimension Engineering LLC"; + case "DEC": return "Digital Equipment Corporation"; + case "DEI": return "Digital Engineering, Inc."; + case "DELL": return "Dell, Inc."; + case "Dell(tm)": return "Dell, Inc"; + case "DELPHI": return "Delphi Data Div. of Sparks Industries, Inc."; + case "DENON": return "Denon/Nippon Columbia"; + case "DenOptix": return "DenOptix, Inc."; + case "DEST": return "DEST Corp."; + case "DFC": return "DavioFranke.com"; + case "DFT": return "Data Fault Tolerance System CO.,LTD."; + case "DGC": return "Data General Corp."; + case "DIGIDATA": return "Digi-Data Corporation"; + case "DigiIntl": return "Digi International"; + case "Digital": return "Digital Equipment Corporation"; + case "DILOG": return "Distributed Logic Corp."; + case "DISC": return "Document Imaging Systems Corp."; + case "DiscSoft": return "Disc Soft Ltd"; + case "DLNET": return "Driveline"; + case "DNS": return "Data and Network Security"; + case "DNUK": return "Digital Networks Uk Ltd"; + case "DotHill": return "Dot Hill Systems Corp."; + case "DP": return "Dell, Inc."; + case "DPT": return "Distributed Processing Technology"; + case "Drewtech": return "Drew Technologies, Inc."; + case "DROBO": return "Data Robotics, Inc."; + case "DSC": return "DigitalStream Corporation"; + case "DSI": return "Data Spectrum, Inc."; + case "DSM": return "Deterner Steuerungs- und Maschinenbau GmbH & Co."; + case "DSNET": return "Cleversafe, Inc."; + case "DT": return "Double-Take Software, INC."; + case "DTC QUME": return "Data Technology Qume"; + case "DXIMAGIN": return "DX Imaging"; + case "E-Motion": return "E-Motion LLC"; + case "EARTHLAB": return "EarthLabs"; + case "EarthLCD": return "Earth Computer Technologies, Inc."; + case "ECCS": return "ECCS, Inc."; + case "ECMA": return "European Computer Manufacturers Association"; + case "EDS": return "Embedded Data Systems"; + case "EIM": return "InfoCore"; + case "ELE Intl": return "ELE International"; + case "ELEGANT": return "Elegant Invention, LLC"; + case "Elektron": return "Elektron Music Machines MAV AB"; + case "elipsan": return "Elipsan UK Ltd."; + case "Elms": return "Elms Systems Corporation"; + case "ELSE": return "ELSE Ltd."; + case "ELSEC": return "Littlemore Scientific"; + case "EMASS": return "EMASS, Inc."; + case "EMC": return "EMC Corp."; + case "EMiT": return "EMiT Conception Eletronique"; + case "EMTEC": return "EMTEC Magnetics"; + case "EMULEX": return "Emulex"; + case "ENERGY-B": return "Energybeam Corporation"; + case "ENGENIO": return "Engenio Information Technologies, Inc."; + case "ENMOTUS": return "Enmotus Inc"; + case "Entacore": return "Entacore"; + case "EPOS": return "EPOS Technologies Ltd."; + case "EPSON": return "Epson"; + case "EQLOGIC": return "EqualLogic"; + case "Eris/RSI": return "RSI Systems, Inc."; + case "ETERNE": return "EterneData Technology Co.,Ltd.(China PRC.)"; + case "EuroLogc": return "Eurologic Systems Limited"; + case "evolve": return "Evolution Technologies, Inc"; + case "EXABYTE": return "Exabyte Corp."; + case "EXATEL": return "Exatelecom Co., Ltd."; + case "EXAVIO": return "Exavio, Inc."; + case "Exsequi": return "Exsequi Ltd"; + case "Exxotest": return "Annecy Electronique"; + case "FAIRHAVN": return "Fairhaven Health, LLC"; + case "FALCON": return "FalconStor, Inc."; + case "FDS": return "Formation Data Systems"; + case "FFEILTD": return "FujiFilm Electonic Imaging Ltd"; + case "Fibxn": return "Fiberxon, Inc."; + case "FID": return "First International Digital, Inc."; + case "FILENET": return "FileNet Corp."; + case "FirmFact": return "Firmware Factory Ltd"; + case "FLYFISH": return "Flyfish Technologies"; + case "FOXCONN": return "Foxconn Technology Group"; + case "FRAMDRV": return "FRAMEDRIVE Corp."; + case "FREECION": return "Nable Communications, Inc."; + case "FRESHDTK": return "FreshDetect GmbH"; + case "FSC": return "Fujitsu Siemens Computers"; + case "FTPL": return "Frontline Technologies Pte Ltd"; + case "FUJI": return "Fuji Electric Co., Ltd. (Japan)"; + case "FUJIFILM": return "Fuji Photo Film, Co., Ltd."; + case "FUJITSU": return "Fujitsu"; + case "FUNAI": return "Funai Electric Co., Ltd."; + case "FUSIONIO": return "Fusion-io Inc."; + case "FUTURED": return "Future Domain Corp."; + case "G&D": return "Giesecke & Devrient GmbH"; + case "G.TRONIC": return "Globaltronic - Electronica e Telecomunicacoes, S.A."; + case "Gadzoox": return "Gadzoox Networks, Inc."; + case "Gammaflx": return "Gammaflux L.P."; + case "GDI": return "Generic Distribution International"; + case "GEMALTO": return "gemalto"; + case "Gen_Dyn": return "General Dynamics"; + case "Generic": return "Generic Technology Co., Ltd."; + case "GENSIG": return "General Signal Networks"; + case "GEO": return "Green Energy Options Ltd"; + case "GIGATAPE": return "GIGATAPE GmbH"; + case "GIGATRND": return "GigaTrend Incorporated"; + case "Global": return "Global Memory Test Consortium"; + case "Gnutek": return "Gnutek Ltd."; + case "Goidelic": return "Goidelic Precision, Inc."; + case "GoldKey": return "GoldKey Security Corporation"; + case "GoldStar": return "LG Electronics Inc."; + case "GOOGLE": return "Google, Inc."; + case "GORDIUS": return "Gordius"; + case "GOULD": return "Gould"; + case "HAGIWARA": return "Hagiwara Sys-Com Co., Ltd."; + case "HAPP3": return "Inventec Multimedia and Telecom co., ltd"; + case "HDS": return "Horizon Data Systems, Inc."; + case "Helldyne": return "Helldyne, Inc"; + case "Heydays": return "Mazo Technology Co., Ltd."; + case "HGST": return "HGST a Western Digital Company"; + case "HI-TECH": return "HI-TECH Software Pty. Ltd."; + case "HITACHI": return "Hitachi America Ltd or Nissei Sangyo America Ltd"; + case "HL-DT-ST": return "Hitachi-LG Data Storage, Inc."; + case "HONEYWEL": return "Honeywell Inc."; + case "Hoptroff": return "HexWax Ltd"; + case "HORIZONT": return "Horizontigo Software"; + case "HP": return "Hewlett Packard"; + case "HPE": return "Hewlett Packard Enterprise"; + case "HPI": return "HP Inc."; + case "HPQ": return "Hewlett Packard"; + case "HUALU": return "CHINA HUALU GROUP CO., LTD"; + case "HUASY": return "Huawei Symantec Technologies Co., Ltd."; + case "HYLINX": return "Hylinx Ltd."; + case "HYUNWON": return "HYUNWON inc"; + case "i-cubed": return "i-cubed ltd."; + case "IBM": return "International Business Machines"; + case "Icefield": return "Icefield Tools Corporation"; + case "Iceweb": return "Iceweb Storage Corp"; + case "ICL": return "ICL"; + case "ICP": return "ICP vortex Computersysteme GmbH"; + case "IDE": return "International Data Engineering, Inc."; + case "IDG": return "Interface Design Group"; + case "IET": return "ISCSI ENTERPRISE TARGET"; + case "IFT": return "Infortrend Technology, Inc."; + case "IGR": return "Intergraph Corp."; + case "IMAGINE": return "Imagine Communications Corp."; + case "IMAGO": return "IMAGO SOFTWARE SL"; + case "IMATION": return "Imation"; + case "IMPLTD": return "Integrated Micro Products Ltd."; + case "IMPRIMIS": return "Imprimis Technology Inc."; + case "INCIPNT": return "Incipient Technologies Inc."; + case "INCITS": return "InterNational Committee for Information Technology"; + case "INDCOMP": return "Industrial Computing Limited"; + case "Indigita": return "Indigita Corporation"; + case "INFOCORE": return "InfoCore"; + case "INITIO": return "Initio Corporation"; + case "INRANGE": return "INRANGE Technologies Corporation"; + case "Insight": return "L-3 Insight Technology Inc"; + case "INSITE": return "Insite Peripherals"; + case "integrix": return "Integrix, Inc."; + case "INTEL": return "Intel Corporation"; + case "Intransa": return "Intransa, Inc."; + case "IOC": return "I/O Concepts, Inc."; + case "iofy": return "iofy Corporation"; + case "IOMEGA": return "Iomega"; + case "IOT": return "IO Turbine, Inc."; + case "iPaper": return "intelliPaper, LLC"; + case "iqstor": return "iQstor Networks, Inc."; + case "iQue": return "iQue"; + case "ISi": return "Information Storage inc."; + case "Isilon": return "Isilon Systems, Inc."; + case "ISO": return "International Standards Organization"; + case "iStor": return "iStor Networks, Inc."; + case "ITC": return "International Tapetronics Corporation"; + case "iTwin": return "iTwin Pte Ltd"; + case "IVIVITY": return "iVivity, Inc."; + case "IVMMLTD": return "InnoVISION Multimedia Ltd."; + case "JABIL001": return "Jabil Circuit"; + case "JETWAY": return "Jetway Information Co., Ltd"; + case "JMR": return "JMR Electronics Inc."; + case "JOFEMAR": return "Jofemar"; + case "JOLLYLOG": return "Jolly Logic"; + case "JPC Inc.": return "JPC Inc."; + case "JSCSI": return "jSCSI Project"; + case "Juniper": return "Juniper Networks"; + case "JVC": return "JVC Information Products Co."; + case "KASHYA": return "Kashya, Inc."; + case "KENNEDY": return "Kennedy Company"; + case "KENWOOD": return "KENWOOD Corporation"; + case "KEWL": return "Shanghai KEWL Imp&Exp Co., Ltd."; + case "Key Tech": return "Key Technologies, Inc"; + case "KMNRIO": return "Kaminario Technologies Ltd."; + case "KODAK": return "Eastman Kodak"; + case "KONAN": return "Konan"; + case "koncepts": return "koncepts International Ltd."; + case "KONICA": return "Konica Japan"; + case "KOVE": return "KOVE"; + case "KSCOM": return "KSCOM Co. Ltd.,"; + case "KUDELSKI": return "Nagravision SA - Kudelski Group"; + case "Kyocera": return "Kyocera Corporation"; + case "Lapida": return "Gonmalo Electronics"; + case "LAPINE": return "Lapine Technology"; + case "LASERDRV": return "LaserDrive Limited"; + case "LASERGR": return "Lasergraphics, Inc."; + case "LeapFrog": return "LeapFrog Enterprises, Inc."; + case "LEFTHAND": return "LeftHand Networks"; + case "Leica": return "Leica Camera AG"; + case "Lexar": return "Lexar Media, Inc."; + case "LEYIO": return "LEYIO"; + case "LG": return "LG Electronics Inc."; + case "LGE": return "LG Electronics Inc."; + case "LIBNOVA": return "LIBNOVA, SL Digital Preservation Systems"; + case "LION": return "Lion Optics Corporation"; + case "LMS": return "Laser Magnetic Storage International Company"; + case "LoupTech": return "Loup Technologies, Inc."; + case "LSI": return "LSI Corp. (was LSI Logic Corp.)"; + case "LSILOGIC": return "LSI Logic Storage Systems, Inc."; + case "LTO-CVE": return "Linear Tape - Open, Compliance Verification Entity"; + case "LUXPRO": return "Luxpro Corporation"; + case "MacroSAN": return "MacroSAN Technologies Co., Ltd."; + case "Malakite": return "Malachite Technologies (New VID is: Sandial)"; + case "MarcBoon": return "marcboon.com"; + case "Marner": return "Marner Storage Technologies, Inc."; + case "MARVELL": return "Marvell Semiconductor, Inc."; + case "Matrix": return "Matrix Orbital Corp."; + case "MATSHITA": return "Matsushita"; + case "MAXELL": return "Hitachi Maxell, Ltd."; + case "MAXIM-IC": return "Maxim Integrated Products"; + case "MaxOptix": return "Maxoptix Corp."; + case "MAXSTRAT": return "Maximum Strategy, Inc."; + case "MAXTOR": return "Maxtor Corp."; + case "MaXXan": return "MaXXan Systems, Inc."; + case "MAYCOM": return "maycom Co., Ltd."; + case "MBEAT": return "K-WON C&C Co.,Ltd"; + case "MCC": return "Measurement Computing Corporation"; + case "McDATA": return "McDATA Corporation"; + case "MCUBE": return "Mcube Technology Co., Ltd."; + case "MDI": return "Micro Design International, Inc."; + case "MEADE": return "Meade Instruments Corporation"; + case "mediamat": return "mediamatic"; + case "MegaElec": return "Mega Electronics Ltd"; + case "MEII": return "Mountain Engineering II, Inc."; + case "MELA": return "Mitsubishi Electronics America"; + case "MELCO": return "Mitsubishi Electric (Japan)"; + case "mellanox": return "Mellanox Technologies Ltd."; + case "MEMOREX": return "Memorex Telex Japan Ltd."; + case "MEMREL": return "Memrel Corporation"; + case "MEMTECH": return "MemTech Technology"; + case "Mendocin": return "Mendocino Software"; + case "MendoCno": return "Mendocino Software"; + case "MERIDATA": return "Oy Meridata Finland Ltd"; + case "METHODEI": return "Methode Electronics India pvt ltd"; + case "METRUM": return "Metrum, Inc."; + case "MHTL": return "Matsunichi Hi-Tech Limited"; + case "MICROBTX": return "Microbotics Inc."; + case "Microchp": return "Microchip Technology, Inc."; + case "MICROLIT": return "Microlite Corporation"; + case "MICRON": return "Micron Technology, Inc."; + case "MICROP": return "Micropolis"; + case "MICROTEK": return "Microtek Storage Corp"; + case "Minitech": return "Minitech (UK) Limited"; + case "Minolta": return "Minolta Corporation"; + case "MINSCRIB": return "Miniscribe"; + case "MiraLink": return "MiraLink Corporation"; + case "Mirifica": return "Mirifica s.r.l."; + case "MITSUMI": return "Mitsumi Electric Co., Ltd."; + case "MKM": return "Mitsubishi Kagaku Media Co., LTD."; + case "Mobii": return "Mobii Systems (Pty.) Ltd."; + case "MOL": return "Petrosoft Sdn. Bhd."; + case "MOSAID": return "Mosaid Technologies Inc."; + case "MOTOROLA": return "Motorola"; + case "MP-400": return "Daiwa Manufacturing Limited"; + case "MPC": return "MPC Corporation"; + case "MPCCORP": return "MPC Computers"; + case "MPEYE": return "Touchstone Technology Co., Ltd"; + case "MPIO": return "DKT Co.,Ltd"; + case "MPM": return "Mitsubishi Paper Mills, Ltd."; + case "MPMan": return "MPMan.com, Inc."; + case "MSFT": return "Microsoft Corporation"; + case "MSI": return "Micro-Star International Corp."; + case "MST": return "Morning Star Technologies, Inc."; + case "MSystems": return "M-Systems Flash Disk Pioneers"; + case "MTI": return "MTI Technology Corporation"; + case "MTNGATE": return "MountainGate Data Systems"; + case "MXI": return "Memory Experts International"; + case "nac": return "nac Image Technology Inc."; + case "NAGRA": return "Nagravision SA - Kudelski Group"; + case "NAI": return "North Atlantic Industries"; + case "NAKAMICH": return "Nakamichi Corporation"; + case "NatInst": return "National Instruments"; + case "NatSemi": return "National Semiconductor Corp."; + case "NCITS": return "InterNational Committee for Information Technology Standards (INCITS)"; + case "NCL": return "NCL America"; + case "NCR": return "NCR Corporation"; + case "NDBTECH": return "NDB Technologie Inc."; + case "Neartek": return "Neartek, Inc."; + case "NEC": return "NEC"; + case "NETAPP": return "NetApp, Inc. (was Network Appliance)"; + case "NetBSD": return "The NetBSD Foundation"; + case "Netcom": return "Netcom Storage"; + case "NETENGIN": return "NetEngine, Inc."; + case "NEWISYS": return "Newisys Data Storage"; + case "Newtech": return "Newtech Co., Ltd."; + case "NEXSAN": return "Nexsan Technologies, Ltd."; + case "NFINIDAT": return "Infinidat Ltd."; + case "NHR": return "NH Research, Inc."; + case "Nike": return "Nike, Inc."; + case "Nimble": return "Nimble Storage"; + case "NISCA": return "NISCA Inc."; + case "NISHAN": return "Nishan Systems Inc."; + case "Nitz": return "Nitz Associates, Inc."; + case "NKK": return "NKK Corp."; + case "NRC": return "Nakamichi Research Corporation"; + case "NSD": return "Nippon Systems Development Co.,Ltd."; + case "NSM": return "NSM Jukebox GmbH"; + case "nStor": return "nStor Technologies, Inc."; + case "NT": return "Northern Telecom"; + case "NUCONNEX": return "NuConnex"; + case "NUSPEED": return "NuSpeed, Inc."; + case "NVIDIA": return "NVIDIA Corporation"; + case "NVMe": return "NVM Express Working Group"; + case "OAI": return "Optical Access International"; + case "OCE": return "Oce Graphics"; + case "ODS": return "ShenZhen DCS Group Co.,Ltd"; + case "OHDEN": return "Ohden Co., Ltd."; + case "OKI": return "OKI Electric Industry Co.,Ltd (Japan)"; + case "Olidata": return "Olidata S.p.A."; + case "OMI": return "Optical Media International"; + case "OMNIFI": return "Rockford Corporation - Omnifi Media"; + case "OMNIS": return "OMNIS Company (FRANCE)"; + case "Ophidian": return "Ophidian Designs"; + case "opslag": return "Tyrone Systems"; + case "Optelec": return "Optelec BV"; + case "Optiarc": return "Sony Optiarc Inc."; + case "OPTIMEM": return "Cipher/Optimem"; + case "OPTOTECH": return "Optotech"; + case "ORACLE": return "Oracle Corporation"; + case "ORANGE": return "Orange Micro, Inc."; + case "ORCA": return "Orca Technology"; + case "Origin": return "Origin Energy"; + case "OSI": return "Optical Storage International"; + case "OSNEXUS": return "OS NEXUS, Inc."; + case "OTL": return "OTL Engineering"; + case "OVERLAND": return "Overland Storage Inc."; + case "pacdigit": return "Pacific Digital Corp"; + case "Packard": return "Parkard Bell"; + case "Panasas": return "Panasas, Inc."; + case "PARALAN": return "Paralan Corporation"; + case "PASCOsci": return "Pasco Scientific"; + case "PATHLGHT": return "Pathlight Technology, Inc."; + case "PCS": return "Pro Charging Systems, LLC"; + case "PerStor": return "Perstor"; + case "PERTEC": return "Pertec Peripherals Corporation"; + case "PFTI": return "Performance Technology Inc."; + case "PFU": return "PFU Limited"; + case "Phigment": return "Phigment Technologies"; + case "PHILIPS": return "Philips Electronics"; + case "PICO": return "Packard Instrument Company"; + case "PIK": return "TECHNILIENT & MCS"; + case "Pillar": return "Pillar Data Systems"; + case "PIONEER": return "Pioneer Electronic Corp."; + case "Pirus": return "Pirus Networks"; + case "PIVOT3": return "Pivot3, Inc."; + case "PLASMON": return "Plasmon Data"; + case "Pliant": return "Pliant Technology, Inc."; + case "PMCSIERA": return "PMC-Sierra"; + case "PME": return "Precision Measurement Engineering"; + case "PNNMed": return "PNN Medical SA"; + case "POKEN": return "Poken SA"; + case "POLYTRON": return "PT. HARTONO ISTANA TEKNOLOGI"; + case "PRAIRIE": return "PrairieTek"; + case "PREPRESS": return "PrePRESS Solutions"; + case "PRESOFT": return "PreSoft Architects"; + case "PRESTON": return "Preston Scientific"; + case "PRIAM": return "Priam"; + case "PRIMAGFX": return "Primagraphics Ltd"; + case "PRIMOS": return "Primos"; + case "PROCOM": return "Procom Technology"; + case "PROLIFIC": return "Prolific Technology Inc."; + case "PROMISE": return "PROMISE TECHNOLOGY, Inc"; + case "PROSTOR": return "ProStor Systems, Inc."; + case "PROSUM": return "PROSUM"; + case "PROWARE": return "Proware Technology Corp."; + case "PTI": return "Peripheral Technology Inc."; + case "PTICO": return "Pacific Technology International"; + case "PURE": return "PURE Storage"; + case "Qi-Hardw": return "Qi Hardware"; + case "QIC": return "Quarter-Inch Cartridge Drive Standards, Inc."; + case "QLogic": return "QLogic Corporation"; + case "QNAP": return "QNAP Systems"; + case "Qsan": return "QSAN Technology, Inc."; + case "QUALSTAR": return "Qualstar"; + case "QUANTEL": return "Quantel Ltd."; + case "QUANTUM": return "Quantum Corp."; + case "QUIX": return "Quix Computerware AG"; + case "R-BYTE": return "R-Byte, Inc."; + case "RACALREC": return "Racal Recorders"; + case "RADITEC": return "Radikal Technologies Deutschland GmbH"; + case "RADSTONE": return "Radstone Technology"; + case "RAIDINC": return "RAID Inc."; + case "RASSYS": return "Rasilient Systems Inc."; + case "RASVIA": return "Rasvia Systems, Inc."; + case "rave-mp": return "Go Video"; + case "RDKMSTG": return "MMS Dipl. Ing. Rolf-Dieter Klein"; + case "RDStor": return "Rorke China"; + case "Readboy": return "Readboy Ltd Co."; + case "Realm": return "Realm Systems"; + case "realtek": return "Realtek Semiconductor Corp."; + case "REDUXIO": return "Reduxio Systems Ltd."; + case "rehanltd": return "Rehan Electronics Ltd"; + case "REKA": return "REKA HEALTH PTE LTD"; + case "RELDATA": return "RELDATA Inc"; + case "RENAGmbH": return "RENA GmbH"; + case "ReThinkM": return "RETHINK MEDICAL, INC"; + case "Revivio": return "Revivio, Inc."; + case "RGBLaser": return "RGB Lasersysteme GmbH"; + case "RGI": return "Raster Graphics, Inc."; + case "RHAPSODY": return "Rhapsody Networks, Inc."; + case "RHS": return "Racal-Heim Systems GmbH"; + case "RICOH": return "Ricoh"; + case "RODIME": return "Rodime"; + case "Rorke": return "RD DATA Technology (ShenZhen) Limited"; + case "Royaltek": return "RoyalTek company Ltd."; + case "RPS": return "RPS"; + case "RTI": return "Reference Technology"; + case "S-D": return "Sauer-Danfoss"; + case "S-flex": return "Storageflex Inc"; + case "S-SYSTEM": return "S-SYSTEM"; + case "S1": return "storONE"; + case "SAMSUNG": return "Samsung Electronics Co., Ltd."; + case "SAN": return "Storage Area Networks, Ltd."; + case "Sandial": return "Sandial Systems, Inc."; + case "SanDisk": return "SanDisk Corporation"; + case "SANKYO": return "Sankyo Seiki"; + case "SANRAD": return "SANRAD Inc."; + case "SANYO": return "SANYO Electric Co., Ltd."; + case "SC.Net": return "StorageConnections.Net"; + case "SCALE": return "Scale Computing, Inc."; + case "SCIENTEK": return "SCIENTEK CORP"; + case "SCInc.": return "Storage Concepts, Inc."; + case "SCREEN": return "Dainippon Screen Mfg. Co., Ltd."; + case "SDI": return "Storage Dimensions, Inc."; + case "SDS": return "Solid Data Systems"; + case "SEAC": return "SeaChange International, Inc."; + case "SEAGATE": return "Seagate"; + case "SEAGRAND": return "SEAGRAND In Japan"; + case "Seanodes": return "Seanodes"; + case "Sec. Key": return "SecureKey Technologies Inc."; + case "SEQUOIA": return "Sequoia Advanced Technologies, Inc."; + case "SGI": return "Silicon Graphics International"; + case "Shannon": return "Shannon Systems Co., Ltd."; + case "Shinko": return "Shinko Electric Co., Ltd."; + case "SIEMENS": return "Siemens"; + case "SigmaTel": return "SigmaTel, Inc."; + case "SII": return "Seiko Instruments Inc."; + case "SIMPLE": return "SimpleTech, Inc."; + case "SIVMSD": return "IMAGO SOFTWARE SL"; + case "SKhynix": return "SK hynix Inc."; + case "SLCNSTOR": return "SiliconStor, Inc."; + case "SLI": return "Sierra Logic, Inc."; + case "SMCI": return "Super Micro Computer, Inc."; + case "SmrtStor": return "Smart Storage Systems"; + case "SMS": return "Scientific Micro Systems/OMTI"; + case "SMSC": return "SMSC Storage, Inc."; + case "SMX": return "Smartronix, Inc."; + case "SNYSIDE": return "Sunnyside Computing Inc."; + case "SoftLock": return "Softlock Digital Security Provider"; + case "SolidFir": return "SolidFire, Inc."; + case "SONIC": return "Sonic Solutions"; + case "SoniqCas": return "SoniqCast"; + case "SONY": return "Sony Corporation Japan"; + case "SOUL": return "Soul Storage Technology (Wuxi) Co., Ltd"; + case "SPD": return "Storage Products Distribution, Inc."; + case "SPECIAL": return "Special Computing Co."; + case "SPECTRA": return "Spectra Logic, a Division of Western Automation Labs, Inc."; + case "SPERRY": return "Sperry"; + case "Spintso": return "Spintso International AB"; + case "STARBORD": return "Starboard Storage Systems, Inc."; + case "STARWIND": return "StarWind Software, Inc."; + case "STEC": return "STEC, Inc."; + case "Sterling": return "Sterling Diagnostic Imaging, Inc."; + case "STK": return "Storage Technology Corporation"; + case "STNWOOD": return "Stonewood Group"; + case "STONEFLY": return "StoneFly Networks, Inc."; + case "STOR": return "StorageNetworks, Inc."; + case "STORAPP": return "StorageApps, Inc."; + case "STORCIUM": return "Intelligent Systems Services Inc."; + case "STORCOMP": return "Storage Computer Corporation"; + case "STORM": return "Storm Technology, Inc."; + case "StorMagc": return "StorMagic"; + case "Stratus": return "Stratus Technologies"; + case "StrmLgc": return "StreamLogic Corp."; + case "SUMITOMO": return "Sumitomo Electric Industries, Ltd."; + case "SUN": return "Sun Microsystems, Inc."; + case "SUNCORP": return "SunCorporation"; + case "suntx": return "Suntx System Co., Ltd"; + case "SUSE": return "SUSE Linux"; + case "Swinxs": return "Swinxs BV"; + case "SYMANTEC": return "Symantec Corporation"; + case "SYMBIOS": return "Symbios Logic Inc."; + case "SYMWAVE": return "Symwave, Inc."; + case "SYNCSORT": return "Syncsort Incorporated"; + case "SYNERWAY": return "Synerway"; + case "SYNOLOGY": return "Synology, Inc."; + case "SyQuest": return "SyQuest Technology, Inc."; + case "SYSGEN": return "Sysgen"; + case "T-MITTON": return "Transmitton England"; + case "T-MOBILE": return "T-Mobile USA, Inc."; + case "T11": return "INCITS Technical Committee T11"; + case "TALARIS": return "Talaris Systems, Inc."; + case "TALLGRAS": return "Tallgrass Technologies"; + case "TANDBERG": return "Tandberg Data A/S"; + case "TANDEM": return "Tandem"; + case "TANDON": return "Tandon"; + case "TCL": return "TCL Shenzhen ASIC MIcro-electronics Ltd"; + case "TDK": return "TDK Corporation"; + case "TEAC": return "TEAC Japan"; + case "TECOLOTE": return "Tecolote Designs"; + case "TEGRA": return "Tegra Varityper"; + case "Teilch": return "Teilch"; + case "Tek": return "Tektronix"; + case "TELLERT": return "Tellert Elektronik GmbH"; + case "TENTIME": return "Laura Technologies, Inc."; + case "TFDATACO": return "TimeForge"; + case "TGEGROUP": return "TGE Group Co.,LTD."; + case "Thecus": return "Thecus Technology Corp."; + case "TI-DSG": return "Texas Instruments"; + case "TiGi": return "TiGi Corporation"; + case "TILDESGN": return "Tildesign bv"; + case "Tite": return "Tite Technology Limited"; + case "TKS Inc.": return "TimeKeeping Systems, Inc."; + case "TLMKS": return "Telemakus LLC"; + case "TMS": return "Texas Memory Systems, Inc."; + case "TMS100": return "TechnoVas"; + case "TOLISGRP": return "The TOLIS Group"; + case "TOSHIBA": return "Toshiba Japan"; + case "TOYOU": return "TOYOU FEIJI ELECTRONICS CO.,LTD."; + case "Tracker": return "Tracker, LLC"; + case "TRIOFLEX": return "Trioflex Oy"; + case "TRIPACE": return "Tripace"; + case "TRLogger": return "TrueLogger Ltd."; + case "TROIKA": return "Troika Networks, Inc."; + case "TRULY": return "TRULY Electronics MFG. LTD."; + case "TRUSTED": return "Trusted Data Corporation"; + case "TSSTcorp": return "Toshiba Samsung Storage Technology Corporation"; + case "TZM": return "TZ Medical"; + case "UD-DVR": return "Bigstone Project."; + case "UDIGITAL": return "United Digital Limited"; + case "UIT": return "United Infomation Technology"; + case "ULTRA": return "UltraStor Corporation"; + case "UNISTOR": return "Unistor Networks, Inc."; + case "UNISYS": return "Unisys"; + case "USCORE": return "Underscore, Inc."; + case "USDC": return "US Design Corp."; case "Top VASCO": return "Vasco Data Security"; - case "VDS": return "Victor Data Systems Co., Ltd."; - case "VELDANA": return "VELDANA MEDICAL SA"; - case "VENTANA": return "Ventana Medical Systems"; - case "Verari": return "Verari Systems, Inc."; - case "VERBATIM": return "Verbatim Corporation"; - case "Vercet": return "Vercet LLC"; - case "VERITAS": return "VERITAS Software Corporation"; - case "Vexata": return "Vexata Inc"; - case "VEXCEL": return "VEXCEL IMAGING GmbH"; - case "VICOMSL1": return "Vicom Systems, Inc."; - case "VicomSys": return "Vicom Systems, Inc."; - case "VIDEXINC": return "Videx, Inc."; - case "VIOLIN": return "Violin Memory, Inc."; - case "VIRIDENT": return "Virident Systems, Inc."; - case "VITESSE": return "Vitesse Semiconductor Corporation"; - case "VIXEL": return "Vixel Corporation"; - case "VLS": return "Van Lent Systems BV"; - case "VMAX": return "VMAX Technologies Corp."; - case "VMware": return "VMware Inc."; - case "Vobis": return "Vobis Microcomputer AG"; - case "VOLTAIRE": return "Voltaire Ltd."; - case "VRC": return "Vermont Research Corp."; - case "VRugged": return "Vanguard Rugged Storage"; - case "VTGadget": return "Vermont Gadget Company"; - case "Waitec": return "Waitec NV"; - case "WangDAT": return "WangDAT"; - case "WANGTEK": return "Wangtek"; - case "Wasabi": return "Wasabi Systems"; - case "WAVECOM": return "Wavecom"; - case "WD": return "Western Digital Corporation"; - case "WDC": return "Western Digital Corporation"; - case "WDIGTL": return "Western Digital"; - case "WDTI": return "Western Digital Technologies, Inc."; - case "WEARNES": return "Wearnes Technology Corporation"; - case "WeeraRes": return "Weera Research Pte Ltd"; - case "Wildflwr": return "Wildflower Technologies, Inc."; - case "WSC0001": return "Wisecom, Inc."; - case "X3": return "InterNational Committee for Information Technology Standards (INCITS)"; - case "XEBEC": return "Xebec Corporation"; - case "XENSRC": return "XenSource, Inc."; - case "Xerox": return "Xerox Corporation"; - case "XIOtech": return "XIOtech Corporation"; - case "XIRANET": return "Xiranet Communications GmbH"; - case "XIV": return "XIV"; - case "XtremIO": return "XtremIO"; - case "XYRATEX": return "Xyratex"; - case "YINHE": return "NUDT Computer Co."; - case "YIXUN": return "Yixun Electronic Co.,Ltd."; - case "YOTTA": return "YottaYotta, Inc."; - case "Zarva": return "Zarva Digital Technology Co., Ltd."; - case "ZETTA": return "Zetta Systems, Inc."; - case "ZTE": return "ZTE Corporation"; - case "ZVAULT": return "Zetavault"; - default: return scsiVendorString; + case "VDS": return "Victor Data Systems Co., Ltd."; + case "VELDANA": return "VELDANA MEDICAL SA"; + case "VENTANA": return "Ventana Medical Systems"; + case "Verari": return "Verari Systems, Inc."; + case "VERBATIM": return "Verbatim Corporation"; + case "Vercet": return "Vercet LLC"; + case "VERITAS": return "VERITAS Software Corporation"; + case "Vexata": return "Vexata Inc"; + case "VEXCEL": return "VEXCEL IMAGING GmbH"; + case "VICOMSL1": return "Vicom Systems, Inc."; + case "VicomSys": return "Vicom Systems, Inc."; + case "VIDEXINC": return "Videx, Inc."; + case "VIOLIN": return "Violin Memory, Inc."; + case "VIRIDENT": return "Virident Systems, Inc."; + case "VITESSE": return "Vitesse Semiconductor Corporation"; + case "VIXEL": return "Vixel Corporation"; + case "VLS": return "Van Lent Systems BV"; + case "VMAX": return "VMAX Technologies Corp."; + case "VMware": return "VMware Inc."; + case "Vobis": return "Vobis Microcomputer AG"; + case "VOLTAIRE": return "Voltaire Ltd."; + case "VRC": return "Vermont Research Corp."; + case "VRugged": return "Vanguard Rugged Storage"; + case "VTGadget": return "Vermont Gadget Company"; + case "Waitec": return "Waitec NV"; + case "WangDAT": return "WangDAT"; + case "WANGTEK": return "Wangtek"; + case "Wasabi": return "Wasabi Systems"; + case "WAVECOM": return "Wavecom"; + case "WD": return "Western Digital Corporation"; + case "WDC": return "Western Digital Corporation"; + case "WDIGTL": return "Western Digital"; + case "WDTI": return "Western Digital Technologies, Inc."; + case "WEARNES": return "Wearnes Technology Corporation"; + case "WeeraRes": return "Weera Research Pte Ltd"; + case "Wildflwr": return "Wildflower Technologies, Inc."; + case "WSC0001": return "Wisecom, Inc."; + case "X3": return "InterNational Committee for Information Technology Standards (INCITS)"; + case "XEBEC": return "Xebec Corporation"; + case "XENSRC": return "XenSource, Inc."; + case "Xerox": return "Xerox Corporation"; + case "XIOtech": return "XIOtech Corporation"; + case "XIRANET": return "Xiranet Communications GmbH"; + case "XIV": return "XIV"; + case "XtremIO": return "XtremIO"; + case "XYRATEX": return "Xyratex"; + case "YINHE": return "NUDT Computer Co."; + case "YIXUN": return "Yixun Electronic Co.,Ltd."; + case "YOTTA": return "YottaYotta, Inc."; + case "Zarva": return "Zarva Digital Technology Co., Ltd."; + case "ZETTA": return "Zetta Systems, Inc."; + case "ZTE": return "ZTE Corporation"; + case "ZVAULT": return "Zetavault"; + default: return scsiVendorString; } } } diff --git a/SecureDigital/CID.cs b/SecureDigital/CID.cs index 257e441b9..a5e6025a7 100644 --- a/SecureDigital/CID.cs +++ b/SecureDigital/CID.cs @@ -41,13 +41,13 @@ namespace DiscImageChef.Decoders.SecureDigital [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] public class CID { - public byte Manufacturer; + public byte Manufacturer; public string ApplicationID; public string ProductName; - public byte ProductRevision; - public uint ProductSerialNumber; + public byte ProductRevision; + public uint ProductSerialNumber; public ushort ManufacturingDate; - public byte CRC; + public byte CRC; } [SuppressMessage("ReSharper", "InconsistentNaming")] @@ -79,16 +79,16 @@ namespace DiscImageChef.Decoders.SecureDigital CID cid = new CID { - Manufacturer = response[0], - ProductRevision = response[8], + Manufacturer = response[0], + ProductRevision = response[8], ProductSerialNumber = BitConverter.ToUInt32(response, 9), - ManufacturingDate = (ushort)(((response[13] & 0x0F) << 4) + response[14]), - CRC = (byte)((response[15] & 0xFE) >> 1) + ManufacturingDate = (ushort)(((response[13] & 0x0F) << 4) + response[14]), + CRC = (byte)((response[15] & 0xFE) >> 1) }; byte[] tmp = new byte[2]; Array.Copy(response, 1, tmp, 0, 2); cid.ApplicationID = StringHandlers.CToString(tmp); - tmp = new byte[5]; + tmp = new byte[5]; Array.Copy(response, 3, tmp, 0, 5); cid.ProductName = StringHandlers.CToString(tmp); @@ -109,7 +109,8 @@ namespace DiscImageChef.Decoders.SecureDigital cid.ProductRevision & 0x0F).AppendLine(); sb.AppendFormat("\tProduct serial number: {0}", cid.ProductSerialNumber).AppendLine(); sb.AppendFormat("\tDevice manufactured month {0} of {1}", (cid.ManufacturingDate & 0xF00) >> 8, - (cid.ManufacturingDate & 0xFF) + 2000).AppendLine(); + (cid.ManufacturingDate & 0xFF) + 2000) + .AppendLine(); sb.AppendFormat("\tCID CRC: 0x{0:X2}", cid.CRC).AppendLine(); return sb.ToString(); diff --git a/SecureDigital/CSD.cs b/SecureDigital/CSD.cs index 2f76c0e39..cc7e5cd0d 100644 --- a/SecureDigital/CSD.cs +++ b/SecureDigital/CSD.cs @@ -41,35 +41,35 @@ namespace DiscImageChef.Decoders.SecureDigital [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] public class CSD { - public byte Structure; - public byte TAAC; - public byte NSAC; - public byte Speed; + public byte Structure; + public byte TAAC; + public byte NSAC; + public byte Speed; public ushort Classes; - public byte ReadBlockLength; - public bool ReadsPartialBlocks; - public bool WriteMisalignment; - public bool ReadMisalignment; - public bool DSRImplemented; - public uint Size; - public byte ReadCurrentAtVddMin; - public byte ReadCurrentAtVddMax; - public byte WriteCurrentAtVddMin; - public byte WriteCurrentAtVddMax; - public byte SizeMultiplier; - public bool EraseBlockEnable; - public byte EraseSectorSize; - public byte WriteProtectGroupSize; - public bool WriteProtectGroupEnable; - public byte WriteSpeedFactor; - public byte WriteBlockLength; - public bool WritesPartialBlocks; - public bool FileFormatGroup; - public bool Copy; - public bool PermanentWriteProtect; - public bool TemporaryWriteProtect; - public byte FileFormat; - public byte CRC; + public byte ReadBlockLength; + public bool ReadsPartialBlocks; + public bool WriteMisalignment; + public bool ReadMisalignment; + public bool DSRImplemented; + public uint Size; + public byte ReadCurrentAtVddMin; + public byte ReadCurrentAtVddMax; + public byte WriteCurrentAtVddMin; + public byte WriteCurrentAtVddMax; + public byte SizeMultiplier; + public bool EraseBlockEnable; + public byte EraseSectorSize; + public byte WriteProtectGroupSize; + public bool WriteProtectGroupEnable; + public byte WriteSpeedFactor; + public byte WriteBlockLength; + public bool WritesPartialBlocks; + public bool FileFormatGroup; + public bool Copy; + public bool PermanentWriteProtect; + public bool TemporaryWriteProtect; + public byte FileFormat; + public byte CRC; } [SuppressMessage("ReSharper", "InconsistentNaming")] @@ -100,39 +100,40 @@ namespace DiscImageChef.Decoders.SecureDigital CSD csd = new CSD { - Structure = (byte)((response[0] & 0xC0) >> 6), - TAAC = response[1], - NSAC = response[2], - Speed = response[3], - Classes = (ushort)((response[4] << 4) + ((response[5] & 0xF0) >> 4)), - ReadBlockLength = (byte)(response[5] & 0x0F), - ReadsPartialBlocks = (response[6] & 0x80) == 0x80, - WriteMisalignment = (response[6] & 0x40) == 0x40, - ReadMisalignment = (response[6] & 0x20) == 0x20, - DSRImplemented = (response[6] & 0x10) == 0x10, - EraseBlockEnable = (response[10] & 0x40) == 0x40, - EraseSectorSize = (byte)(((response[10] & 0x3F) << 1) + ((response[11] & 0x80) >> 7)), - WriteProtectGroupSize = (byte)(response[11] & 0x7F), - WriteProtectGroupEnable = (response[12] & 0x80) == 0x80, - WriteSpeedFactor = (byte)((response[12] & 0x1C) >> 2), - WriteBlockLength = (byte)(((response[12] & 0x03) << 2) + ((response[13] & 0xC0) >> 6)), - WritesPartialBlocks = (response[13] & 0x20) == 0x20, - FileFormatGroup = (response[14] & 0x80) == 0x80, - Copy = (response[14] & 0x40) == 0x40, - PermanentWriteProtect = (response[14] & 0x20) == 0x20, - TemporaryWriteProtect = (response[14] & 0x10) == 0x10, - FileFormat = (byte)((response[14] & 0x0C) >> 2), - CRC = (byte)((response[15] & 0xFE) >> 1) + Structure = (byte)((response[0] & 0xC0) >> 6), + TAAC = response[1], + NSAC = response[2], + Speed = response[3], + Classes = (ushort)((response[4] << 4) + ((response[5] & 0xF0) >> 4)), + ReadBlockLength = (byte)(response[5] & 0x0F), + ReadsPartialBlocks = (response[6] & 0x80) == 0x80, + WriteMisalignment = (response[6] & 0x40) == 0x40, + ReadMisalignment = (response[6] & 0x20) == 0x20, + DSRImplemented = (response[6] & 0x10) == 0x10, + EraseBlockEnable = (response[10] & 0x40) == 0x40, + EraseSectorSize = (byte)(((response[10] & 0x3F) << 1) + ((response[11] & 0x80) >> 7)), + WriteProtectGroupSize = (byte)(response[11] & 0x7F), + WriteProtectGroupEnable = (response[12] & 0x80) == 0x80, + WriteSpeedFactor = (byte)((response[12] & 0x1C) >> 2), + WriteBlockLength = (byte)(((response[12] & 0x03) << 2) + ((response[13] & 0xC0) >> 6)), + WritesPartialBlocks = (response[13] & 0x20) == 0x20, + FileFormatGroup = (response[14] & 0x80) == 0x80, + Copy = (response[14] & 0x40) == 0x40, + PermanentWriteProtect = (response[14] & 0x20) == 0x20, + TemporaryWriteProtect = (response[14] & 0x10) == 0x10, + FileFormat = (byte)((response[14] & 0x0C) >> 2), + CRC = (byte)((response[15] & 0xFE) >> 1) }; if(csd.Structure == 0) { - csd.Size = (ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6)); - csd.ReadCurrentAtVddMin = (byte)((response[8] & 0x38) >> 3); - csd.ReadCurrentAtVddMax = (byte)(response[8] & 0x07); + csd.Size = + (ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6)); + csd.ReadCurrentAtVddMin = (byte)((response[8] & 0x38) >> 3); + csd.ReadCurrentAtVddMax = (byte)(response[8] & 0x07); csd.WriteCurrentAtVddMin = (byte)((response[9] & 0xE0) >> 5); csd.WriteCurrentAtVddMax = (byte)((response[9] & 0x1C) >> 2); - csd.SizeMultiplier = (byte)(((response[9] & 0x03) << 1) + ((response[10] & 0x80) >> 7)); + csd.SizeMultiplier = (byte)(((response[9] & 0x03) << 1) + ((response[10] & 0x80) >> 7)); } else csd.Size = (uint)(((response[7] & 0x3F) << 16) + (response[8] << 8) + response[9]); @@ -145,7 +146,7 @@ namespace DiscImageChef.Decoders.SecureDigital double unitFactor = 0; double multiplier = 0; - string unit = ""; + string unit = ""; StringBuilder sb = new StringBuilder(); sb.AppendLine("SecureDigital Device Specific Data Register:"); @@ -162,35 +163,35 @@ namespace DiscImageChef.Decoders.SecureDigital switch(csd.TAAC & 0x07) { case 0: - unit = "ns"; + unit = "ns"; unitFactor = 1; break; case 1: - unit = "ns"; + unit = "ns"; unitFactor = 10; break; case 2: - unit = "ns"; + unit = "ns"; unitFactor = 100; break; case 3: - unit = "μs"; + unit = "μs"; unitFactor = 1; break; case 4: - unit = "μs"; + unit = "μs"; unitFactor = 10; break; case 5: - unit = "μs"; + unit = "μs"; unitFactor = 100; break; case 6: - unit = "ms"; + unit = "ms"; unitFactor = 1; break; case 7: - unit = "ms"; + unit = "ms"; unitFactor = 10; break; } @@ -268,7 +269,7 @@ namespace DiscImageChef.Decoders.SecureDigital unitFactor = 100; break; default: - unit = "unknown"; + unit = "unknown"; unitFactor = 0; break; } @@ -329,7 +330,9 @@ namespace DiscImageChef.Decoders.SecureDigital sb.AppendFormat("\tDevice's transfer speed: {0}{1}", result, unit).AppendLine(); unit = ""; - for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1) if((csd.Classes & mask) == mask) unit += $" {cl}"; + for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1) + if((csd.Classes & mask) == mask) + unit += $" {cl}"; sb.AppendFormat("\tDevice support command classes {0}", unit).AppendLine(); sb.AppendFormat("\tRead block length is {0} bytes", Math.Pow(2, csd.ReadBlockLength)).AppendLine(); @@ -347,7 +350,8 @@ namespace DiscImageChef.Decoders.SecureDigital sb.AppendFormat("\tDevice has {0} blocks", (int)result).AppendLine(); result = (csd.Size + 1) * Math.Pow(2, csd.SizeMultiplier + 2) * Math.Pow(2, csd.ReadBlockLength); - if(result > 1073741824) sb.AppendFormat("\tDevice has {0} GiB", result / 1073741824.0).AppendLine(); + if(result > 1073741824) + sb.AppendFormat("\tDevice has {0} GiB", result / 1073741824.0).AppendLine(); else if(result > 1048576) sb.AppendFormat("\tDevice has {0} MiB", result / 1048576.0).AppendLine(); else if(result > 1024) sb.AppendFormat("\tDevice has {0} KiB", result / 1024.0).AppendLine(); else sb.AppendFormat("\tDevice has {0} bytes", result).AppendLine(); diff --git a/SecureDigital/OCR.cs b/SecureDigital/OCR.cs index 2c387dfce..0b29a4713 100644 --- a/SecureDigital/OCR.cs +++ b/SecureDigital/OCR.cs @@ -67,20 +67,20 @@ namespace DiscImageChef.Decoders.SecureDigital { return new OCR { - PowerUp = (response & 0x80000000) == 0x80000000, - CCS = (response & 0x40000000) == 0x40000000, - UHS = (response & 0x20000000) == 0x20000000, - OneEight = (response & 0x01000000) == 0x01000000, - ThreeFive = (response & 0x00800000) == 0x00800000, - ThreeFour = (response & 0x00400000) == 0x00400000, + PowerUp = (response & 0x80000000) == 0x80000000, + CCS = (response & 0x40000000) == 0x40000000, + UHS = (response & 0x20000000) == 0x20000000, + OneEight = (response & 0x01000000) == 0x01000000, + ThreeFive = (response & 0x00800000) == 0x00800000, + ThreeFour = (response & 0x00400000) == 0x00400000, ThreeThree = (response & 0x00200000) == 0x00200000, - ThreeTwo = (response & 0x00100000) == 0x00100000, - ThreeOne = (response & 0x00080000) == 0x00080000, - ThreeZero = (response & 0x00040000) == 0x00040000, - TwoNine = (response & 0x00020000) == 0x00020000, - TwoEight = (response & 0x00010000) == 0x00010000, - TwoSeven = (response & 0x00008000) == 0x00008000, - LowPower = (response & 0x00000080) == 0x00000080 + ThreeTwo = (response & 0x00100000) == 0x00100000, + ThreeOne = (response & 0x00080000) == 0x00080000, + ThreeZero = (response & 0x00040000) == 0x00040000, + TwoNine = (response & 0x00020000) == 0x00020000, + TwoEight = (response & 0x00010000) == 0x00010000, + TwoSeven = (response & 0x00008000) == 0x00008000, + LowPower = (response & 0x00000080) == 0x00000080 }; } diff --git a/SecureDigital/SCR.cs b/SecureDigital/SCR.cs index 5e9b38a3b..3c4f9a9df 100644 --- a/SecureDigital/SCR.cs +++ b/SecureDigital/SCR.cs @@ -42,16 +42,16 @@ namespace DiscImageChef.Decoders.SecureDigital [SuppressMessage("ReSharper", "NotAccessedField.Global")] public class SCR { - public byte Structure; - public byte Spec; - public bool DataStatusAfterErase; - public byte Security; - public byte BusWidth; - public bool Spec3; - public byte ExtendedSecurity; - public bool Spec4; - public byte SpecX; - public byte CommandSupport; + public byte Structure; + public byte Spec; + public bool DataStatusAfterErase; + public byte Security; + public byte BusWidth; + public bool Spec3; + public byte ExtendedSecurity; + public bool Spec4; + public byte SpecX; + public byte CommandSupport; public byte[] ManufacturerReserved; } @@ -79,16 +79,16 @@ namespace DiscImageChef.Decoders.SecureDigital SCR scr = new SCR { - Structure = (byte)((response[0] & 0xF0) >> 4), - Spec = (byte)(response[0] & 0x0F), - DataStatusAfterErase = (response[1] & 0x80) == 0x80, - Security = (byte)((response[1] & 0x70) >> 4), - BusWidth = (byte)(response[1] & 0x0F), - Spec3 = (response[2] & 0x80) == 0x80, - ExtendedSecurity = (byte)((response[2] & 0x78) >> 3), - Spec4 = (response[2] & 0x04) == 0x04, - SpecX = (byte)(((response[2] & 0x03) << 2) + ((response[3] & 0xC0) >> 6)), - CommandSupport = (byte)(response[3] & 0x0F), + Structure = (byte)((response[0] & 0xF0) >> 4), + Spec = (byte)(response[0] & 0x0F), + DataStatusAfterErase = (response[1] & 0x80) == 0x80, + Security = (byte)((response[1] & 0x70) >> 4), + BusWidth = (byte)(response[1] & 0x0F), + Spec3 = (response[2] & 0x80) == 0x80, + ExtendedSecurity = (byte)((response[2] & 0x78) >> 3), + Spec4 = (response[2] & 0x04) == 0x04, + SpecX = (byte)(((response[2] & 0x03) << 2) + ((response[3] & 0xC0) >> 6)), + CommandSupport = (byte)(response[3] & 0x0F), ManufacturerReserved = new byte[4] }; Array.Copy(response, 4, scr.ManufacturerReserved, 0, 4); @@ -119,8 +119,8 @@ namespace DiscImageChef.Decoders.SecureDigital sb.AppendLine("\tDevice follows SecureDigital Physical Layer Specification version 5.xx"); else sb - .AppendFormat("\tDevice follows SecureDigital Physical Layer Specification with unknown version {0}.{1}.{2}.{3}", - scr.Spec, scr.Spec3, scr.Spec4, scr.SpecX).AppendLine(); + .AppendFormat("\tDevice follows SecureDigital Physical Layer Specification with unknown version {0}.{1}.{2}.{3}", + scr.Spec, scr.Spec3, scr.Spec4, scr.SpecX).AppendLine(); switch(scr.Security) { case 0: diff --git a/SecureDigital/VendorString.cs b/SecureDigital/VendorString.cs index 545e0f532..dbea02c6c 100644 --- a/SecureDigital/VendorString.cs +++ b/SecureDigital/VendorString.cs @@ -39,7 +39,7 @@ namespace DiscImageChef.Decoders.SecureDigital switch(sdVendorId) { case 0xAA: return "QEMU"; - default: return $"Unknown manufacturer ID 0x{sdVendorId:X2}"; + default: return $"Unknown manufacturer ID 0x{sdVendorId:X2}"; } } } diff --git a/Sega/CD.cs b/Sega/CD.cs index 57b3af001..862c7ddf0 100644 --- a/Sega/CD.cs +++ b/Sega/CD.cs @@ -49,9 +49,11 @@ namespace DiscImageChef.Decoders.Sega public struct IPBin { /// Must be "SEGADISCSYSTEM " or "SEGADATADISC " or "SEGAOS " - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] SegaHardwareID; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] SegaHardwareID; /// 0x010, Varies - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] public byte[] volume_name; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] + public byte[] volume_name; /// 0x01B, 0x00 public byte spare_space1; /// 0x01C, Volume version in BCD. <100 = Prerelease. @@ -59,7 +61,8 @@ namespace DiscImageChef.Decoders.Sega /// 0x01E, Bit 0 = 1 => CD-ROM. Rest should be 0. public ushort volume_type; /// 0x020, Unknown, varies! - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] public byte[] system_name; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] + public byte[] system_name; /// 0x02B, 0x00 public byte spare_space2; /// 0x02C, Should be 1 @@ -83,33 +86,46 @@ namespace DiscImageChef.Decoders.Sega /// 0x04C, System program work RAM size in bytes public uint sp_work_ram_size; /// 0x050, MMDDYYYY - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] release_date; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] release_date; /// 0x058, Seems to be all 0x20s - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] public byte[] unknown1; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] + public byte[] unknown1; /// 0x05F, 0x00 ? public byte spare_space4; /// 0x060, System Reserved Area - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 160)] public byte[] system_reserved; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 160)] + public byte[] system_reserved; /// 0x100, Hardware ID - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] hardware_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] hardware_id; /// 0x113 or 0x110, "SEGA" or "T-xx" - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public byte[] developer_code; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] + public byte[] developer_code; /// 0x118, Another release date, this with month in letters? - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] release_date2; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] release_date2; /// 0x120, Domestic version of the game title - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] public byte[] domestic_title; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] + public byte[] domestic_title; /// 0x150, Overseas version of the game title - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] public byte[] overseas_title; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] + public byte[] overseas_title; /// 0x180, Official product code - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)] public byte[] product_code; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)] + public byte[] product_code; /// 0x190, Supported peripherals, see above - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] peripherals; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] peripherals; /// 0x1A0, 0x20 - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] spare_space6; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] spare_space6; /// 0x1B0, Inside here should be modem information, but I need to get a modem-enabled game - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public byte[] spare_space7; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] + public byte[] spare_space7; /// 0x1F0, Region codes, space-filled - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] region_codes; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] region_codes; } public static IPBin? DecodeIPBin(byte[] ipbin_sector) @@ -129,15 +145,15 @@ namespace DiscImageChef.Decoders.Sega Encoding.ASCII.GetString(ipbin.system_name)); DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.volume_version = \"{0:X}\"", ipbin.volume_version); - DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.volume_type = 0x{0:X8}", ipbin.volume_type); + DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.volume_type = 0x{0:X8}", ipbin.volume_type); DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.system_version = 0x{0:X8}", ipbin.system_version); - DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.ip_address = 0x{0:X8}", ipbin.ip_address); - DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.ip_loadsize = {0}", ipbin.ip_loadsize); + DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.ip_address = 0x{0:X8}", ipbin.ip_address); + DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.ip_loadsize = {0}", ipbin.ip_loadsize); DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.ip_entry_address = 0x{0:X8}", ipbin.ip_entry_address); DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.ip_work_ram_size = {0}", ipbin.ip_work_ram_size); - DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.sp_address = 0x{0:X8}", ipbin.sp_address); - DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.sp_loadsize = {0}", ipbin.sp_loadsize); + DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.sp_address = 0x{0:X8}", ipbin.sp_address); + DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.sp_loadsize = {0}", ipbin.sp_loadsize); DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.sp_entry_address = 0x{0:X8}", ipbin.sp_entry_address); DicConsole.DebugWriteLine("ISO9660 plugin", "segacd_ipbin.sp_work_ram_size = {0}", ipbin.sp_work_ram_size); @@ -178,8 +194,8 @@ namespace DiscImageChef.Decoders.Sega IPBinInformation.AppendLine("--------------------------------"); // Decoding all data - DateTime ipbindate = DateTime.MinValue; - CultureInfo provider = CultureInfo.InvariantCulture; + DateTime ipbindate = DateTime.MinValue; + CultureInfo provider = CultureInfo.InvariantCulture; try { ipbindate = DateTime.ParseExact(Encoding.ASCII.GetString(ipbin.release_date), "MMddyyyy", provider); } catch { @@ -188,12 +204,12 @@ namespace DiscImageChef.Decoders.Sega ipbindate = DateTime.ParseExact(Encoding.ASCII.GetString(ipbin.release_date2), "yyyy.MMM", provider); } -#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body + #pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body catch { // ignored } -#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body + #pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body } /* diff --git a/Sega/Dreamcast.cs b/Sega/Dreamcast.cs index 163faa44c..bae1c659c 100644 --- a/Sega/Dreamcast.cs +++ b/Sega/Dreamcast.cs @@ -48,15 +48,18 @@ namespace DiscImageChef.Decoders.Sega public struct IPBin { /// Must be "SEGA SEGAKATANA " - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] SegaHardwareID; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] SegaHardwareID; /// 0x010, "SEGA ENTERPRISES" - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] maker_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] maker_id; /// 0x020, CRC of product_no and product_version public uint dreamcast_crc; /// 0x024, " " public byte spare_space1; /// 0x025, "GD-ROM" - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] dreamcast_media; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] dreamcast_media; /// 0x02B, Disc number public byte disc_no; /// 0x02C, '/' @@ -64,29 +67,40 @@ namespace DiscImageChef.Decoders.Sega /// 0x02D, Total number of discs public byte disc_total_nos; /// 0x02E, " " - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] spare_space2; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] spare_space2; /// 0x030, Region codes, space-filled - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] region_codes; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] region_codes; /// 0x038, Supported peripherals, bitwise - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] public byte[] peripherals; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] + public byte[] peripherals; /// 0x03F, ' ' public byte spare_space3; /// 0x040, Product number - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public byte[] product_no; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public byte[] product_no; /// 0x04A, Product version - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] product_version; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] product_version; /// 0x050, YYYYMMDD - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] release_date; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] release_date; /// 0x058, " " - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] spare_space4; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] spare_space4; /// 0x060, Usually "1ST_READ.BIN" or "0WINCE.BIN " - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] boot_filename; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] boot_filename; /// 0x06C, " " - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] spare_space5; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public byte[] spare_space5; /// 0x070, Game producer, space-filled - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] producer; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] producer; /// 0x080, Game name, space-filled - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] product_name; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] + public byte[] product_name; } public static IPBin? DecodeIPBin(byte[] ipbin_sector) @@ -148,7 +162,7 @@ namespace DiscImageChef.Decoders.Sega IPBinInformation.AppendLine("--------------------------------"); // Decoding all data - DateTime ipbindate; + DateTime ipbindate; CultureInfo provider = CultureInfo.InvariantCulture; ipbindate = DateTime.ParseExact(Encoding.ASCII.GetString(ipbin.release_date), "yyyyMMdd", provider); IPBinInformation.AppendFormat("Product name: {0}", Encoding.ASCII.GetString(ipbin.product_name)) diff --git a/Sega/Saturn.cs b/Sega/Saturn.cs index c7f24280d..159b13566 100644 --- a/Sega/Saturn.cs +++ b/Sega/Saturn.cs @@ -48,17 +48,23 @@ namespace DiscImageChef.Decoders.Sega public struct IPBin { /// Must be "SEGA SEGASATURN " - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] SegaHardwareID; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] SegaHardwareID; /// 0x010, "SEGA ENTERPRISES" - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] maker_id; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] maker_id; /// 0x020, Product number - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public byte[] product_no; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public byte[] product_no; /// 0x02A, Product version - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] product_version; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] product_version; /// 0x030, YYYYMMDD - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] release_date; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] release_date; /// 0x038, "CD-" - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] saturn_media; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] saturn_media; /// 0x03B, Disc number public byte disc_no; /// // 0x03C, '/' @@ -66,13 +72,17 @@ namespace DiscImageChef.Decoders.Sega /// // 0x03D, Total number of discs public byte disc_total_nos; /// 0x03E, " " - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] spare_space1; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] spare_space1; /// 0x040, Region codes, space-filled - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] region_codes; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] region_codes; /// 0x050, Supported peripherals, see above - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] peripherals; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] peripherals; /// 0x060, Game name, space-filled - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 112)] public byte[] product_name; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 112)] + public byte[] product_name; } public static IPBin? DecodeIPBin(byte[] ipbin_sector) @@ -128,7 +138,7 @@ namespace DiscImageChef.Decoders.Sega IPBinInformation.AppendLine("--------------------------------"); // Decoding all data - DateTime ipbindate; + DateTime ipbindate; CultureInfo provider = CultureInfo.InvariantCulture; ipbindate = DateTime.ParseExact(Encoding.ASCII.GetString(ipbin.release_date), "yyyyMMdd", provider); IPBinInformation.AppendFormat("Product name: {0}", Encoding.ASCII.GetString(ipbin.product_name)) diff --git a/Xbox/DMI.cs b/Xbox/DMI.cs index 07bd14ca7..808178abb 100644 --- a/Xbox/DMI.cs +++ b/Xbox/DMI.cs @@ -50,8 +50,13 @@ namespace DiscImageChef.Decoders.Xbox if(BitConverter.ToUInt32(dmi, 4) != 1) return false; // Catalogue number is two letters, five numbers, one letter - for(int i = 12; i < 14; i++) if(dmi[i] < 0x41 || dmi[i] > 0x5A) return false; - for(int i = 14; i < 19; i++) if(dmi[i] < 0x30 || dmi[i] > 0x39) return false; + for(int i = 12; i < 14; i++) + if(dmi[i] < 0x41 || dmi[i] > 0x5A) + return false; + + for(int i = 14; i < 19; i++) + if(dmi[i] < 0x30 || dmi[i] > 0x39) + return false; if(dmi[19] < 0x41 || dmi[19] > 0x5A) return false; @@ -159,10 +164,10 @@ namespace DiscImageChef.Decoders.Xbox XboxDMI dmi = new XboxDMI { DataLength = (ushort)((response[0] << 8) + response[1]), - Reserved1 = response[2], - Reserved2 = response[3], - Version = BitConverter.ToUInt32(response, 4), - Timestamp = BitConverter.ToInt64(response, 20) + Reserved1 = response[2], + Reserved2 = response[3], + Version = BitConverter.ToUInt32(response, 4), + Timestamp = BitConverter.ToInt64(response, 20) }; byte[] tmp = new byte[8]; @@ -180,11 +185,11 @@ namespace DiscImageChef.Decoders.Xbox Xbox360DMI dmi = new Xbox360DMI { DataLength = (ushort)((response[0] << 8) + response[1]), - Reserved1 = response[2], - Reserved2 = response[3], - Version = BitConverter.ToUInt32(response, 4), - Timestamp = BitConverter.ToInt64(response, 20), - MediaID = new byte[16] + Reserved1 = response[2], + Reserved2 = response[3], + Version = BitConverter.ToUInt32(response, 4), + Timestamp = BitConverter.ToInt64(response, 20), + MediaID = new byte[16] }; Array.Copy(response, 36, dmi.MediaID, 0, 16); @@ -199,8 +204,8 @@ namespace DiscImageChef.Decoders.Xbox { if(dmi == null) return null; - XboxDMI decoded = dmi.Value; - StringBuilder sb = new StringBuilder(); + XboxDMI decoded = dmi.Value; + StringBuilder sb = new StringBuilder(); sb.Append("Catalogue number: "); for(int i = 0; i < 2; i++) sb.AppendFormat("{0}", decoded.CatalogNumber[i]); @@ -221,8 +226,8 @@ namespace DiscImageChef.Decoders.Xbox { if(dmi == null) return null; - Xbox360DMI decoded = dmi.Value; - StringBuilder sb = new StringBuilder(); + Xbox360DMI decoded = dmi.Value; + StringBuilder sb = new StringBuilder(); sb.Append("Catalogue number: "); for(int i = 0; i < 2; i++) sb.AppendFormat("{0}", decoded.CatalogNumber[i]); diff --git a/Xbox/SS.cs b/Xbox/SS.cs index dd77bfbe8..ac1cfeab3 100644 --- a/Xbox/SS.cs +++ b/Xbox/SS.cs @@ -228,35 +228,38 @@ namespace DiscImageChef.Decoders.Xbox SecuritySector ss = new SecuritySector { - DiskCategory = (DiskCategory)((response[0] & 0xF0) >> 4), - PartVersion = (byte)(response[0] & 0x0F), - DiscSize = (DVDSize)((response[1] & 0xF0) >> 4), - MaximumRate = (MaximumRateField)(response[1] & 0x0F), - Reserved3 = (response[2] & 0x80) == 0x80, - Layers = (byte)((response[2] & 0x60) >> 5), - TrackPath = (response[2] & 0x08) == 0x08, - LayerType = (LayerTypeFieldMask)(response[2] & 0x07), + DiskCategory = (DiskCategory)((response[0] & 0xF0) >> 4), + PartVersion = (byte)(response[0] & 0x0F), + DiscSize = (DVDSize)((response[1] & 0xF0) >> 4), + MaximumRate = (MaximumRateField)(response[1] & 0x0F), + Reserved3 = (response[2] & 0x80) == 0x80, + Layers = (byte)((response[2] & 0x60) >> 5), + TrackPath = (response[2] & 0x08) == 0x08, + LayerType = (LayerTypeFieldMask)(response[2] & 0x07), LinearDensity = (LinearDensityField)((response[3] & 0xF0) >> 4), - TrackDensity = (TrackDensityField)(response[3] & 0x0F), - DataAreaStartPSN = (uint)((response[4] << 24) + (response[5] << 16) + (response[6] << 8) + response[7]), - DataAreaEndPSN = (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]), - Layer0EndPSN = (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]), - Unknown1 = response[27], - Unknown2 = new byte[28], - Unknown3 = new byte[436], - Unknown4 = new byte[4], - Unknown5 = new byte[43], + TrackDensity = (TrackDensityField)(response[3] & 0x0F), + DataAreaStartPSN = + (uint)((response[4] << 24) + (response[5] << 16) + (response[6] << 8) + response[7]), + DataAreaEndPSN = + (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]), + Layer0EndPSN = + (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]), + Unknown1 = response[27], + Unknown2 = new byte[28], + Unknown3 = new byte[436], + Unknown4 = new byte[4], + Unknown5 = new byte[43], ChallengeTableVersion = response[768], - NoChallengeEntries = response[769], - ChallengeEntries = new ChallengeEntry[23], - Unknown6 = response[1023], - Unknown7 = new byte[48], - Unknown8 = new byte[16], - Unknown9 = new byte[16], - Unknown10 = new byte[303], - Unknown11 = new byte[104], - Extents = new SecuritySectorExtent[23], - ExtentsCopy = new SecuritySectorExtent[23] + NoChallengeEntries = response[769], + ChallengeEntries = new ChallengeEntry[23], + Unknown6 = response[1023], + Unknown7 = new byte[48], + Unknown8 = new byte[16], + Unknown9 = new byte[16], + Unknown10 = new byte[303], + Unknown11 = new byte[104], + Extents = new SecuritySectorExtent[23], + ExtentsCopy = new SecuritySectorExtent[23] }; Array.Copy(response, 256, ss.Unknown2, 0, 28); @@ -267,19 +270,19 @@ namespace DiscImageChef.Decoders.Xbox for(int i = 0; i < 23; i++) ss.ChallengeEntries[i] = new ChallengeEntry { - Level = response[770 + i * 11 + 0], + Level = response[770 + i * 11 + 0], ChallengeId = response[770 + i * 11 + 1], ChallengeValue = (uint)((response[770 + i * 11 + 2] << 24) + (response[770 + i * 11 + 3] << 16) + - (response[770 + i * 11 + 4] << 8) + response[770 + i * 11 + 5]), + (response[770 + i * 11 + 4] << 8) + response[770 + i * 11 + 5]), ResponseModifier = response[770 + i * 11 + 6], ResponseValue = (uint)((response[770 + i * 11 + 7] << 24) + (response[770 + i * 11 + 8] << 16) + - (response[770 + i * 11 + 9] << 8) + response[770 + i * 11 + 10]) + (response[770 + i * 11 + 9] << 8) + response[770 + i * 11 + 10]) }; - Array.Copy(response, 1052, ss.Unknown7, 0, 48); - Array.Copy(response, 1120, ss.Unknown8, 0, 16); - Array.Copy(response, 1180, ss.Unknown9, 0, 16); + Array.Copy(response, 1052, ss.Unknown7, 0, 48); + Array.Copy(response, 1120, ss.Unknown8, 0, 16); + Array.Copy(response, 1180, ss.Unknown9, 0, 16); Array.Copy(response, 1208, ss.Unknown10, 0, 303); Array.Copy(response, 1528, ss.Unknown11, 0, 104); for(int i = 0; i < 23; i++) @@ -316,7 +319,7 @@ namespace DiscImageChef.Decoders.Xbox if(ss == null) return null; SecuritySector decoded = ss.Value; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); string sizeString; switch(decoded.DiscSize) @@ -376,7 +379,7 @@ namespace DiscImageChef.Decoders.Xbox } sb.AppendFormat("Disc has {0} layers", decoded.Layers + 1).AppendLine(); - if(decoded.TrackPath && decoded.Layers == 1) sb.AppendLine("Layers are in parallel track path"); + if(decoded.TrackPath && decoded.Layers == 1) sb.AppendLine("Layers are in parallel track path"); else if(!decoded.TrackPath && decoded.Layers == 1) sb.AppendLine("Layers are in opposite track path"); switch(decoded.LinearDensity) @@ -437,7 +440,8 @@ namespace DiscImageChef.Decoders.Xbox if(decoded.Layers == 1 && !decoded.TrackPath) sb.AppendFormat("Layer 0 ends at PSN {0:X}h", decoded.Layer0EndPSN).AppendLine(); } - else sb.AppendLine("Disc is empty"); + else + sb.AppendLine("Disc is empty"); else sb.AppendLine("Disc is empty"); sb.AppendLine("Challenges:");