From b38c0d48fcfc7b0c66e5e7288b35bdff0eaa8acd Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 24 Dec 2018 04:14:04 +0000 Subject: [PATCH] View reports from server database. --- DiscImageChef.Server/App_Start/Ata.cs | 1448 ++++++++--------- DiscImageChef.Server/App_Start/ScsiEvpd.cs | 6 +- DiscImageChef.Server/App_Start/ScsiInquiry.cs | 72 +- .../App_Start/ScsiMmcFeatures.cs | 135 +- DiscImageChef.Server/App_Start/ScsiMmcMode.cs | 75 +- .../App_Start/ScsiModeSense.cs | 29 +- .../App_Start/SscTestedMedia.cs | 16 +- DiscImageChef.Server/App_Start/TestedMedia.cs | 169 +- .../DiscImageChef.Server.csproj | 4 + DiscImageChef.Server/ViewReport.aspx.cs | 147 +- DiscImageChef.sln.DotSettings | 4 +- 11 files changed, 975 insertions(+), 1130 deletions(-) diff --git a/DiscImageChef.Server/App_Start/Ata.cs b/DiscImageChef.Server/App_Start/Ata.cs index d105b1f26..e74e82b0f 100644 --- a/DiscImageChef.Server/App_Start/Ata.cs +++ b/DiscImageChef.Server/App_Start/Ata.cs @@ -32,10 +32,10 @@ using System.Collections.Generic; using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.ATA; using DiscImageChef.Decoders.SCSI; -using static DiscImageChef.Decoders.ATA.Identify; -namespace DiscImageChef.Server.App_Start +namespace DiscImageChef.Server { public static class Ata { @@ -46,23 +46,27 @@ namespace DiscImageChef.Server.App_Start /// ATA part of a device report /// true if compact flash device /// true if atapi device - /// true if removabledevice + /// true if removable device /// List to put values on /// List to put key=value pairs on /// List of tested media - public static void Report(ataType ataReport, bool cfa, bool atapi, - ref bool removable, - ref List ataOneValue, ref Dictionary ataTwoValue, - ref testedMediaType[] testedMedia) + public static void Report(CommonTypes.Metadata.Ata ataReport, bool cfa, bool atapi, + ref bool removable, + ref List ataOneValue, ref Dictionary ataTwoValue, + ref List testedMedia) { uint logicalsectorsize = 0; - if(ataReport.ModelSpecified && !string.IsNullOrEmpty(ataReport.Model)) - ataTwoValue.Add("Model", ataReport.Model); - if(ataReport.FirmwareRevisionSpecified && !string.IsNullOrEmpty(ataReport.FirmwareRevision)) - ataTwoValue.Add("Firmware revision", ataReport.FirmwareRevision); - if(ataReport.AdditionalPIDSpecified && !string.IsNullOrEmpty(ataReport.AdditionalPID)) - ataTwoValue.Add("Additional product ID", ataReport.AdditionalPID); + Identify.IdentifyDevice? ataIdentifyNullable = Identify.Decode(ataReport.Identify); + if(!ataIdentifyNullable.HasValue) return; + + Identify.IdentifyDevice ataIdentify = ataIdentifyNullable.Value; + + if(!string.IsNullOrEmpty(ataIdentify.Model)) ataTwoValue.Add("Model", ataIdentify.Model); + if(!string.IsNullOrEmpty(ataIdentify.FirmwareRevision)) + ataTwoValue.Add("Firmware revision", ataIdentify.FirmwareRevision); + if(!string.IsNullOrEmpty(ataIdentify.AdditionalPID)) + ataTwoValue.Add("Additional product ID", ataIdentify.AdditionalPID); bool ata1 = false, ata2 = false, @@ -76,16 +80,16 @@ namespace DiscImageChef.Server.App_Start acs3 = false, acs4 = false; - if(ataReport.MajorVersionSpecified && - ((ushort)ataReport.MajorVersion == 0x0000 || (ushort)ataReport.MajorVersion == 0xFFFF)) + if((ushort)ataIdentify.MajorVersion == 0x0000 || (ushort)ataIdentify.MajorVersion == 0xFFFF) { // Obsolete in ATA-2, if present, device supports ATA-1 - if(ataReport.GeneralConfigurationSpecified) - ata1 |= ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.FastIDE) || - ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.SlowIDE) || - ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.UltraFastIDE); + ata1 |= ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.FastIDE) || + ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SlowIDE) || + ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.UltraFastIDE); - ata2 |= ataReport.ExtendedIdentifySpecified; + ata2 |= ataIdentify.ExtendedIdentify.HasFlag(Identify.ExtendedIdentifyBit.Words54to58Valid) || + ataIdentify.ExtendedIdentify.HasFlag(Identify.ExtendedIdentifyBit.Words64to70Valid) || + ataIdentify.ExtendedIdentify.HasFlag(Identify.ExtendedIdentifyBit.Word88Valid); if(!ata1 && !ata2 && !atapi && !cfa) ata2 = true; @@ -97,20 +101,17 @@ namespace DiscImageChef.Server.App_Start } else { - if(ataReport.MajorVersionSpecified) - { - ata1 |= ataReport.MajorVersion.HasFlag(MajorVersionBit.Ata1); - ata2 |= ataReport.MajorVersion.HasFlag(MajorVersionBit.Ata2); - ata3 |= ataReport.MajorVersion.HasFlag(MajorVersionBit.Ata3); - ata4 |= ataReport.MajorVersion.HasFlag(MajorVersionBit.AtaAtapi4); - ata5 |= ataReport.MajorVersion.HasFlag(MajorVersionBit.AtaAtapi5); - ata6 |= ataReport.MajorVersion.HasFlag(MajorVersionBit.AtaAtapi6); - ata7 |= ataReport.MajorVersion.HasFlag(MajorVersionBit.AtaAtapi7); - acs |= ataReport.MajorVersion.HasFlag(MajorVersionBit.Ata8ACS); - acs2 |= ataReport.MajorVersion.HasFlag(MajorVersionBit.ACS2); - acs3 |= ataReport.MajorVersion.HasFlag(MajorVersionBit.ACS3); - acs4 |= ataReport.MajorVersion.HasFlag(MajorVersionBit.ACS4); - } + ata1 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata1); + ata2 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata2); + ata3 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata3); + ata4 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi4); + ata5 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi5); + ata6 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi6); + ata7 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi7); + acs |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata8ACS); + acs2 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.ACS2); + acs3 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.ACS3); + acs4 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.ACS4); } int maxatalevel = 0; @@ -195,9 +196,9 @@ namespace DiscImageChef.Server.App_Start if(tmpString != "") ataTwoValue.Add("Supported ATA versions", tmpString); - if(maxatalevel >= 3 && ataReport.MinorVersionSpecified) + if(maxatalevel >= 3) { - switch(ataReport.MinorVersion) + switch(ataIdentify.MinorVersion) { case 0x0000: case 0xFFFF: @@ -342,47 +343,44 @@ namespace DiscImageChef.Server.App_Start tmpString = "ACS-3 Revision 4"; break; default: - tmpString = $"Unknown ATA revision 0x{ataReport.MinorVersion:X4}"; + tmpString = $"Unknown ATA revision 0x{ataIdentify.MinorVersion:X4}"; break; } ataTwoValue.Add("Maximum ATA revision supported", tmpString); } - if(ataReport.TransportMajorVersionSpecified) + tmpString = ""; + switch((ataIdentify.TransportMajorVersion & 0xF000) >> 12) { - tmpString = ""; - switch((ataReport.TransportMajorVersion & 0xF000) >> 12) - { - case 0x0: - if((ataReport.TransportMajorVersion & 0x0002) == 0x0002) tmpString += "ATA/ATAPI-7 "; - if((ataReport.TransportMajorVersion & 0x0001) == 0x0001) tmpString += "ATA8-APT "; - ataTwoValue.Add("Parallel ATA device", tmpString); - break; - case 0x1: - if((ataReport.TransportMajorVersion & 0x0001) == 0x0001) tmpString += "ATA8-AST "; - if((ataReport.TransportMajorVersion & 0x0002) == 0x0002) tmpString += "SATA 1.0a "; - if((ataReport.TransportMajorVersion & 0x0004) == 0x0004) tmpString += "SATA II Extensions "; - if((ataReport.TransportMajorVersion & 0x0008) == 0x0008) tmpString += "SATA 2.5 "; - if((ataReport.TransportMajorVersion & 0x0010) == 0x0010) tmpString += "SATA 2.6 "; - if((ataReport.TransportMajorVersion & 0x0020) == 0x0020) tmpString += "SATA 3.0 "; - if((ataReport.TransportMajorVersion & 0x0040) == 0x0040) tmpString += "SATA 3.1 "; - ataTwoValue.Add("Serial ATA device: ", tmpString); - break; - case 0xE: - ataTwoValue.Add("SATA Express device", "No version"); - break; - default: - ataTwoValue.Add("Unknown transport type", - $"0x{(ataReport.TransportMajorVersion & 0xF000) >> 12:X1}"); - break; - } + case 0x0: + if((ataIdentify.TransportMajorVersion & 0x0002) == 0x0002) tmpString += "ATA/ATAPI-7 "; + if((ataIdentify.TransportMajorVersion & 0x0001) == 0x0001) tmpString += "ATA8-APT "; + ataTwoValue.Add("Parallel ATA device", tmpString); + break; + case 0x1: + if((ataIdentify.TransportMajorVersion & 0x0001) == 0x0001) tmpString += "ATA8-AST "; + if((ataIdentify.TransportMajorVersion & 0x0002) == 0x0002) tmpString += "SATA 1.0a "; + if((ataIdentify.TransportMajorVersion & 0x0004) == 0x0004) tmpString += "SATA II Extensions "; + if((ataIdentify.TransportMajorVersion & 0x0008) == 0x0008) tmpString += "SATA 2.5 "; + if((ataIdentify.TransportMajorVersion & 0x0010) == 0x0010) tmpString += "SATA 2.6 "; + if((ataIdentify.TransportMajorVersion & 0x0020) == 0x0020) tmpString += "SATA 3.0 "; + if((ataIdentify.TransportMajorVersion & 0x0040) == 0x0040) tmpString += "SATA 3.1 "; + ataTwoValue.Add("Serial ATA device: ", tmpString); + break; + case 0xE: + ataTwoValue.Add("SATA Express device", "No version"); + break; + default: + ataTwoValue.Add("Unknown transport type", + $"0x{(ataIdentify.TransportMajorVersion & 0xF000) >> 12:X1}"); + break; } - if(atapi && ataReport.GeneralConfigurationSpecified) + if(atapi) { // Bits 12 to 8, SCSI Peripheral Device Type - switch((PeripheralDeviceTypes)(((ushort)ataReport.GeneralConfiguration & 0x1F00) >> 8)) + switch((PeripheralDeviceTypes)(((ushort)ataIdentify.GeneralConfiguration & 0x1F00) >> 8)) { case PeripheralDeviceTypes.DirectAccess: //0x00, ataOneValue.Add("ATAPI Direct-access device"); @@ -449,12 +447,12 @@ namespace DiscImageChef.Server.App_Start break; default: ataOneValue - .Add($"ATAPI Unknown device type field value 0x{((ushort)ataReport.GeneralConfiguration & 0x1F00) >> 8:X2}"); + .Add($"ATAPI Unknown device type field value 0x{((ushort)ataIdentify.GeneralConfiguration & 0x1F00) >> 8:X2}"); break; } // ATAPI DRQ behaviour - switch(((ushort)ataReport.GeneralConfiguration & 0x60) >> 5) + switch(((ushort)ataIdentify.GeneralConfiguration & 0x60) >> 5) { case 0: ataOneValue.Add("Device shall set DRQ within 3 ms of receiving PACKET"); @@ -467,12 +465,12 @@ namespace DiscImageChef.Server.App_Start break; default: ataOneValue - .Add($"Unknown ATAPI DRQ behaviour code {((ushort)ataReport.GeneralConfiguration & 0x60) >> 5}"); + .Add($"Unknown ATAPI DRQ behaviour code {((ushort)ataIdentify.GeneralConfiguration & 0x60) >> 5}"); break; } // ATAPI PACKET size - switch((ushort)ataReport.GeneralConfiguration & 0x03) + switch((ushort)ataIdentify.GeneralConfiguration & 0x03) { case 0: ataOneValue.Add("ATAPI device uses 12 byte command packet"); @@ -482,1006 +480,872 @@ namespace DiscImageChef.Server.App_Start break; default: ataOneValue - .Add($"Unknown ATAPI packet size code {(ushort)ataReport.GeneralConfiguration & 0x03}"); + .Add($"Unknown ATAPI packet size code {(ushort)ataIdentify.GeneralConfiguration & 0x03}"); break; } } - else if(!cfa && ataReport.GeneralConfigurationSpecified) + else if(!cfa) { if(minatalevel >= 5) - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.IncompleteResponse)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.IncompleteResponse)) ataOneValue.Add("Incomplete identify response"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.NonMagnetic)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.NonMagnetic)) ataOneValue.Add("Device uses non-magnetic media"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.Removable)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.Removable)) ataOneValue.Add("Device is removable"); if(minatalevel <= 5) - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.Fixed)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.Fixed)) ataOneValue.Add("Device is fixed"); if(ata1) { - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.SlowIDE)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SlowIDE)) ataOneValue.Add("Device transfer rate is <= 5 Mb/s"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.FastIDE)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.FastIDE)) ataOneValue.Add("Device transfer rate is > 5 Mb/s but <= 10 Mb/s"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.UltraFastIDE)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.UltraFastIDE)) ataOneValue.Add("Device transfer rate is > 10 Mb/s"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.SoftSector)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SoftSector)) ataOneValue.Add("Device is soft sectored"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.HardSector)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.HardSector)) ataOneValue.Add("Device is hard sectored"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.NotMFM)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.NotMFM)) ataOneValue.Add("Device is not MFM encoded"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.FormatGapReq)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.FormatGapReq)) ataOneValue.Add("Format speed tolerance gap is required"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.TrackOffset)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.TrackOffset)) ataOneValue.Add("Track offset option is available"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.DataStrobeOffset)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.DataStrobeOffset)) ataOneValue.Add("Data strobe offset option is available"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.RotationalSpeedTolerance)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit + .RotationalSpeedTolerance)) ataOneValue.Add("Rotational speed tolerance is higher than 0,5%"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.SpindleControl)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SpindleControl)) ataOneValue.Add("Spindle motor control is implemented"); - if(ataReport.GeneralConfiguration.HasFlag(GeneralConfigurationBit.HighHeadSwitch)) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.HighHeadSwitch)) ataOneValue.Add("Head switch time is bigger than 15 µs."); } } - if(ataReport.SpecificConfigurationSpecified && (ushort)ataReport.SpecificConfiguration != 0x0000 && - (ushort)ataReport.SpecificConfiguration != 0xFFFF) - switch(ataReport.SpecificConfiguration) + if((ushort)ataIdentify.SpecificConfiguration != 0x0000 && + (ushort)ataIdentify.SpecificConfiguration != 0xFFFF) + switch(ataIdentify.SpecificConfiguration) { - case SpecificConfigurationEnum.RequiresSetIncompleteResponse: + case Identify.SpecificConfigurationEnum.RequiresSetIncompleteResponse: ataOneValue .Add("Device requires SET FEATURES to spin up and IDENTIFY DEVICE response is incomplete."); break; - case SpecificConfigurationEnum.RequiresSetCompleteResponse: + case Identify.SpecificConfigurationEnum.RequiresSetCompleteResponse: ataOneValue .Add("Device requires SET FEATURES to spin up and IDENTIFY DEVICE response is complete."); break; - case SpecificConfigurationEnum.NotRequiresSetIncompleteResponse: + case Identify.SpecificConfigurationEnum.NotRequiresSetIncompleteResponse: ataOneValue .Add("Device does not require SET FEATURES to spin up and IDENTIFY DEVICE response is incomplete."); break; - case SpecificConfigurationEnum.NotRequiresSetCompleteResponse: + case Identify.SpecificConfigurationEnum.NotRequiresSetCompleteResponse: ataOneValue .Add("Device does not require SET FEATURES to spin up and IDENTIFY DEVICE response is complete."); break; default: ataOneValue - .Add($"Unknown device specific configuration 0x{(ushort)ataReport.SpecificConfiguration:X4}"); + .Add($"Unknown device specific configuration 0x{(ushort)ataIdentify.SpecificConfiguration:X4}"); break; } // Obsolete since ATA-2, however, it is yet used in ATA-8 devices - if(ataReport.BufferSizeSpecified && ataReport.BufferTypeSpecified && ataReport.BufferSize != 0x0000 && - ataReport.BufferSize != 0xFFFF && - ataReport.BufferType != 0x0000 && ataReport.BufferType != 0xFFFF) - switch(ataReport.BufferType) + if(ataIdentify.BufferSize != 0x0000 && ataIdentify.BufferSize != 0xFFFF && + ataIdentify.BufferType != 0x0000 && ataIdentify.BufferType != 0xFFFF) + switch(ataIdentify.BufferType) { case 1: ataOneValue - .Add($"{ataReport.BufferSize * logicalsectorsize / 1024} KiB of single ported single sector buffer"); + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of single ported single sector buffer"); break; case 2: ataOneValue - .Add($"{ataReport.BufferSize * logicalsectorsize / 1024} KiB of dual ported multi sector buffer"); + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of dual ported multi sector buffer"); break; case 3: ataOneValue - .Add($"{ataReport.BufferSize * logicalsectorsize / 1024} KiB of dual ported multi sector buffer with read caching"); + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of dual ported multi sector buffer with read caching"); break; default: ataOneValue - .Add($"{ataReport.BufferSize * logicalsectorsize / 1024} KiB of unknown type {ataReport.BufferType} buffer"); + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of unknown type {ataIdentify.BufferType} buffer"); break; } - if(ataReport.CapabilitiesSpecified) + ataOneValue.Add("Device capabilities:"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.StandardStanbyTimer)) + ataOneValue.Add("Standby time values are standard"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.IORDY)) + ataOneValue.Add(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.CanDisableIORDY) + ? "IORDY is supported and can be disabled" + : "IORDY is supported"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.DMASupport)) + ataOneValue.Add("DMA is supported"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.PhysicalAlignment1) || + ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.PhysicalAlignment0)) + ataOneValue.Add($"Long Physical Alignment setting is {(ushort)ataIdentify.Capabilities & 0x03}"); + if(atapi) { - ataOneValue.Add("Device capabilities:"); - if(ataReport.Capabilities.HasFlag(CapabilitiesBit.StandardStanbyTimer)) - ataOneValue.Add("Standby time values are standard"); - if(ataReport.Capabilities.HasFlag(CapabilitiesBit.IORDY)) - ataOneValue.Add(ataReport.Capabilities.HasFlag(CapabilitiesBit.CanDisableIORDY) - ? "IORDY is supported and can be disabled" - : "IORDY is supported"); - if(ataReport.Capabilities.HasFlag(CapabilitiesBit.DMASupport)) ataOneValue.Add("DMA is supported"); - if(ataReport.Capabilities.HasFlag(CapabilitiesBit.PhysicalAlignment1) || - ataReport.Capabilities.HasFlag(CapabilitiesBit.PhysicalAlignment0)) - ataOneValue.Add($"Long Physical Alignment setting is {(ushort)ataReport.Capabilities & 0x03}"); - if(atapi) - { - if(ataReport.Capabilities.HasFlag(CapabilitiesBit.InterleavedDMA)) - ataOneValue.Add("ATAPI device supports interleaved DMA"); - if(ataReport.Capabilities.HasFlag(CapabilitiesBit.CommandQueue)) - ataOneValue.Add("ATAPI device supports command queueing"); - if(ataReport.Capabilities.HasFlag(CapabilitiesBit.OverlapOperation)) - ataOneValue.Add("ATAPI device supports overlapped operations"); - if(ataReport.Capabilities.HasFlag(CapabilitiesBit.RequiresATASoftReset)) - ataOneValue.Add("ATAPI device requires ATA software reset"); - } + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.InterleavedDMA)) + ataOneValue.Add("ATAPI device supports interleaved DMA"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.CommandQueue)) + ataOneValue.Add("ATAPI device supports command queueing"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.OverlapOperation)) + ataOneValue.Add("ATAPI device supports overlapped operations"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.RequiresATASoftReset)) + ataOneValue.Add("ATAPI device requires ATA software reset"); } - if(ataReport.Capabilities2Specified) - if(ataReport.Capabilities2.HasFlag(CapabilitiesBit2.MustBeSet) && - !ataReport.Capabilities2.HasFlag(CapabilitiesBit2.MustBeClear)) - if(ataReport.Capabilities2.HasFlag(CapabilitiesBit2.SpecificStandbyTimer)) - ataOneValue.Add("Device indicates a specific minimum standby timer value"); + if(ataIdentify.Capabilities2.HasFlag(Identify.CapabilitiesBit2.MustBeSet) && + !ataIdentify.Capabilities2.HasFlag(Identify.CapabilitiesBit2.MustBeClear)) + if(ataIdentify.Capabilities2.HasFlag(Identify.CapabilitiesBit2.SpecificStandbyTimer)) + ataOneValue.Add("Device indicates a specific minimum standby timer value"); - if(ataReport.Capabilities3Specified) - if(ataReport.Capabilities3.HasFlag(CapabilitiesBit3.MultipleValid)) - { - ataOneValue - .Add($"A maximum of {ataReport.MultipleSectorNumber} sectors can be transferred per interrupt on READ/WRITE MULTIPLE"); - ataOneValue.Add($"Device supports setting a maximum of {ataReport.MultipleMaxSectors} sectors"); - } + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.MultipleValid)) + { + ataOneValue.Add($"A maximum of {ataIdentify.MultipleSectorNumber} sectors can be transferred per interrupt on READ/WRITE MULTIPLE"); + ataOneValue.Add($"Device supports setting a maximum of {ataIdentify.MultipleMaxSectors} sectors"); + } - if(ata1 && ataReport.TrustedComputingSpecified) - if(ataReport.TrustedComputing.HasFlag(TrustedComputingBit.TrustedComputing)) + if(ata1) + if(ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.TrustedComputing)) ataOneValue.Add("Device supports doubleword I/O"); if(minatalevel <= 3) { - if(ataReport.PIOTransferTimingModeSpecified) - ataTwoValue.Add("PIO timing mode", $"{ataReport.PIOTransferTimingMode}"); - if(ataReport.DMATransferTimingModeSpecified) - ataTwoValue.Add("DMA timing mode", $"{ataReport.DMATransferTimingMode}"); + if(ataIdentify.PIOTransferTimingMode > 0) + ataTwoValue.Add("PIO timing mode", $"{ataIdentify.PIOTransferTimingMode}"); + if(ataIdentify.DMATransferTimingMode > 0) + ataTwoValue.Add("DMA timing mode", $"{ataIdentify.DMATransferTimingMode}"); } - if(ataReport.APIOSupportedSpecified) + tmpString = ""; + + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode0)) tmpString += "PIO0 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode1)) tmpString += "PIO1 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode2)) tmpString += "PIO2 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode3)) tmpString += "PIO3 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode4)) tmpString += "PIO4 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode5)) tmpString += "PIO5 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode6)) tmpString += "PIO6 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode7)) tmpString += "PIO7 "; + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Advanced PIO", tmpString); + + if(minatalevel <= 3 && !atapi) { tmpString = ""; - - if(ataReport.APIOSupported.HasFlag(TransferMode.Mode0)) tmpString += "PIO0 "; - if(ataReport.APIOSupported.HasFlag(TransferMode.Mode1)) tmpString += "PIO1 "; - if(ataReport.APIOSupported.HasFlag(TransferMode.Mode2)) tmpString += "PIO2 "; - if(ataReport.APIOSupported.HasFlag(TransferMode.Mode3)) tmpString += "PIO3 "; - if(ataReport.APIOSupported.HasFlag(TransferMode.Mode4)) tmpString += "PIO4 "; - if(ataReport.APIOSupported.HasFlag(TransferMode.Mode5)) tmpString += "PIO5 "; - if(ataReport.APIOSupported.HasFlag(TransferMode.Mode6)) tmpString += "PIO6 "; - if(ataReport.APIOSupported.HasFlag(TransferMode.Mode7)) tmpString += "PIO7 "; - - ataTwoValue.Add("Advanced PIO", tmpString); - } - - if(minatalevel <= 3 && !atapi && ataReport.DMASupportedSpecified) - { - tmpString = ""; - if(ataReport.DMASupported.HasFlag(TransferMode.Mode0)) + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode0)) { tmpString += "DMA0 "; - if(ataReport.DMAActive.HasFlag(TransferMode.Mode0) && ataReport.DMAActiveSpecified) - tmpString += "(active) "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode0)) tmpString += "(active) "; } - if(ataReport.DMASupported.HasFlag(TransferMode.Mode1)) + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode1)) { tmpString += "DMA1 "; - if(ataReport.DMAActive.HasFlag(TransferMode.Mode1) && ataReport.DMAActiveSpecified) - tmpString += "(active) "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode1)) tmpString += "(active) "; } - if(ataReport.DMASupported.HasFlag(TransferMode.Mode2)) + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode2)) { tmpString += "DMA2 "; - if(ataReport.DMAActive.HasFlag(TransferMode.Mode2) && ataReport.DMAActiveSpecified) - tmpString += "(active) "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode2)) tmpString += "(active) "; } - if(ataReport.DMASupported.HasFlag(TransferMode.Mode3)) + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode3)) { tmpString += "DMA3 "; - if(ataReport.DMAActive.HasFlag(TransferMode.Mode3) && ataReport.DMAActiveSpecified) - tmpString += "(active) "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode3)) tmpString += "(active) "; } - if(ataReport.DMASupported.HasFlag(TransferMode.Mode4)) + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode4)) { tmpString += "DMA4 "; - if(ataReport.DMAActive.HasFlag(TransferMode.Mode4) && ataReport.DMAActiveSpecified) - tmpString += "(active) "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode4)) tmpString += "(active) "; } - if(ataReport.DMASupported.HasFlag(TransferMode.Mode5)) + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode5)) { tmpString += "DMA5 "; - if(ataReport.DMAActive.HasFlag(TransferMode.Mode5) && ataReport.DMAActiveSpecified) - tmpString += "(active) "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode5)) tmpString += "(active) "; } - if(ataReport.DMASupported.HasFlag(TransferMode.Mode6)) + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode6)) { tmpString += "DMA6 "; - if(ataReport.DMAActive.HasFlag(TransferMode.Mode6) && ataReport.DMAActiveSpecified) - tmpString += "(active) "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode6)) tmpString += "(active) "; } - if(ataReport.DMASupported.HasFlag(TransferMode.Mode7)) + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode7)) { tmpString += "DMA7 "; - if(ataReport.DMAActive.HasFlag(TransferMode.Mode7) && ataReport.DMAActiveSpecified) - tmpString += "(active) "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode7)) tmpString += "(active) "; } - ataTwoValue.Add("Single-word DMA", tmpString); + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Single-word DMA", tmpString); } - if(ataReport.MDMASupportedSpecified) + tmpString = ""; + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode0)) { - tmpString = ""; - if(ataReport.MDMASupported.HasFlag(TransferMode.Mode0)) - { - tmpString += "MDMA0 "; - if(ataReport.MDMAActive.HasFlag(TransferMode.Mode0) && ataReport.MDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.MDMASupported.HasFlag(TransferMode.Mode1)) - { - tmpString += "MDMA1 "; - if(ataReport.MDMAActive.HasFlag(TransferMode.Mode1) && ataReport.MDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.MDMASupported.HasFlag(TransferMode.Mode2)) - { - tmpString += "MDMA2 "; - if(ataReport.MDMAActive.HasFlag(TransferMode.Mode2) && ataReport.MDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.MDMASupported.HasFlag(TransferMode.Mode3)) - { - tmpString += "MDMA3 "; - if(ataReport.MDMAActive.HasFlag(TransferMode.Mode3) && ataReport.MDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.MDMASupported.HasFlag(TransferMode.Mode4)) - { - tmpString += "MDMA4 "; - if(ataReport.MDMAActive.HasFlag(TransferMode.Mode4) && ataReport.MDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.MDMASupported.HasFlag(TransferMode.Mode5)) - { - tmpString += "MDMA5 "; - if(ataReport.MDMAActive.HasFlag(TransferMode.Mode5) && ataReport.MDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.MDMASupported.HasFlag(TransferMode.Mode6)) - { - tmpString += "MDMA6 "; - if(ataReport.MDMAActive.HasFlag(TransferMode.Mode6) && ataReport.MDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.MDMASupported.HasFlag(TransferMode.Mode7)) - { - tmpString += "MDMA7 "; - if(ataReport.MDMAActive.HasFlag(TransferMode.Mode7) && ataReport.MDMAActiveSpecified) - tmpString += "(active) "; - } - - ataTwoValue.Add("Multi-word DMA", tmpString); + tmpString += "MDMA0 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode0)) tmpString += "(active) "; } - if(ataReport.UDMASupportedSpecified) + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode1)) { - tmpString = ""; - if(ataReport.UDMASupported.HasFlag(TransferMode.Mode0)) - { - tmpString += "UDMA0 "; - if(ataReport.UDMAActive.HasFlag(TransferMode.Mode0) && ataReport.UDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.UDMASupported.HasFlag(TransferMode.Mode1)) - { - tmpString += "UDMA1 "; - if(ataReport.UDMAActive.HasFlag(TransferMode.Mode1) && ataReport.UDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.UDMASupported.HasFlag(TransferMode.Mode2)) - { - tmpString += "UDMA2 "; - if(ataReport.UDMAActive.HasFlag(TransferMode.Mode2) && ataReport.UDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.UDMASupported.HasFlag(TransferMode.Mode3)) - { - tmpString += "UDMA3 "; - if(ataReport.UDMAActive.HasFlag(TransferMode.Mode3) && ataReport.UDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.UDMASupported.HasFlag(TransferMode.Mode4)) - { - tmpString += "UDMA4 "; - if(ataReport.UDMAActive.HasFlag(TransferMode.Mode4) && ataReport.UDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.UDMASupported.HasFlag(TransferMode.Mode5)) - { - tmpString += "UDMA5 "; - if(ataReport.UDMAActive.HasFlag(TransferMode.Mode5) && ataReport.UDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.UDMASupported.HasFlag(TransferMode.Mode6)) - { - tmpString += "UDMA6 "; - if(ataReport.UDMAActive.HasFlag(TransferMode.Mode6) && ataReport.UDMAActiveSpecified) - tmpString += "(active) "; - } - - if(ataReport.UDMASupported.HasFlag(TransferMode.Mode7)) - { - tmpString += "UDMA7 "; - if(ataReport.UDMAActive.HasFlag(TransferMode.Mode7) && ataReport.UDMAActiveSpecified) - tmpString += "(active) "; - } - - ataTwoValue.Add("Ultra DMA", tmpString); + tmpString += "MDMA1 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode1)) tmpString += "(active) "; } - if(ataReport.MinMDMACycleTime != 0 && ataReport.RecommendedMDMACycleTime != 0) - ataOneValue.Add($"At minimum {ataReport.MinMDMACycleTime} ns. transfer cycle time per word in MDMA, " + - $"{ataReport.RecommendedMDMACycleTime} ns. recommended"); - if(ataReport.MinPIOCycleTimeNoFlow != 0) - ataOneValue.Add($"At minimum {ataReport.MinPIOCycleTimeNoFlow} ns. transfer cycle time per word in PIO, " + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode2)) + { + tmpString += "MDMA2 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode2)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode3)) + { + tmpString += "MDMA3 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode3)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode4)) + { + tmpString += "MDMA4 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode4)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode5)) + { + tmpString += "MDMA5 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode5)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode6)) + { + tmpString += "MDMA6 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode6)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode7)) + { + tmpString += "MDMA7 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode7)) tmpString += "(active) "; + } + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Multi-word DMA", tmpString); + + tmpString = ""; + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode0)) + { + tmpString += "UDMA0 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode0)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode1)) + { + tmpString += "UDMA1 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode1)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode2)) + { + tmpString += "UDMA2 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode2)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode3)) + { + tmpString += "UDMA3 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode3)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode4)) + { + tmpString += "UDMA4 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode4)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode5)) + { + tmpString += "UDMA5 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode5)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode6)) + { + tmpString += "UDMA6 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode6)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode7)) + { + tmpString += "UDMA7 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode7)) tmpString += "(active) "; + } + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Ultra DMA", tmpString); + + if(ataIdentify.MinMDMACycleTime != 0 && ataIdentify.RecMDMACycleTime != 0) + ataOneValue.Add($"At minimum {ataIdentify.MinMDMACycleTime} ns. transfer cycle time per word in MDMA, " + + $"{ataIdentify.RecMDMACycleTime} ns. recommended"); + if(ataIdentify.MinPIOCycleTimeNoFlow != 0) + ataOneValue.Add($"At minimum {ataIdentify.MinPIOCycleTimeNoFlow} ns. transfer cycle time per word in PIO, " + "without flow control"); - if(ataReport.MinPIOCycleTimeFlow != 0) - ataOneValue.Add($"At minimum {ataReport.MinPIOCycleTimeFlow} ns. transfer cycle time per word in PIO, " + + if(ataIdentify.MinPIOCycleTimeFlow != 0) + ataOneValue.Add($"At minimum {ataIdentify.MinPIOCycleTimeFlow} ns. transfer cycle time per word in PIO, " + "with IORDY flow control"); - if(ataReport.MaxQueueDepth != 0) ataOneValue.Add($"{ataReport.MaxQueueDepth + 1} depth of queue maximum"); + if(ataIdentify.MaxQueueDepth != 0) + ataOneValue.Add($"{ataIdentify.MaxQueueDepth + 1} depth of queue maximum"); if(atapi) { - if(ataReport.PacketBusRelease != 0) - ataOneValue.Add($"{ataReport.PacketBusRelease} ns. typical to release bus from receipt of PACKET"); - if(ataReport.ServiceBusyClear != 0) + if(ataIdentify.PacketBusRelease != 0) ataOneValue - .Add($"{ataReport.ServiceBusyClear} ns. typical to clear BSY bit from receipt of SERVICE"); + .Add($"{ataIdentify.PacketBusRelease} ns. typical to release bus from receipt of PACKET"); + if(ataIdentify.ServiceBusyClear != 0) + ataOneValue + .Add($"{ataIdentify.ServiceBusyClear} ns. typical to clear BSY bit from receipt of SERVICE"); } - if(ataReport.TransportMajorVersionSpecified && ((ataReport.TransportMajorVersion & 0xF000) >> 12 == 0x1 || - (ataReport.TransportMajorVersion & 0xF000) >> 12 == 0xE)) + if((ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0x1 || + (ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0xE) { - if(!ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.Clear)) + if(!ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Clear)) { - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.Gen1Speed)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Gen1Speed)) ataOneValue.Add("SATA 1.5Gb/s is supported"); - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.Gen2Speed)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Gen2Speed)) ataOneValue.Add("SATA 3.0Gb/s is supported"); - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.Gen3Speed)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Gen3Speed)) ataOneValue.Add("SATA 6.0Gb/s is supported"); - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.PowerReceipt)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.PowerReceipt)) ataOneValue.Add("Receipt of host initiated power management requests is supported"); - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.PHYEventCounter)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.PHYEventCounter)) ataOneValue.Add("PHY Event counters are supported"); - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.HostSlumbTrans)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.HostSlumbTrans)) ataOneValue.Add("Supports host automatic partial to slumber transitions is supported"); - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.DevSlumbTrans)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.DevSlumbTrans)) ataOneValue.Add("Supports device automatic partial to slumber transitions is supported"); - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.NCQ)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.NCQ)) { ataOneValue.Add("NCQ is supported"); - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.NCQPriority)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.NCQPriority)) ataOneValue.Add("NCQ priority is supported"); - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.UnloadNCQ)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.UnloadNCQ)) ataOneValue.Add("Unload is supported with outstanding NCQ commands"); } } - if(ataReport.SATACapabilities2Specified && - !ataReport.SATACapabilities2.HasFlag(SATACapabilitiesBit2.Clear)) + if(!ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.Clear)) { - if(ataReport.SATACapabilitiesSpecified && - !ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.Clear) && - ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.NCQ)) + if(!ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Clear) && + ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.NCQ)) { - if(ataReport.SATACapabilities2.HasFlag(SATACapabilitiesBit2.NCQMgmt)) + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.NCQMgmt)) ataOneValue.Add("NCQ queue management is supported"); - if(ataReport.SATACapabilities2.HasFlag(SATACapabilitiesBit2.NCQStream)) + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.NCQStream)) ataOneValue.Add("NCQ streaming is supported"); } - if(ataReport.SATACapabilities2Specified && atapi) + if(atapi) { - if(ataReport.SATACapabilities2.HasFlag(SATACapabilitiesBit2.HostEnvDetect)) + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.HostEnvDetect)) ataOneValue.Add("ATAPI device supports host environment detection"); - if(ataReport.SATACapabilities2.HasFlag(SATACapabilitiesBit2.DevAttSlimline)) + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.DevAttSlimline)) ataOneValue.Add("ATAPI device supports attention on slimline connected devices"); } } } - if(ataReport.InterseekDelay != 0x0000 && ataReport.InterseekDelay != 0xFFFF) - ataOneValue.Add($"{ataReport.InterseekDelay} microseconds of interseek delay for ISO-7779 accoustic testing"); + if(ataIdentify.InterseekDelay != 0x0000 && ataIdentify.InterseekDelay != 0xFFFF) + ataOneValue.Add($"{ataIdentify.InterseekDelay} microseconds of interseek delay for ISO-7779 accoustic testing"); - if((ushort)ataReport.DeviceFormFactor != 0x0000 && (ushort)ataReport.DeviceFormFactor != 0xFFFF) - switch(ataReport.DeviceFormFactor) + if((ushort)ataIdentify.DeviceFormFactor != 0x0000 && (ushort)ataIdentify.DeviceFormFactor != 0xFFFF) + switch(ataIdentify.DeviceFormFactor) { - case DeviceFormFactorEnum.FiveAndQuarter: + case Identify.DeviceFormFactorEnum.FiveAndQuarter: ataOneValue.Add("Device nominal size is 5.25\""); break; - case DeviceFormFactorEnum.ThreeAndHalf: + case Identify.DeviceFormFactorEnum.ThreeAndHalf: ataOneValue.Add("Device nominal size is 3.5\""); break; - case DeviceFormFactorEnum.TwoAndHalf: + case Identify.DeviceFormFactorEnum.TwoAndHalf: ataOneValue.Add("Device nominal size is 2.5\""); break; - case DeviceFormFactorEnum.OnePointEight: + case Identify.DeviceFormFactorEnum.OnePointEight: ataOneValue.Add("Device nominal size is 1.8\""); break; - case DeviceFormFactorEnum.LessThanOnePointEight: + case Identify.DeviceFormFactorEnum.LessThanOnePointEight: ataOneValue.Add("Device nominal size is smaller than 1.8\""); break; default: - ataOneValue.Add($"Device nominal size field value {ataReport.DeviceFormFactor} is unknown"); + ataOneValue.Add($"Device nominal size field value {ataIdentify.DeviceFormFactor} is unknown"); break; } if(atapi) - if(ataReport.ATAPIByteCount > 0) - ataOneValue.Add($"{ataReport.ATAPIByteCount} bytes count limit for ATAPI"); + if(ataIdentify.ATAPIByteCount > 0) + ataOneValue.Add($"{ataIdentify.ATAPIByteCount} bytes count limit for ATAPI"); if(cfa) - if((ataReport.CFAPowerMode & 0x8000) == 0x8000) + if((ataIdentify.CFAPowerMode & 0x8000) == 0x8000) { ataOneValue.Add("CompactFlash device supports power mode 1"); - if((ataReport.CFAPowerMode & 0x2000) == 0x2000) + if((ataIdentify.CFAPowerMode & 0x2000) == 0x2000) ataOneValue.Add("CompactFlash power mode 1 required for one or more commands"); - if((ataReport.CFAPowerMode & 0x1000) == 0x1000) + if((ataIdentify.CFAPowerMode & 0x1000) == 0x1000) ataOneValue.Add("CompactFlash power mode 1 is disabled"); - ataOneValue.Add($"CompactFlash device uses a maximum of {ataReport.CFAPowerMode & 0x0FFF} mA"); + ataOneValue.Add($"CompactFlash device uses a maximum of {ataIdentify.CFAPowerMode & 0x0FFF} mA"); } - if(ataReport.CommandSetSpecified || ataReport.CommandSet2Specified || ataReport.CommandSet3Specified || - ataReport.CommandSet4Specified || - ataReport.CommandSet5Specified) ataOneValue.Add("Command set and features:"); - if(ataReport.CommandSetSpecified) - { - if(ataReport.CommandSet.HasFlag(CommandSetBit.Nop)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.Nop) && ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("NOP is supported and enabled"); - else - ataOneValue.Add("NOP is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.ReadBuffer)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.ReadBuffer) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("READ BUFFER is supported and enabled"); - else - ataOneValue.Add("READ BUFFER is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.WriteBuffer)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.WriteBuffer) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("WRITE BUFFER is supported and enabled"); - else - ataOneValue.Add("WRITE BUFFER is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.HPA)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.HPA) && ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("Host Protected Area is supported and enabled"); - else - ataOneValue.Add("Host Protected Area is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.DeviceReset)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.DeviceReset) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("DEVICE RESET is supported and enabled"); - else - ataOneValue.Add("DEVICE RESET is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.Service)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.Service) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("SERVICE interrupt is supported and enabled"); - else - ataOneValue.Add("SERVICE interrupt is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.Release)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.Release) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("Release is supported and enabled"); - else - ataOneValue.Add("Release is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.LookAhead)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.LookAhead) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("Look-ahead read is supported and enabled"); - else - ataOneValue.Add("Look-ahead read is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.WriteCache)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.WriteCache) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("Write cache is supported and enabled"); - else - ataOneValue.Add("Write cache is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.Packet)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.Packet) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("PACKET is supported and enabled"); - else - ataOneValue.Add("PACKET is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.PowerManagement)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.PowerManagement) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("Power management is supported and enabled"); - else - ataOneValue.Add("Power management is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.RemovableMedia)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.RemovableMedia) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("Removable media feature set is supported and enabled"); - else - ataOneValue.Add("Removable media feature set is supported"); - if(ataReport.CommandSet.HasFlag(CommandSetBit.SecurityMode)) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.SecurityMode) && - ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("Security mode is supported and enabled"); - else - ataOneValue.Add("Security mode is supported"); - if(ataReport.Capabilities.HasFlag(CapabilitiesBit.LBASupport)) - ataOneValue.Add("28-bit LBA is supported"); - } + ataOneValue.Add("Command set and features:"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Nop)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Nop) + ? "NOP is supported and enabled" + : "NOP is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.ReadBuffer)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.ReadBuffer) + ? "READ BUFFER is supported and enabled" + : "READ BUFFER is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.WriteBuffer)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.WriteBuffer) + ? "WRITE BUFFER is supported and enabled" + : "WRITE BUFFER is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.HPA)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.HPA) + ? "Host Protected Area is supported and enabled" + : "Host Protected Area is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.DeviceReset)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.DeviceReset) + ? "DEVICE RESET is supported and enabled" + : "DEVICE RESET is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Service)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Service) + ? "SERVICE interrupt is supported and enabled" + : "SERVICE interrupt is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Release)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Release) + ? "Release is supported and enabled" + : "Release is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.LookAhead)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.LookAhead) + ? "Look-ahead read is supported and enabled" + : "Look-ahead read is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.WriteCache)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.WriteCache) + ? "Write cache is supported and enabled" + : "Write cache is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Packet)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Packet) + ? "PACKET is supported and enabled" + : "PACKET is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.PowerManagement)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.PowerManagement) + ? "Power management is supported and enabled" + : "Power management is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.RemovableMedia)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.RemovableMedia) + ? "Removable media feature set is supported and enabled" + : "Removable media feature set is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.SecurityMode)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.SecurityMode) + ? "Security mode is supported and enabled" + : "Security mode is supported"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.LBASupport)) + ataOneValue.Add("28-bit LBA is supported"); - if(ataReport.CommandSet2Specified && ataReport.CommandSet2.HasFlag(CommandSetBit2.MustBeSet) && - !ataReport.CommandSet2.HasFlag(CommandSetBit2.MustBeClear)) + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.MustBeSet) && + !ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.MustBeClear)) { - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.LBA48)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.LBA48) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("48-bit LBA is supported and enabled"); - else - ataOneValue.Add("48-bit LBA is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.FlushCache)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.FlushCache) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("FLUSH CACHE is supported and enabled"); - else - ataOneValue.Add("FLUSH CACHE is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.FlushCacheExt)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.FlushCacheExt) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("FLUSH CACHE EXT is supported and enabled"); - else - ataOneValue.Add("FLUSH CACHE EXT is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.DCO)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.DCO) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("Device Configuration Overlay feature set is supported and enabled"); - else - ataOneValue.Add("Device Configuration Overlay feature set is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.AAM)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.AAM) && - ataReport.EnabledCommandSet2Specified) - ataOneValue - .Add($"Automatic Acoustic Management is supported and enabled with value {ataReport.CurrentAAM} (vendor recommends {ataReport.RecommendedAAM}"); - else - ataOneValue.Add("Automatic Acoustic Management is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.SetMax)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.SetMax) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("SET MAX security extension is supported and enabled"); - else - ataOneValue.Add("SET MAX security extension is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.AddressOffsetReservedAreaBoot)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.AddressOffsetReservedAreaBoot) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("Address Offset Reserved Area Boot is supported and enabled"); - else - ataOneValue.Add("Address Offset Reserved Area Boot is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.SetFeaturesRequired)) + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.LBA48)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.LBA48) + ? "48-bit LBA is supported and enabled" + : "48-bit LBA is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.FlushCache)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.FlushCache) + ? "FLUSH CACHE is supported and enabled" + : "FLUSH CACHE is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.FlushCacheExt)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.FlushCacheExt) + ? "FLUSH CACHE EXT is supported and enabled" + : "FLUSH CACHE EXT is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.DCO)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.DCO) + ? "Device Configuration Overlay feature set is supported and enabled" + : "Device Configuration Overlay feature set is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.AAM)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.AAM) + ? $"Automatic Acoustic Management is supported and enabled with value {ataIdentify.CurrentAAM} (vendor recommends {ataIdentify.RecommendedAAM}" + : "Automatic Acoustic Management is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.SetMax)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.SetMax) + ? "SET MAX security extension is supported and enabled" + : "SET MAX security extension is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.AddressOffsetReservedAreaBoot)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2 + .AddressOffsetReservedAreaBoot) + ? "Address Offset Reserved Area Boot is supported and enabled" + : "Address Offset Reserved Area Boot is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.SetFeaturesRequired)) ataOneValue.Add("SET FEATURES is required before spin-up"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.PowerUpInStandby)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.PowerUpInStandby) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("Power-up in standby is supported and enabled"); - else - ataOneValue.Add("Power-up in standby is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.RemovableNotification)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.RemovableNotification) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("Removable Media Status Notification is supported and enabled"); - else - ataOneValue.Add("Removable Media Status Notification is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.APM)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.APM) && - ataReport.EnabledCommandSet2Specified) - ataOneValue - .Add($"Advanced Power Management is supported and enabled with value {ataReport.CurrentAPM}"); - else - ataOneValue.Add("Advanced Power Management is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.CompactFlash)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.CompactFlash) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("CompactFlash feature set is supported and enabled"); - else - ataOneValue.Add("CompactFlash feature set is supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.RWQueuedDMA)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.RWQueuedDMA) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("READ DMA QUEUED and WRITE DMA QUEUED are supported and enabled"); - else - ataOneValue.Add("READ DMA QUEUED and WRITE DMA QUEUED are supported"); - if(ataReport.CommandSet2.HasFlag(CommandSetBit2.DownloadMicrocode)) - if(ataReport.EnabledCommandSet2.HasFlag(CommandSetBit2.DownloadMicrocode) && - ataReport.EnabledCommandSet2Specified) - ataOneValue.Add("DOWNLOAD MICROCODE is supported and enabled"); - else - ataOneValue.Add("DOWNLOAD MICROCODE is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.PowerUpInStandby)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.PowerUpInStandby) + ? "Power-up in standby is supported and enabled" + : "Power-up in standby is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.RemovableNotification)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2 + .RemovableNotification) + ? "Removable Media Status Notification is supported and enabled" + : "Removable Media Status Notification is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.APM)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.APM) + ? $"Advanced Power Management is supported and enabled with value {ataIdentify.CurrentAPM}" + : "Advanced Power Management is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.CompactFlash)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.CompactFlash) + ? "CompactFlash feature set is supported and enabled" + : "CompactFlash feature set is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.RWQueuedDMA)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.RWQueuedDMA) + ? "READ DMA QUEUED and WRITE DMA QUEUED are supported and enabled" + : "READ DMA QUEUED and WRITE DMA QUEUED are supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.DownloadMicrocode)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.DownloadMicrocode) + ? "DOWNLOAD MICROCODE is supported and enabled" + : "DOWNLOAD MICROCODE is supported"); } - if(ataReport.CommandSet.HasFlag(CommandSetBit.SMART) && ataReport.CommandSetSpecified) - if(ataReport.EnabledCommandSet.HasFlag(CommandSetBit.SMART) && ataReport.EnabledCommandSetSpecified) - ataOneValue.Add("S.M.A.R.T. is supported and enabled"); - else - ataOneValue.Add("S.M.A.R.T. is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.SMART)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.SMART) + ? "S.M.A.R.T. is supported and enabled" + : "S.M.A.R.T. is supported"); - if(ataReport.SCTCommandTransport.HasFlag(SCTCommandTransportBit.Supported) && - ataReport.SCTCommandTransportSpecified) ataOneValue.Add("S.M.A.R.T. Command Transport is supported"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.Supported)) + ataOneValue.Add("S.M.A.R.T. Command Transport is supported"); - if(ataReport.CommandSet3Specified && ataReport.CommandSet3.HasFlag(CommandSetBit3.MustBeSet) && - !ataReport.CommandSet3.HasFlag(CommandSetBit3.MustBeClear)) + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeSet) && + !ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeClear)) { - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.SMARTSelfTest)) - if(ataReport.EnabledCommandSet3.HasFlag(CommandSetBit3.SMARTSelfTest) && - ataReport.EnabledCommandSet3Specified) - ataOneValue.Add("S.M.A.R.T. self-testing is supported and enabled"); - else - ataOneValue.Add("S.M.A.R.T. self-testing is supported"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.SMARTLog)) - if(ataReport.EnabledCommandSet3.HasFlag(CommandSetBit3.SMARTLog) && - ataReport.EnabledCommandSet3Specified) - ataOneValue.Add("S.M.A.R.T. error logging is supported and enabled"); - else - ataOneValue.Add("S.M.A.R.T. error logging is supported"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.IdleImmediate)) - if(ataReport.EnabledCommandSet3.HasFlag(CommandSetBit3.IdleImmediate) && - ataReport.EnabledCommandSet3Specified) - ataOneValue.Add("IDLE IMMEDIATE with UNLOAD FEATURE is supported and enabled"); - else - ataOneValue.Add("IDLE IMMEDIATE with UNLOAD FEATURE is supported"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.WriteURG)) + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.SMARTSelfTest)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.SMARTSelfTest) + ? "S.M.A.R.T. self-testing is supported and enabled" + : "S.M.A.R.T. self-testing is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.SMARTLog)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.SMARTLog) + ? "S.M.A.R.T. error logging is supported and enabled" + : "S.M.A.R.T. error logging is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.IdleImmediate)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.IdleImmediate) + ? "IDLE IMMEDIATE with UNLOAD FEATURE is supported and enabled" + : "IDLE IMMEDIATE with UNLOAD FEATURE is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.WriteURG)) ataOneValue.Add("URG bit is supported in WRITE STREAM DMA EXT and WRITE STREAM EXT"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.ReadURG)) + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.ReadURG)) ataOneValue.Add("URG bit is supported in READ STREAM DMA EXT and READ STREAM EXT"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.WWN)) ataOneValue.Add("Device has a World Wide Name"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.FUAWriteQ)) - if(ataReport.EnabledCommandSet3.HasFlag(CommandSetBit3.FUAWriteQ) && - ataReport.EnabledCommandSet3Specified) - ataOneValue.Add("WRITE DMA QUEUED FUA EXT is supported and enabled"); - else - ataOneValue.Add("WRITE DMA QUEUED FUA EXT is supported"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.FUAWrite)) - if(ataReport.EnabledCommandSet3.HasFlag(CommandSetBit3.FUAWrite) && - ataReport.EnabledCommandSet3Specified) - ataOneValue.Add("WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported and enabled"); - else - ataOneValue.Add("WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.GPL)) - if(ataReport.EnabledCommandSet3.HasFlag(CommandSetBit3.GPL) && - ataReport.EnabledCommandSet3Specified) - ataOneValue.Add("General Purpose Logging is supported and enabled"); - else - ataOneValue.Add("General Purpose Logging is supported"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.Streaming)) - if(ataReport.EnabledCommandSet3.HasFlag(CommandSetBit3.Streaming) && - ataReport.EnabledCommandSet3Specified) - ataOneValue.Add("Streaming feature set is supported and enabled"); - else - ataOneValue.Add("Streaming feature set is supported"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.MCPT) && ataReport.EnabledCommandSet3Specified) - ataOneValue.Add(ataReport.EnabledCommandSet3.HasFlag(CommandSetBit3.MCPT) + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.WWN)) + ataOneValue.Add("Device has a World Wide Name"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.FUAWriteQ)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.FUAWriteQ) + ? "WRITE DMA QUEUED FUA EXT is supported and enabled" + : "WRITE DMA QUEUED FUA EXT is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.FUAWrite)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.FUAWrite) + ? "WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported and enabled" + : "WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.GPL)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.GPL) + ? "General Purpose Logging is supported and enabled" + : "General Purpose Logging is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.Streaming)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.Streaming) + ? "Streaming feature set is supported and enabled" + : "Streaming feature set is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MCPT)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MCPT) ? "Media Card Pass Through command set is supported and enabled" : "Media Card Pass Through command set is supported"); - if(ataReport.CommandSet3.HasFlag(CommandSetBit3.MediaSerial) && ataReport.EnabledCommandSet3Specified) - ataOneValue.Add(ataReport.EnabledCommandSet3.HasFlag(CommandSetBit3.MediaSerial) + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial) ? "Media Serial is supported and valid" : "Media Serial is supported"); } - if(ataReport.CommandSet4Specified && ataReport.CommandSet4.HasFlag(CommandSetBit4.MustBeSet) && - !ataReport.CommandSet4.HasFlag(CommandSetBit4.MustBeClear)) + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.MustBeSet) && + !ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.MustBeClear)) { - if(ataReport.CommandSet4.HasFlag(CommandSetBit4.DSN)) - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.DSN) && - ataReport.EnabledCommandSet4Specified) - ataOneValue.Add("DSN feature set is supported and enabled"); - else - ataOneValue.Add("DSN feature set is supported"); - if(ataReport.CommandSet4.HasFlag(CommandSetBit4.AMAC)) - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.AMAC) && - ataReport.EnabledCommandSet4Specified) - ataOneValue.Add("Accessible Max Address Configuration is supported and enabled"); - else - ataOneValue.Add("Accessible Max Address Configuration is supported"); - if(ataReport.CommandSet4.HasFlag(CommandSetBit4.ExtPowerCond)) - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.ExtPowerCond) && - ataReport.EnabledCommandSet4Specified) - ataOneValue.Add("Extended Power Conditions are supported and enabled"); - else - ataOneValue.Add("Extended Power Conditions are supported"); - if(ataReport.CommandSet4.HasFlag(CommandSetBit4.ExtStatusReport)) - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.ExtStatusReport) && - ataReport.EnabledCommandSet4Specified) - ataOneValue.Add("Extended Status Reporting is supported and enabled"); - else - ataOneValue.Add("Extended Status Reporting is supported"); - if(ataReport.CommandSet4.HasFlag(CommandSetBit4.FreeFallControl)) - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.FreeFallControl) && - ataReport.EnabledCommandSet4Specified) - ataOneValue.Add("Free-fall control feature set is supported and enabled"); - else - ataOneValue.Add("Free-fall control feature set is supported"); - if(ataReport.CommandSet4.HasFlag(CommandSetBit4.SegmentedDownloadMicrocode)) - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.SegmentedDownloadMicrocode) && - ataReport.EnabledCommandSet4Specified) - ataOneValue.Add("Segmented feature in DOWNLOAD MICROCODE is supported and enabled"); - else - ataOneValue.Add("Segmented feature in DOWNLOAD MICROCODE is supported"); - if(ataReport.CommandSet4.HasFlag(CommandSetBit4.RWDMAExtGpl)) - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.RWDMAExtGpl) && - ataReport.EnabledCommandSet4Specified) - ataOneValue.Add("READ/WRITE DMA EXT GPL are supported and enabled"); - else - ataOneValue.Add("READ/WRITE DMA EXT GPL are supported"); - if(ataReport.CommandSet4.HasFlag(CommandSetBit4.WriteUnc)) - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.WriteUnc) && - ataReport.EnabledCommandSet4Specified) - ataOneValue.Add("WRITE UNCORRECTABLE is supported and enabled"); - else - ataOneValue.Add("WRITE UNCORRECTABLE is supported"); - if(ataReport.CommandSet4.HasFlag(CommandSetBit4.WRV)) + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.DSN)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.DSN) + ? "DSN feature set is supported and enabled" + : "DSN feature set is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.AMAC)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.AMAC) + ? "Accessible Max Address Configuration is supported and enabled" + : "Accessible Max Address Configuration is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.ExtPowerCond)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.ExtPowerCond) + ? "Extended Power Conditions are supported and enabled" + : "Extended Power Conditions are supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.ExtStatusReport)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.ExtStatusReport) + ? "Extended Status Reporting is supported and enabled" + : "Extended Status Reporting is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.FreeFallControl)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.FreeFallControl) + ? "Free-fall control feature set is supported and enabled" + : "Free-fall control feature set is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.SegmentedDownloadMicrocode)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4 + .SegmentedDownloadMicrocode) + ? "Segmented feature in DOWNLOAD MICROCODE is supported and enabled" + : "Segmented feature in DOWNLOAD MICROCODE is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.RWDMAExtGpl)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.RWDMAExtGpl) + ? "READ/WRITE DMA EXT GPL are supported and enabled" + : "READ/WRITE DMA EXT GPL are supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.WriteUnc)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.WriteUnc) + ? "WRITE UNCORRECTABLE is supported and enabled" + : "WRITE UNCORRECTABLE is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.WRV)) { - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.WRV) && ataReport.EnabledCommandSet4Specified - ) ataOneValue.Add("Write/Read/Verify is supported and enabled"); - else ataOneValue.Add("Write/Read/Verify is supported"); - ataOneValue.Add($"{ataReport.WRVSectorCountMode2} sectors for Write/Read/Verify mode 2"); - ataOneValue.Add($"{ataReport.WRVSectorCountMode3} sectors for Write/Read/Verify mode 3"); - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.WRV) && ataReport.EnabledCommandSet4Specified - ) ataOneValue.Add($"Current Write/Read/Verify mode: {ataReport.WRVMode}"); + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.WRV) + ? "Write/Read/Verify is supported and enabled" + : "Write/Read/Verify is supported"); + ataOneValue.Add($"{ataIdentify.WRVSectorCountMode2} sectors for Write/Read/Verify mode 2"); + ataOneValue.Add($"{ataIdentify.WRVSectorCountMode3} sectors for Write/Read/Verify mode 3"); + if(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.WRV)) + ataOneValue.Add($"Current Write/Read/Verify mode: {ataIdentify.WRVMode}"); } - if(ataReport.CommandSet4.HasFlag(CommandSetBit4.DT1825)) - if(ataReport.EnabledCommandSet4.HasFlag(CommandSetBit4.DT1825) && - ataReport.EnabledCommandSet4Specified) - ataOneValue.Add("DT1825 is supported and enabled"); - else - ataOneValue.Add("DT1825 is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.DT1825)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.DT1825) + ? "DT1825 is supported and enabled" + : "DT1825 is supported"); } - if(ataReport.Capabilities3Specified) + if(true) { - if(ataReport.Capabilities3.HasFlag(CapabilitiesBit3.BlockErase)) + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.BlockErase)) ataOneValue.Add("BLOCK ERASE EXT is supported"); - if(ataReport.Capabilities3.HasFlag(CapabilitiesBit3.Overwrite)) + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.Overwrite)) ataOneValue.Add("OVERWRITE EXT is supported"); - if(ataReport.Capabilities3.HasFlag(CapabilitiesBit3.CryptoScramble)) + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.CryptoScramble)) ataOneValue.Add("CRYPTO SCRAMBLE EXT is supported"); } - if(ataReport.CommandSet5Specified) + if(true) { - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.DeviceConfDMA)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.DeviceConfDMA)) ataOneValue.Add("DEVICE CONFIGURATION IDENTIFY DMA and DEVICE CONFIGURATION SET DMA are supported"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.ReadBufferDMA)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ReadBufferDMA)) ataOneValue.Add("READ BUFFER DMA is supported"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.WriteBufferDMA)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.WriteBufferDMA)) ataOneValue.Add("WRITE BUFFER DMA is supported"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.DownloadMicroCodeDMA)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.DownloadMicroCodeDMA)) ataOneValue.Add("DOWNLOAD MICROCODE DMA is supported"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.SetMaxDMA)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.SetMaxDMA)) ataOneValue.Add("SET PASSWORD DMA and SET UNLOCK DMA are supported"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.Ata28)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.Ata28)) ataOneValue.Add("Not all 28-bit commands are supported"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.CFast)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.CFast)) ataOneValue.Add("Device follows CFast specification"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.IEEE1667)) ataOneValue.Add("Device follows IEEE-1667"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.IEEE1667)) + ataOneValue.Add("Device follows IEEE-1667"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.DeterministicTrim)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.DeterministicTrim)) { ataOneValue.Add("Read after TRIM is deterministic"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.ReadZeroTrim)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ReadZeroTrim)) ataOneValue.Add("Read after TRIM returns empty data"); } - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.LongPhysSectorAligError)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.LongPhysSectorAligError)) ataOneValue.Add("Device supports Long Physical Sector Alignment Error Reporting Control"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.Encrypted)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.Encrypted)) ataOneValue.Add("Device encrypts all user data"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.AllCacheNV)) + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.AllCacheNV)) ataOneValue.Add("Device's write cache is non-volatile"); - if(ataReport.CommandSet5.HasFlag(CommandSetBit5.ZonedBit0) || - ataReport.CommandSet5.HasFlag(CommandSetBit5.ZonedBit1)) ataOneValue.Add("Device is zoned"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ZonedBit0) || + ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ZonedBit1)) + ataOneValue.Add("Device is zoned"); } - if(ataReport.Capabilities3Specified) - if(ataReport.Capabilities3.HasFlag(CapabilitiesBit3.Sanitize)) + if(true) + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.Sanitize)) { ataOneValue.Add("Sanitize feature set is supported"); - ataOneValue.Add(ataReport.Capabilities3.HasFlag(CapabilitiesBit3.SanitizeCommands) + ataOneValue.Add(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.SanitizeCommands) ? "Sanitize commands are specified by ACS-3 or higher" : "Sanitize commands are specified by ACS-2"); - if(ataReport.Capabilities3.HasFlag(CapabilitiesBit3.SanitizeAntifreeze)) + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.SanitizeAntifreeze)) ataOneValue.Add("SANITIZE ANTIFREEZE LOCK EXT is supported"); } - if(!ata1 && maxatalevel >= 8 && ataReport.TrustedComputingSpecified) - if(ataReport.TrustedComputing.HasFlag(TrustedComputingBit.Set) && - !ataReport.TrustedComputing.HasFlag(TrustedComputingBit.Clear) && - ataReport.TrustedComputing.HasFlag(TrustedComputingBit.TrustedComputing)) + if(!ata1 && maxatalevel >= 8) + if(ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.Set) && + !ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.Clear) && + ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.TrustedComputing)) ataOneValue.Add("Trusted Computing feature set is supported"); - if(ataReport.TransportMajorVersionSpecified && ((ataReport.TransportMajorVersion & 0xF000) >> 12 == 0x1 || - (ataReport.TransportMajorVersion & 0xF000) >> 12 == 0xE)) + if((ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0x1 || + (ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0xE) { - if(ataReport.SATACapabilitiesSpecified) - if(!ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.Clear)) - if(ataReport.SATACapabilities.HasFlag(SATACapabilitiesBit.ReadLogDMAExt)) + if(true) + if(!ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Clear)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.ReadLogDMAExt)) ataOneValue.Add("READ LOG DMA EXT is supported"); - if(ataReport.SATACapabilities2Specified) - if(!ataReport.SATACapabilities2.HasFlag(SATACapabilitiesBit2.Clear)) - if(ataReport.SATACapabilities2.HasFlag(SATACapabilitiesBit2.FPDMAQ)) + if(true) + if(!ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.Clear)) + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.FPDMAQ)) ataOneValue.Add("RECEIVE FPDMA QUEUED and SEND FPDMA QUEUED are supported"); - if(ataReport.SATAFeaturesSpecified) - if(!ataReport.SATAFeatures.HasFlag(SATAFeaturesBit.Clear)) + if(true) + if(!ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.Clear)) { - if(ataReport.SATAFeatures.HasFlag(SATAFeaturesBit.NonZeroBufferOffset)) - if(ataReport.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.NonZeroBufferOffset) && - ataReport.EnabledSATAFeaturesSpecified) - ataOneValue.Add("Non-zero buffer offsets are supported and enabled"); - else - ataOneValue.Add("Non-zero buffer offsets are supported"); - if(ataReport.SATAFeatures.HasFlag(SATAFeaturesBit.DMASetup)) - if(ataReport.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.DMASetup) && - ataReport.EnabledSATAFeaturesSpecified) - ataOneValue.Add("DMA Setup auto-activation is supported and enabled"); - else - ataOneValue.Add("DMA Setup auto-activation is supported"); - if(ataReport.SATAFeatures.HasFlag(SATAFeaturesBit.InitPowerMgmt)) - if(ataReport.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.InitPowerMgmt) && - ataReport.EnabledSATAFeaturesSpecified) - ataOneValue.Add("Device-initiated power management is supported and enabled"); - else - ataOneValue.Add("Device-initiated power management is supported"); - if(ataReport.SATAFeatures.HasFlag(SATAFeaturesBit.InOrderData)) - if(ataReport.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.InOrderData) && - ataReport.EnabledSATAFeaturesSpecified) - ataOneValue.Add("In-order data delivery is supported and enabled"); - else - ataOneValue.Add("In-order data delivery is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.NonZeroBufferOffset)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit + .NonZeroBufferOffset) + ? "Non-zero buffer offsets are supported and enabled" + : "Non-zero buffer offsets are supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.DMASetup)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.DMASetup) + ? "DMA Setup auto-activation is supported and enabled" + : "DMA Setup auto-activation is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.InitPowerMgmt)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit + .InitPowerMgmt) + ? "Device-initiated power management is supported and enabled" + : "Device-initiated power management is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.InOrderData)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures + .HasFlag(Identify.SATAFeaturesBit.InOrderData) + ? "In-order data delivery is supported and enabled" + : "In-order data delivery is supported"); if(!atapi) - if(ataReport.SATAFeatures.HasFlag(SATAFeaturesBit.HardwareFeatureControl)) - if(ataReport.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.HardwareFeatureControl) && - ataReport.EnabledSATAFeaturesSpecified) - ataOneValue.Add("Hardware Feature Control is supported and enabled"); - else - ataOneValue.Add("Hardware Feature Control is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.HardwareFeatureControl)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit + .HardwareFeatureControl) + ? "Hardware Feature Control is supported and enabled" + : "Hardware Feature Control is supported"); if(atapi) - if(ataReport.SATAFeatures.HasFlag(SATAFeaturesBit.AsyncNotification) && - ataReport.EnabledSATAFeaturesSpecified) - if(ataReport.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.AsyncNotification) && - ataReport.EnabledSATAFeaturesSpecified) + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.AsyncNotification)) + if(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.AsyncNotification)) ataOneValue.Add("Asynchronous notification is supported"); else ataOneValue.Add("Asynchronous notification is supported"); - if(ataReport.SATAFeatures.HasFlag(SATAFeaturesBit.SettingsPreserve)) - if(ataReport.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.SettingsPreserve) && - ataReport.EnabledSATAFeaturesSpecified) + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.SettingsPreserve)) + if(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.SettingsPreserve)) ataOneValue.Add("Software Settings Preservation is supported"); else ataOneValue.Add("Software Settings Preservation is supported"); - if(ataReport.SATAFeatures.HasFlag(SATAFeaturesBit.NCQAutoSense)) + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.NCQAutoSense)) ataOneValue.Add("NCQ Autosense is supported"); - if(ataReport.EnabledSATAFeatures.HasFlag(SATAFeaturesBit.EnabledSlumber)) + if(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.EnabledSlumber)) ataOneValue.Add("Automatic Partial to Slumber transitions are enabled"); } } - if((ataReport.RemovableStatusSet & 0x03) > 0) + if((ataIdentify.RemovableStatusSet & 0x03) > 0) ataOneValue.Add("Removable Media Status Notification feature set is supported"); - if(ataReport.FreeFallSensitivity != 0x00 && ataReport.FreeFallSensitivity != 0xFF) - ataOneValue.Add($"Free-fall sensitivity set to {ataReport.FreeFallSensitivity}"); + if(ataIdentify.FreeFallSensitivity != 0x00 && ataIdentify.FreeFallSensitivity != 0xFF) + ataOneValue.Add($"Free-fall sensitivity set to {ataIdentify.FreeFallSensitivity}"); - if(ataReport.DataSetMgmtSpecified && ataReport.DataSetMgmt.HasFlag(DataSetMgmtBit.Trim)) - ataOneValue.Add("TRIM is supported"); - if(ataReport.DataSetMgmtSizeSpecified && ataReport.DataSetMgmtSize > 0) - ataOneValue.Add($"DATA SET MANAGEMENT can receive a maximum of {ataReport.DataSetMgmtSize} blocks of 512 bytes"); + if(ataIdentify.DataSetMgmt.HasFlag(Identify.DataSetMgmtBit.Trim)) ataOneValue.Add("TRIM is supported"); + if(ataIdentify.DataSetMgmtSize > 0) + ataOneValue.Add($"DATA SET MANAGEMENT can receive a maximum of {ataIdentify.DataSetMgmtSize} blocks of 512 bytes"); - if(ataReport.SecurityStatusSpecified && ataReport.SecurityStatus.HasFlag(SecurityStatusBit.Supported)) + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Supported)) { ataOneValue.Add("Security:"); - if(ataReport.SecurityStatus.HasFlag(SecurityStatusBit.Enabled)) + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Enabled)) { ataOneValue.Add("Security is enabled"); - ataOneValue.Add(ataReport.SecurityStatus.HasFlag(SecurityStatusBit.Locked) + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Locked) ? "Security is locked" : "Security is not locked"); - ataOneValue.Add(ataReport.SecurityStatus.HasFlag(SecurityStatusBit.Frozen) + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Frozen) ? "Security is frozen" : "Security is not frozen"); - ataOneValue.Add(ataReport.SecurityStatus.HasFlag(SecurityStatusBit.Expired) + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Expired) ? "Security count has expired" : "Security count has notexpired"); - ataOneValue.Add(ataReport.SecurityStatus.HasFlag(SecurityStatusBit.Maximum) + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Maximum) ? "Security level is maximum" : "Security level is high"); } else ataOneValue.Add("Security is not enabled"); - if(ataReport.SecurityStatus.HasFlag(SecurityStatusBit.Enhanced)) + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Enhanced)) ataOneValue.Add("Supports enhanced security erase"); - ataOneValue.Add($"{ataReport.SecurityEraseTime * 2} minutes to complete secure erase"); - if(ataReport.SecurityStatus.HasFlag(SecurityStatusBit.Enhanced)) + ataOneValue.Add($"{ataIdentify.SecurityEraseTime * 2} minutes to complete secure erase"); + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Enhanced)) ataOneValue - .Add($"{ataReport.EnhancedSecurityEraseTime * 2} minutes to complete enhanced secure erase"); + .Add($"{ataIdentify.EnhancedSecurityEraseTime * 2} minutes to complete enhanced secure erase"); - ataOneValue.Add($"Master password revision code: {ataReport.MasterPasswordRevisionCode}"); + ataOneValue.Add($"Master password revision code: {ataIdentify.MasterPasswordRevisionCode}"); } - if(ataReport.CommandSet3Specified && - ataReport.CommandSet3.HasFlag(CommandSetBit3.MustBeSet) && - !ataReport.CommandSet3.HasFlag(CommandSetBit3.MustBeClear) && - ataReport.CommandSet3.HasFlag(CommandSetBit3.Streaming)) + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeSet) && + !ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeClear) && + ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.Streaming)) { ataOneValue.Add("Streaming:"); - ataOneValue.Add($"Minimum request size is {ataReport.StreamMinReqSize}"); - ataOneValue.Add($"Streaming transfer time in PIO is {ataReport.StreamTransferTimePIO}"); - ataOneValue.Add($"Streaming transfer time in DMA is {ataReport.StreamTransferTimeDMA}"); - ataOneValue.Add($"Streaming access latency is {ataReport.StreamAccessLatency}"); - ataOneValue.Add($"Streaming performance granularity is {ataReport.StreamPerformanceGranularity}"); + ataOneValue.Add($"Minimum request size is {ataIdentify.StreamMinReqSize}"); + ataOneValue.Add($"Streaming transfer time in PIO is {ataIdentify.StreamTransferTimePIO}"); + ataOneValue.Add($"Streaming transfer time in DMA is {ataIdentify.StreamTransferTimeDMA}"); + ataOneValue.Add($"Streaming access latency is {ataIdentify.StreamAccessLatency}"); + ataOneValue.Add($"Streaming performance granularity is {ataIdentify.StreamPerformanceGranularity}"); } - if(ataReport.SCTCommandTransportSpecified && - ataReport.SCTCommandTransport.HasFlag(SCTCommandTransportBit.Supported)) + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.Supported)) { ataOneValue.Add("S.M.A.R.T. Command Transport (SCT):"); - if(ataReport.SCTCommandTransport.HasFlag(SCTCommandTransportBit.LongSectorAccess)) + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.LongSectorAccess)) ataOneValue.Add("SCT Long Sector Address is supported"); - if(ataReport.SCTCommandTransport.HasFlag(SCTCommandTransportBit.WriteSame)) + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.WriteSame)) ataOneValue.Add("SCT Write Same is supported"); - if(ataReport.SCTCommandTransport.HasFlag(SCTCommandTransportBit.ErrorRecoveryControl)) + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.ErrorRecoveryControl)) ataOneValue.Add("SCT Error Recovery Control is supported"); - if(ataReport.SCTCommandTransport.HasFlag(SCTCommandTransportBit.FeaturesControl)) + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.FeaturesControl)) ataOneValue.Add("SCT Features Control is supported"); - if(ataReport.SCTCommandTransport.HasFlag(SCTCommandTransportBit.DataTables)) + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.DataTables)) ataOneValue.Add("SCT Data Tables are supported"); } - if(ataReport.NVCacheCapsSpecified && (ataReport.NVCacheCaps & 0x0010) == 0x0010) + if((ataIdentify.NVCacheCaps & 0x0010) == 0x0010) { ataOneValue.Add("Non-Volatile Cache:"); - ataOneValue.Add($"Version {(ataReport.NVCacheCaps & 0xF000) >> 12}"); - if((ataReport.NVCacheCaps & 0x0001) == 0x0001) + ataOneValue.Add($"Version {(ataIdentify.NVCacheCaps & 0xF000) >> 12}"); + if((ataIdentify.NVCacheCaps & 0x0001) == 0x0001) { - ataOneValue.Add((ataReport.NVCacheCaps & 0x0002) == 0x0002 + ataOneValue.Add((ataIdentify.NVCacheCaps & 0x0002) == 0x0002 ? "Power mode feature set is supported and enabled" : "Power mode feature set is supported"); - ataOneValue.Add($"Version {(ataReport.NVCacheCaps & 0x0F00) >> 8}"); + ataOneValue.Add($"Version {(ataIdentify.NVCacheCaps & 0x0F00) >> 8}"); } - ataOneValue.Add($"Non-Volatile Cache is {ataReport.NVCacheSize * logicalsectorsize} bytes"); + ataOneValue.Add($"Non-Volatile Cache is {ataIdentify.NVCacheSize * logicalsectorsize} bytes"); } if(ataReport.ReadCapabilities != null) @@ -1489,7 +1353,7 @@ namespace DiscImageChef.Server.App_Start removable = false; ataOneValue.Add(""); - if(ataReport.ReadCapabilities.NominalRotationRateSpecified && + if(ataReport.ReadCapabilities.NominalRotationRate != null && ataReport.ReadCapabilities.NominalRotationRate != 0x0000 && ataReport.ReadCapabilities.NominalRotationRate != 0xFFFF) ataOneValue.Add(ataReport.ReadCapabilities.NominalRotationRate == 0x0001 @@ -1498,26 +1362,23 @@ namespace DiscImageChef.Server.App_Start if(!atapi) { - if(ataReport.ReadCapabilities.BlockSizeSpecified) + if(ataReport.ReadCapabilities.BlockSize != null) { ataTwoValue.Add("Logical sector size", $"{ataReport.ReadCapabilities.BlockSize} bytes"); - logicalsectorsize = ataReport.ReadCapabilities.BlockSize; + logicalsectorsize = ataReport.ReadCapabilities.BlockSize.Value; } - if(ataReport.ReadCapabilities.PhysicalBlockSizeSpecified) + if(ataReport.ReadCapabilities.PhysicalBlockSize != null) ataTwoValue.Add("Physical sector size", $"{ataReport.ReadCapabilities.PhysicalBlockSize} bytes"); - if(ataReport.ReadCapabilities.LongBlockSizeSpecified) + if(ataReport.ReadCapabilities.LongBlockSize != null) ataTwoValue.Add("READ LONG sector size", $"{ataReport.ReadCapabilities.LongBlockSize} bytes"); - if(ataReport.ReadCapabilities - .BlockSizeSpecified && - ataReport.ReadCapabilities - .PhysicalBlockSizeSpecified && - ataReport.ReadCapabilities.BlockSize != - ataReport.ReadCapabilities.PhysicalBlockSize && - (ataReport.ReadCapabilities.LogicalAlignment & 0x8000) == - 0x0000 && + if(ataReport.ReadCapabilities.BlockSize != null && + ataReport.ReadCapabilities.PhysicalBlockSize != null && + ataReport.ReadCapabilities.BlockSize.Value != + ataReport.ReadCapabilities.PhysicalBlockSize.Value && + (ataReport.ReadCapabilities.LogicalAlignment & 0x8000) == 0x0000 && (ataReport.ReadCapabilities.LogicalAlignment & 0x4000) == 0x4000) ataOneValue .Add($"Logical sector starts at offset {ataReport.ReadCapabilities.LogicalAlignment & 0x3FFF} from physical sector"); @@ -1552,7 +1413,7 @@ namespace DiscImageChef.Server.App_Start $"{(ulong)currentSectors * logicalsectorsize} bytes, {(ulong)currentSectors * logicalsectorsize / 1000 / 1000} Mb, {(double)((ulong)currentSectors * logicalsectorsize) / 1024 / 1024:F2} MiB"); } - if(ataReport.ReadCapabilities.LBASectorsSpecified) + if(ataReport.ReadCapabilities.LBASectors != null) { ataTwoValue.Add("Sectors addressable in sectors in 28-bit LBA mode", $"{ataReport.ReadCapabilities.LBASectors}"); @@ -1568,7 +1429,7 @@ namespace DiscImageChef.Server.App_Start $"{(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize} bytes, {(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1000 / 1000} Mb, {(double)((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize) / 1024 / 1024:F2} MiB"); } - if(ataReport.ReadCapabilities.LBA48SectorsSpecified) + if(ataReport.ReadCapabilities.LBA48Sectors != null) { ataTwoValue.Add("Sectors addressable in sectors in 48-bit LBA mode", $"{ataReport.ReadCapabilities.LBA48Sectors}"); @@ -1595,39 +1456,40 @@ namespace DiscImageChef.Server.App_Start } } - if(ataReport.ReadCapabilities.SupportsRead) + if(ataReport.ReadCapabilities.SupportsReadSectors == true) ataOneValue.Add("Device supports READ SECTOR(S) command in CHS mode"); - if(ataReport.ReadCapabilities.SupportsReadRetry) + if(ataReport.ReadCapabilities.SupportsReadRetry == true) ataOneValue.Add("Device supports READ SECTOR(S) RETRY command in CHS mode"); - if(ataReport.ReadCapabilities.SupportsReadDma) + if(ataReport.ReadCapabilities.SupportsReadDma == true) ataOneValue.Add("Device supports READ DMA command in CHS mode"); - if(ataReport.ReadCapabilities.SupportsReadDmaRetry) + if(ataReport.ReadCapabilities.SupportsReadDmaRetry == true) ataOneValue.Add("Device supports READ DMA RETRY command in CHS mode"); - if(ataReport.ReadCapabilities.SupportsReadLong) + if(ataReport.ReadCapabilities.SupportsReadLong == true) ataOneValue.Add("Device supports READ LONG command in CHS mode"); - if(ataReport.ReadCapabilities.SupportsReadLongRetry) + if(ataReport.ReadCapabilities.SupportsReadLongRetry == true) ataOneValue.Add("Device supports READ LONG RETRY command in CHS mode"); - if(ataReport.ReadCapabilities.SupportsReadLba) + if(ataReport.ReadCapabilities.SupportsReadLba == true) ataOneValue.Add("Device supports READ SECTOR(S) command in 28-bit LBA mode"); - if(ataReport.ReadCapabilities.SupportsReadRetryLba) + if(ataReport.ReadCapabilities.SupportsReadRetryLba == true) ataOneValue.Add("Device supports READ SECTOR(S) RETRY command in 28-bit LBA mode"); - if(ataReport.ReadCapabilities.SupportsReadDmaLba) + if(ataReport.ReadCapabilities.SupportsReadDmaLba == true) ataOneValue.Add("Device supports READ DMA command in 28-bit LBA mode"); - if(ataReport.ReadCapabilities.SupportsReadDmaRetryLba) + if(ataReport.ReadCapabilities.SupportsReadDmaRetryLba == true) ataOneValue.Add("Device supports READ DMA RETRY command in 28-bit LBA mode"); - if(ataReport.ReadCapabilities.SupportsReadLongLba) + if(ataReport.ReadCapabilities.SupportsReadLongLba == true) ataOneValue.Add("Device supports READ LONG command in 28-bit LBA mode"); - if(ataReport.ReadCapabilities.SupportsReadLongRetryLba) + if(ataReport.ReadCapabilities.SupportsReadLongRetryLba == true) ataOneValue.Add("Device supports READ LONG RETRY command in 28-bit LBA mode"); - if(ataReport.ReadCapabilities.SupportsReadLba48) + if(ataReport.ReadCapabilities.SupportsReadLba48 == true) ataOneValue.Add("Device supports READ SECTOR(S) command in 48-bit LBA mode"); - if(ataReport.ReadCapabilities.SupportsReadDmaLba48) + if(ataReport.ReadCapabilities.SupportsReadDmaLba48 == true) ataOneValue.Add("Device supports READ DMA command in 48-bit LBA mode"); - if(ataReport.ReadCapabilities.SupportsSeek) ataOneValue.Add("Device supports SEEK command in CHS mode"); - if(ataReport.ReadCapabilities.SupportsSeekLba) + if(ataReport.ReadCapabilities.SupportsSeek == true) + ataOneValue.Add("Device supports SEEK command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsSeekLba == true) ataOneValue.Add("Device supports SEEK command in 28-bit LBA mode"); } else testedMedia = ataReport.RemovableMedias; diff --git a/DiscImageChef.Server/App_Start/ScsiEvpd.cs b/DiscImageChef.Server/App_Start/ScsiEvpd.cs index 3b255bbf9..5e54828ab 100644 --- a/DiscImageChef.Server/App_Start/ScsiEvpd.cs +++ b/DiscImageChef.Server/App_Start/ScsiEvpd.cs @@ -34,7 +34,7 @@ using System.Collections.Generic; using DiscImageChef.CommonTypes.Metadata; using DiscImageChef.Decoders.SCSI; -namespace DiscImageChef.Server.App_Start +namespace DiscImageChef.Server { public static class ScsiEvpd { @@ -45,9 +45,9 @@ namespace DiscImageChef.Server.App_Start /// EVPD pages /// SCSI vendor string /// List to put the key=value pairs on - public static void Report(pageType[] pages, string vendor, ref Dictionary evpdPages) + public static void Report(IEnumerable pages, string vendor, ref Dictionary evpdPages) { - foreach(pageType evpd in pages) + foreach(ScsiPage evpd in pages) { string decoded; if(evpd.page >= 0x01 && evpd.page <= 0x7F) decoded = EVPD.DecodeASCIIPage(evpd.value); diff --git a/DiscImageChef.Server/App_Start/ScsiInquiry.cs b/DiscImageChef.Server/App_Start/ScsiInquiry.cs index 21152619d..21116a619 100644 --- a/DiscImageChef.Server/App_Start/ScsiInquiry.cs +++ b/DiscImageChef.Server/App_Start/ScsiInquiry.cs @@ -31,10 +31,9 @@ // ****************************************************************************/ using System.Collections.Generic; -using DiscImageChef.CommonTypes.Metadata; using DiscImageChef.Decoders.SCSI; -namespace DiscImageChef.Server.App_Start +namespace DiscImageChef.Server { static class ScsiInquiry { @@ -42,13 +41,17 @@ namespace DiscImageChef.Server.App_Start /// Takes the SCSI INQUIRY part of a device report and prints it as a list of values to be sequenced by ASP.NET in the /// rendering /// - /// INQUIRY part of the report + /// INQUIRY part of the report /// List of values - internal static List Report(scsiInquiryType inquiry) + internal static IEnumerable Report(Inquiry.SCSIInquiry? inquiryNullable) { List scsiOneValue = new List(); - switch(inquiry.PeripheralQualifier) + if(!inquiryNullable.HasValue) return scsiOneValue; + + Inquiry.SCSIInquiry inquiry = inquiryNullable.Value; + + switch((PeripheralQualifiers)inquiry.PeripheralQualifier) { case PeripheralQualifiers.Supported: scsiOneValue.Add("Device is connected and supported."); @@ -67,7 +70,7 @@ namespace DiscImageChef.Server.App_Start break; } - switch(inquiry.PeripheralDeviceType) + switch((PeripheralDeviceTypes)inquiry.PeripheralDeviceType) { case PeripheralDeviceTypes.DirectAccess: //0x00, scsiOneValue.Add("Direct-access device"); @@ -200,35 +203,34 @@ namespace DiscImageChef.Server.App_Start break; } - if(inquiry.Removable) scsiOneValue.Add("Device is removable"); - if(inquiry.AERCSupported) scsiOneValue.Add("Device supports Asynchronous Event Reporting Capability"); - if(inquiry.TerminateTaskSupported) scsiOneValue.Add("Device supports TERMINATE TASK command"); - if(inquiry.NormalACA) scsiOneValue.Add("Device supports setting Normal ACA"); - if(inquiry.HierarchicalLUN) scsiOneValue.Add("Device supports LUN hierarchical addressing"); - if(inquiry.StorageArrayController) scsiOneValue.Add("Device contains an embedded storage array controller"); - if(inquiry.AccessControlCoordinator) scsiOneValue.Add("Device contains an Access Control Coordinator"); - if(inquiry.ThirdPartyCopy) scsiOneValue.Add("Device supports third-party copy commands"); - if(inquiry.Protection) scsiOneValue.Add("Device supports protection information"); - if(inquiry.BasicQueueing) scsiOneValue.Add("Device supports basic queueing"); - if(inquiry.EnclosureServices) scsiOneValue.Add("Device contains an embedded enclosure services component"); - if(inquiry.MultiPortDevice) scsiOneValue.Add("Multi-port device"); - if(inquiry.MediumChanger) scsiOneValue.Add("Device contains or is attached to a medium changer"); - if(inquiry.ACKRequests) scsiOneValue.Add("Device supports request and acknowledge handshakes"); - if(inquiry.Address32) scsiOneValue.Add("Device supports 32-bit wide SCSI addresses"); - if(inquiry.Address16) scsiOneValue.Add("Device supports 16-bit wide SCSI addresses"); - if(inquiry.RelativeAddressing) scsiOneValue.Add("Device supports relative addressing"); - if(inquiry.WideBus32) scsiOneValue.Add("Device supports 32-bit wide data transfers"); - if(inquiry.WideBus16) scsiOneValue.Add("Device supports 16-bit wide data transfers"); - if(inquiry.SyncTransfer) scsiOneValue.Add("Device supports synchronous data transfer"); - if(inquiry.LinkedCommands) scsiOneValue.Add("Device supports linked commands"); - if(inquiry.TranferDisable) - scsiOneValue.Add("Device supports CONTINUE TASK and TARGET TRANSFER DISABLE commands"); + if(inquiry.RMB) scsiOneValue.Add("Device is removable"); + if(inquiry.AERC) scsiOneValue.Add("Device supports Asynchronous Event Reporting Capability"); + if(inquiry.TrmTsk) scsiOneValue.Add("Device supports TERMINATE TASK command"); + if(inquiry.NormACA) scsiOneValue.Add("Device supports setting Normal ACA"); + if(inquiry.HiSup) scsiOneValue.Add("Device supports LUN hierarchical addressing"); + if(inquiry.SCCS) scsiOneValue.Add("Device contains an embedded storage array controller"); + if(inquiry.ACC) scsiOneValue.Add("Device contains an Access Control Coordinator"); + if(inquiry.ThreePC) scsiOneValue.Add("Device supports third-party copy commands"); + if(inquiry.Protect) scsiOneValue.Add("Device supports protection information"); + if(inquiry.BQue) scsiOneValue.Add("Device supports basic queueing"); + if(inquiry.EncServ) scsiOneValue.Add("Device contains an embedded enclosure services component"); + if(inquiry.MultiP) scsiOneValue.Add("Multi-port device"); + if(inquiry.MChngr) scsiOneValue.Add("Device contains or is attached to a medium changer"); + if(inquiry.ACKREQQ) scsiOneValue.Add("Device supports request and acknowledge handshakes"); + if(inquiry.Addr32) scsiOneValue.Add("Device supports 32-bit wide SCSI addresses"); + if(inquiry.Addr16) scsiOneValue.Add("Device supports 16-bit wide SCSI addresses"); + if(inquiry.RelAddr) scsiOneValue.Add("Device supports relative addressing"); + if(inquiry.WBus32) scsiOneValue.Add("Device supports 32-bit wide data transfers"); + if(inquiry.WBus16) scsiOneValue.Add("Device supports 16-bit wide data transfers"); + if(inquiry.Sync) scsiOneValue.Add("Device supports synchronous data transfer"); + if(inquiry.Linked) scsiOneValue.Add("Device supports linked commands"); + if(inquiry.TranDis) scsiOneValue.Add("Device supports CONTINUE TASK and TARGET TRANSFER DISABLE commands"); if(inquiry.QAS) scsiOneValue.Add("Device supports Quick Arbitration and Selection"); - if(inquiry.TaggedCommandQueue) scsiOneValue.Add("Device supports TCQ queue"); + if(inquiry.CmdQue) scsiOneValue.Add("Device supports TCQ queue"); if(inquiry.IUS) scsiOneValue.Add("Device supports information unit transfers"); - if(inquiry.SoftReset) scsiOneValue.Add("Device implements RESET as a soft reset"); + if(inquiry.SftRe) scsiOneValue.Add("Device implements RESET as a soft reset"); - switch(inquiry.AsymmetricalLUNAccess) + switch((TGPSValues)inquiry.TPGS) { case TGPSValues.NotSupported: scsiOneValue.Add("Device does not support assymetrical access"); @@ -243,11 +245,11 @@ namespace DiscImageChef.Server.App_Start scsiOneValue.Add("Device supports implicit and explicit assymetrical access"); break; default: - scsiOneValue.Add($"Unknown value in TPGS field 0x{inquiry.AsymmetricalLUNAccess:X2}"); + scsiOneValue.Add($"Unknown value in TPGS field 0x{inquiry.TPGS:X2}"); break; } - switch(inquiry.SPIClocking) + switch((SPIClocking)inquiry.Clocking) { case SPIClocking.ST: scsiOneValue.Add("Device supports only ST clocking"); @@ -262,7 +264,7 @@ namespace DiscImageChef.Server.App_Start scsiOneValue.Add("Device supports ST and DT clocking"); break; default: - scsiOneValue.Add($"Unknown value in SPI clocking field 0x{inquiry.SPIClocking:X2}"); + scsiOneValue.Add($"Unknown value in SPI clocking field 0x{inquiry.Clocking:X2}"); break; } diff --git a/DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs b/DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs index 2a158c077..5cfcaa09f 100644 --- a/DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs +++ b/DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs @@ -34,7 +34,7 @@ using System.Collections.Generic; using DiscImageChef.CommonTypes.Metadata; using DiscImageChef.Decoders.SCSI.MMC; -namespace DiscImageChef.Server.App_Start +namespace DiscImageChef.Server { public static class ScsiMmcFeatures { @@ -44,16 +44,16 @@ namespace DiscImageChef.Server.App_Start /// /// FEATURES part of the report /// List to put the values on - public static void Report(mmcFeaturesType ftr, ref List mmcOneValue) + public static void Report(MmcFeatures ftr, ref List mmcOneValue) { - if(ftr.SupportsAACS && ftr.AACSVersionSpecified) + if(ftr.SupportsAACS && ftr.AACSVersion.HasValue) mmcOneValue.Add($"Drive supports AACS version {ftr.AACSVersion}"); else if(ftr.SupportsAACS) mmcOneValue.Add("Drive supports AACS"); - if(ftr.AGIDsSpecified) mmcOneValue.Add($"Drive supports {ftr.AGIDs} AGIDs concurrently"); + if(ftr.AGIDs.HasValue) mmcOneValue.Add($"Drive supports {ftr.AGIDs} AGIDs concurrently"); if(ftr.CanGenerateBindingNonce) { mmcOneValue.Add("Drive supports generating the binding nonce"); - if(ftr.BindingNonceBlocksSpecified) + if(ftr.BindingNonceBlocks.HasValue) mmcOneValue.Add($"{ftr.BindingNonceBlocks} media blocks are required for the binding nonce"); } @@ -131,42 +131,44 @@ namespace DiscImageChef.Server.App_Start if(ftr.MultiRead) mmcOneValue.Add("Drive claims capability to read all CD formats according to OSTA Multi-Read Specification"); - switch(ftr.PhysicalInterfaceStandard) - { - case PhysicalInterfaces.Unspecified: - mmcOneValue.Add("Drive uses an unspecified physical interface"); - break; - case PhysicalInterfaces.SCSI: - mmcOneValue.Add("Drive uses SCSI interface"); - break; - case PhysicalInterfaces.ATAPI: - mmcOneValue.Add("Drive uses ATAPI interface"); - break; - case PhysicalInterfaces.IEEE1394: - mmcOneValue.Add("Drive uses IEEE-1394 interface"); - break; - case PhysicalInterfaces.IEEE1394A: - mmcOneValue.Add("Drive uses IEEE-1394A interface"); - break; - case PhysicalInterfaces.FC: - mmcOneValue.Add("Drive uses Fibre Channel interface"); - break; - case PhysicalInterfaces.IEEE1394B: - mmcOneValue.Add("Drive uses IEEE-1394B interface"); - break; - case PhysicalInterfaces.SerialATAPI: - mmcOneValue.Add("Drive uses Serial ATAPI interface"); - break; - case PhysicalInterfaces.USB: - mmcOneValue.Add("Drive uses USB interface"); - break; - case PhysicalInterfaces.Vendor: - mmcOneValue.Add("Drive uses a vendor unique interface"); - break; - default: - mmcOneValue.Add($"Drive uses an unknown interface with code {(uint)ftr.PhysicalInterfaceStandard}"); - break; - } + if(ftr.PhysicalInterfaceStandard.HasValue) + switch(ftr.PhysicalInterfaceStandard) + { + case PhysicalInterfaces.Unspecified: + mmcOneValue.Add("Drive uses an unspecified physical interface"); + break; + case PhysicalInterfaces.SCSI: + mmcOneValue.Add("Drive uses SCSI interface"); + break; + case PhysicalInterfaces.ATAPI: + mmcOneValue.Add("Drive uses ATAPI interface"); + break; + case PhysicalInterfaces.IEEE1394: + mmcOneValue.Add("Drive uses IEEE-1394 interface"); + break; + case PhysicalInterfaces.IEEE1394A: + mmcOneValue.Add("Drive uses IEEE-1394A interface"); + break; + case PhysicalInterfaces.FC: + mmcOneValue.Add("Drive uses Fibre Channel interface"); + break; + case PhysicalInterfaces.IEEE1394B: + mmcOneValue.Add("Drive uses IEEE-1394B interface"); + break; + case PhysicalInterfaces.SerialATAPI: + mmcOneValue.Add("Drive uses Serial ATAPI interface"); + break; + case PhysicalInterfaces.USB: + mmcOneValue.Add("Drive uses USB interface"); + break; + case PhysicalInterfaces.Vendor: + mmcOneValue.Add("Drive uses a vendor unique interface"); + break; + default: + mmcOneValue + .Add($"Drive uses an unknown interface with code {(uint)ftr.PhysicalInterfaceStandard}"); + break; + } if(ftr.PreventJumper) mmcOneValue.Add("Drive power ups locked"); if(ftr.SupportsBusEncryption) mmcOneValue.Add("Drive supports bus encryption"); @@ -229,40 +231,41 @@ namespace DiscImageChef.Server.App_Start mmcOneValue.Add($"Drive has {ftr.ChangerSlots + 1} slots"); } - if(ftr.SupportsCSS && ftr.CSSVersionSpecified) + if(ftr.SupportsCSS && ftr.CSSVersion.HasValue) mmcOneValue.Add($"Drive supports DVD CSS/CPPM version {ftr.CSSVersion}"); else if(ftr.SupportsCSS) mmcOneValue.Add("Drive supports DVD CSS/CPRM"); - if(ftr.SupportsCPRM && ftr.CPRMVersionSpecified) + if(ftr.SupportsCPRM && ftr.CPRMVersion.HasValue) mmcOneValue.Add($"Drive supports DVD CPPM version {ftr.CPRMVersion}"); else if(ftr.SupportsCPRM) mmcOneValue.Add("Drive supports DVD CPRM"); if(ftr.DBML) mmcOneValue.Add("Drive reports Device Busy Class events during medium loading/unloading"); if(ftr.DVDMultiRead) mmcOneValue.Add("Drive conforms to DVD Multi Drive Read-only Specifications"); - if(ftr.FirmwareDateSpecified) mmcOneValue.Add($"Drive firmware is dated {ftr.FirmwareDate}"); + if(ftr.FirmwareDate.HasValue) mmcOneValue.Add($"Drive firmware is dated {ftr.FirmwareDate}"); if(ftr.SupportsC2) mmcOneValue.Add("Drive supports C2 Error Pointers"); if(ftr.SupportsDAP) mmcOneValue.Add("Drive supports the DAP bit in the READ CD and READ CD MSF commands"); if(ftr.SupportsDeviceBusyEvent) mmcOneValue.Add("Drive supports Device Busy events"); - switch(ftr.LoadingMechanismType) - { - case 0: - mmcOneValue.Add("Drive uses media caddy"); - break; - case 1: - mmcOneValue.Add("Drive uses a tray"); - break; - case 2: - mmcOneValue.Add("Drive is pop-up"); - break; - case 4: - mmcOneValue.Add("Drive is a changer with individually changeable discs"); - break; - case 5: - mmcOneValue.Add("Drive is a changer using cartridges"); - break; - default: - mmcOneValue.Add($"Drive uses unknown loading mechanism type {ftr.LoadingMechanismType}"); - break; - } + if(ftr.LoadingMechanismType.HasValue) + switch(ftr.LoadingMechanismType) + { + case 0: + mmcOneValue.Add("Drive uses media caddy"); + break; + case 1: + mmcOneValue.Add("Drive uses a tray"); + break; + case 2: + mmcOneValue.Add("Drive is pop-up"); + break; + case 4: + mmcOneValue.Add("Drive is a changer with individually changeable discs"); + break; + case 5: + mmcOneValue.Add("Drive is a changer using cartridges"); + break; + default: + mmcOneValue.Add($"Drive uses unknown loading mechanism type {ftr.LoadingMechanismType}"); + break; + } if(ftr.SupportsHybridDiscs) mmcOneValue.Add("Drive is able to access Hybrid discs"); if(ftr.SupportsModePage1Ch) @@ -274,7 +277,7 @@ namespace DiscImageChef.Server.App_Start if(ftr.SupportsSecurDisc) mmcOneValue.Add("Drive supports SecurDisc"); if(ftr.SupportsSeparateVolume) mmcOneValue.Add("Drive supports separate volume per channel"); if(ftr.SupportsVCPS) mmcOneValue.Add("Drive supports VCPS"); - if(ftr.VolumeLevelsSpecified) mmcOneValue.Add($"Drive has {ftr.VolumeLevels + 1} volume levels"); + if(ftr.VolumeLevels.HasValue) mmcOneValue.Add($"Drive has {ftr.VolumeLevels + 1} volume levels"); if(ftr.SupportsWriteProtectPAC) mmcOneValue.Add("Drive supports reading/writing the Disc Write Protect PAC on BD-R/-RE media"); if(ftr.SupportsWriteInhibitDCB) diff --git a/DiscImageChef.Server/App_Start/ScsiMmcMode.cs b/DiscImageChef.Server/App_Start/ScsiMmcMode.cs index c3be8d0b4..01a12a32f 100644 --- a/DiscImageChef.Server/App_Start/ScsiMmcMode.cs +++ b/DiscImageChef.Server/App_Start/ScsiMmcMode.cs @@ -32,10 +32,9 @@ using System.Collections.Generic; using System.Linq; -using DiscImageChef.CommonTypes.Metadata; using DiscImageChef.Decoders.SCSI; -namespace DiscImageChef.Server.App_Start +namespace DiscImageChef.Server { public static class ScsiMmcMode { @@ -45,23 +44,22 @@ namespace DiscImageChef.Server.App_Start /// /// MODE PAGE 2Ah part of the report /// List to put the values on - public static void Report(mmcModeType mode, ref List mmcOneValue) + public static void Report(Modes.ModePage_2A mode, ref List mmcOneValue) { - if(mode.PlaysAudio) mmcOneValue.Add("Drive can play audio"); - if(mode.ReadsMode2Form1) mmcOneValue.Add("Drive can read sectors in Mode 2 Form 1 format"); - if(mode.ReadsMode2Form2) mmcOneValue.Add("Drive can read sectors in Mode 2 Form 2 format"); - if(mode.SupportsMultiSession) mmcOneValue.Add("Drive supports multi-session discs and/or Photo-CD"); + if(mode.AudioPlay) mmcOneValue.Add("Drive can play audio"); + if(mode.Mode2Form1) mmcOneValue.Add("Drive can read sectors in Mode 2 Form 1 format"); + if(mode.Mode2Form2) mmcOneValue.Add("Drive can read sectors in Mode 2 Form 2 format"); + if(mode.MultiSession) mmcOneValue.Add("Drive supports multi-session discs and/or Photo-CD"); if(mode.CDDACommand) mmcOneValue.Add("Drive can read digital audio"); if(mode.AccurateCDDA) mmcOneValue.Add("Drive can continue from streaming loss"); - if(mode.ReadsSubchannel) mmcOneValue.Add("Drive can read uncorrected and interleaved R-W subchannels"); - if(mode.ReadsDeinterlavedSubchannel) - mmcOneValue.Add("Drive can read, deinterleave and correct R-W subchannels"); - if(mode.ReturnsC2Pointers) mmcOneValue.Add("Drive supports C2 pointers"); - if(mode.ReadsUPC) mmcOneValue.Add("Drive can read Media Catalogue Number"); - if(mode.ReadsISRC) mmcOneValue.Add("Drive can read ISRC"); + if(mode.Subchannel) mmcOneValue.Add("Drive can read uncorrected and interleaved R-W subchannels"); + if(mode.DeinterlaveSubchannel) mmcOneValue.Add("Drive can read, deinterleave and correct R-W subchannels"); + if(mode.C2Pointer) mmcOneValue.Add("Drive supports C2 pointers"); + if(mode.UPC) mmcOneValue.Add("Drive can read Media Catalogue Number"); + if(mode.ISRC) mmcOneValue.Add("Drive can read ISRC"); - switch(mode.LoadingMechanismType) + switch(mode.LoadingMechanism) { case 0: mmcOneValue.Add("Drive uses media caddy"); @@ -79,24 +77,24 @@ namespace DiscImageChef.Server.App_Start mmcOneValue.Add("Drive is a changer using cartridges"); break; default: - mmcOneValue.Add($"Drive uses unknown loading mechanism type {mode.LoadingMechanismType}"); + mmcOneValue.Add($"Drive uses unknown loading mechanism type {mode.LoadingMechanism}"); break; } - if(mode.CanLockMedia) mmcOneValue.Add("Drive can lock media"); - if(mode.PreventJumperStatus) + if(mode.Lock) mmcOneValue.Add("Drive can lock media"); + if(mode.PreventJumper) { mmcOneValue.Add("Drive power ups locked"); - mmcOneValue.Add(mode.LockStatus + mmcOneValue.Add(mode.LockState ? "Drive is locked, media cannot be ejected or inserted" : "Drive is not locked, media can be ejected and inserted"); } else - mmcOneValue.Add(mode.LockStatus + mmcOneValue.Add(mode.LockState ? "Drive is locked, media cannot be ejected, but if empty, can be inserted" : "Drive is not locked, media can be ejected and inserted"); - if(mode.CanEject) mmcOneValue.Add("Drive can eject media"); + if(mode.Eject) mmcOneValue.Add("Drive can eject media"); if(mode.SeparateChannelMute) mmcOneValue.Add("Each channel can be muted independently"); if(mode.SeparateChannelVolume) mmcOneValue.Add("Each channel's volume can be controlled independently"); @@ -109,28 +107,27 @@ namespace DiscImageChef.Server.App_Start if(mode.CurrentSpeed > 0) mmcOneValue.Add($"Drive's current reading speed is {mode.CurrentSpeed} Kbyte/sec."); - if(mode.ReadsCDR) + if(mode.ReadCDR) { - mmcOneValue.Add(mode.WritesCDR ? "Drive can read and write CD-R" : "Drive can read CD-R"); + mmcOneValue.Add(mode.WriteCDR ? "Drive can read and write CD-R" : "Drive can read CD-R"); - if(mode.ReadsPacketCDR) mmcOneValue.Add("Drive supports reading CD-R packet media"); + if(mode.Method2) mmcOneValue.Add("Drive supports reading CD-R packet media"); } - if(mode.ReadsCDRW) - mmcOneValue.Add(mode.WritesCDRW ? "Drive can read and write CD-RW" : "Drive can read CD-RW"); + if(mode.ReadCDRW) + mmcOneValue.Add(mode.WriteCDRW ? "Drive can read and write CD-RW" : "Drive can read CD-RW"); - if(mode.ReadsDVDROM) mmcOneValue.Add("Drive can read DVD-ROM"); - if(mode.ReadsDVDR) - mmcOneValue.Add(mode.WritesDVDR ? "Drive can read and write DVD-R" : "Drive can read DVD-R"); - if(mode.ReadsDVDRAM) - mmcOneValue.Add(mode.WritesDVDRAM ? "Drive can read and write DVD-RAM" : "Drive can read DVD-RAM"); + if(mode.ReadDVDROM) mmcOneValue.Add("Drive can read DVD-ROM"); + if(mode.ReadDVDR) + mmcOneValue.Add(mode.WriteDVDR ? "Drive can read and write DVD-R" : "Drive can read DVD-R"); + if(mode.ReadDVDRAM) + mmcOneValue.Add(mode.WriteDVDRAM ? "Drive can read and write DVD-RAM" : "Drive can read DVD-RAM"); - if(mode.CompositeAudioVideo) mmcOneValue.Add("Drive can deliver a composite audio and video data stream"); + if(mode.Composite) mmcOneValue.Add("Drive can deliver a composite audio and video data stream"); if(mode.DigitalPort1) mmcOneValue.Add("Drive supports IEC-958 digital output on port 1"); if(mode.DigitalPort2) mmcOneValue.Add("Drive supports IEC-958 digital output on port 2"); - if(mode.DeterministicSlotChanger) - mmcOneValue.Add("Drive contains a changer that can report the exact contents of the slots"); + if(mode.SDP) mmcOneValue.Add("Drive contains a changer that can report the exact contents of the slots"); if(mode.CurrentWriteSpeedSelected > 0) { if(mode.RotationControlSelected == 0) @@ -142,8 +139,8 @@ namespace DiscImageChef.Server.App_Start } else { - if(mode.MaximumWriteSpeed > 0) - mmcOneValue.Add($"Drive's maximum writing speed is {mode.MaximumWriteSpeed} Kbyte/sec."); + if(mode.MaxWriteSpeed > 0) + mmcOneValue.Add($"Drive's maximum writing speed is {mode.MaxWriteSpeed} Kbyte/sec."); if(mode.CurrentWriteSpeed > 0) mmcOneValue.Add($"Drive's current writing speed is {mode.CurrentWriteSpeed} Kbyte/sec."); } @@ -159,14 +156,14 @@ namespace DiscImageChef.Server.App_Start if(mode.TestWrite) mmcOneValue.Add("Drive supports test writing"); - if(mode.ReadsBarcode) mmcOneValue.Add("Drive can read barcode"); + if(mode.ReadBarcode) mmcOneValue.Add("Drive can read barcode"); - if(mode.ReadsBothSides) mmcOneValue.Add("Drive can read both sides of a disc"); + if(mode.SCC) mmcOneValue.Add("Drive can read both sides of a disc"); if(mode.LeadInPW) mmcOneValue.Add("Drive an read raw R-W subchannel from the Lead-In"); - if(mode.CSSandCPPMSupported) mmcOneValue.Add("Drive supports DVD CSS and/or DVD CPPM"); + if(mode.CMRSupported == 1) mmcOneValue.Add("Drive supports DVD CSS and/or DVD CPPM"); - if(mode.BufferUnderRunProtection) mmcOneValue.Add("Drive supports buffer under-run free recording"); + if(mode.BUF) mmcOneValue.Add("Drive supports buffer under-run free recording"); mmcOneValue.Sort(); mmcOneValue.Add(""); diff --git a/DiscImageChef.Server/App_Start/ScsiModeSense.cs b/DiscImageChef.Server/App_Start/ScsiModeSense.cs index e9002495d..551cd2ff8 100644 --- a/DiscImageChef.Server/App_Start/ScsiModeSense.cs +++ b/DiscImageChef.Server/App_Start/ScsiModeSense.cs @@ -34,7 +34,7 @@ using System.Collections.Generic; using DiscImageChef.CommonTypes.Metadata; using DiscImageChef.Decoders.SCSI; -namespace DiscImageChef.Server.App_Start +namespace DiscImageChef.Server { public static class ScsiModeSense { @@ -47,15 +47,15 @@ namespace DiscImageChef.Server.App_Start /// SCSI peripheral device type /// List to put values on /// List to put key=value pairs on - public static void Report(modeType modeSense, string vendor, + public static void Report(ScsiMode modeSense, string vendor, PeripheralDeviceTypes deviceType, ref List scsiOneValue, ref Dictionary modePages) { - if(modeSense.MediumTypeSpecified) scsiOneValue.Add($"Medium type is {modeSense.MediumType:X2}h"); + if(modeSense.MediumType.HasValue) scsiOneValue.Add($"Medium type is {modeSense.MediumType:X2}h"); if(modeSense.WriteProtected) scsiOneValue.Add("Device is write protected."); if(modeSense.BlockDescriptors != null) - foreach(blockDescriptorType descriptor in modeSense.BlockDescriptors) - if(descriptor.BlocksSpecified && descriptor.BlockLengthSpecified) + foreach(BlockDescriptor descriptor in modeSense.BlockDescriptors) + if(descriptor.Blocks.HasValue && descriptor.BlockLength.HasValue) scsiOneValue .Add($"Density code {descriptor.Density:X2}h has {descriptor.Blocks} blocks of {descriptor.BlockLength} bytes each"); else @@ -63,7 +63,7 @@ namespace DiscImageChef.Server.App_Start if(modeSense.DPOandFUA) scsiOneValue.Add("Drive supports DPO and FUA bits"); if(modeSense.BlankCheckEnabled) scsiOneValue.Add("Blank checking during write is enabled"); - if(modeSense.BufferedModeSpecified) + if(modeSense.BufferedMode.HasValue) switch(modeSense.BufferedMode) { case 0: @@ -82,7 +82,7 @@ namespace DiscImageChef.Server.App_Start if(modeSense.ModePages == null) return; - foreach(modePageType page in modeSense.ModePages) + foreach(ScsiPage page in modeSense.ModePages) switch(page.page) { case 0x00: @@ -170,7 +170,8 @@ namespace DiscImageChef.Server.App_Start if(page.subpage == 0) modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0A(page.value)); else if(page.subpage == 1) - modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0A_S01(page.value)); + modePages.Add($"MODE page {page.page:X2}h subpage {page.subpage:X2}h", + Modes.PrettifyModePage_0A_S01(page.value)); else goto default; break; @@ -241,7 +242,8 @@ namespace DiscImageChef.Server.App_Start if(page.subpage == 0) modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_1A(page.value)); else if(page.subpage == 1) - modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_1A_S01(page.value)); + modePages.Add($"MODE page {page.page:X2}h subpage {page.subpage:X2}h", + Modes.PrettifyModePage_1A_S01(page.value)); else goto default; break; @@ -262,7 +264,8 @@ namespace DiscImageChef.Server.App_Start ? Modes.PrettifyModePage_1C_SFF(page.value) : Modes.PrettifyModePage_1C(page.value)); else if(page.subpage == 1) - modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_1C_S01(page.value)); + modePages.Add($"MODE page {page.page:X2}h subpage {page.subpage:X2}h", + Modes.PrettifyModePage_1C_S01(page.value)); else goto default; break; @@ -369,10 +372,8 @@ namespace DiscImageChef.Server.App_Start Dictionary newModePages = new Dictionary(); foreach(KeyValuePair kvp in modePages) - if(string.IsNullOrWhiteSpace(kvp.Value)) - newModePages.Add(kvp.Key, "Undecoded"); - else - newModePages.Add(kvp.Key, kvp.Value.Replace("\n", "
")); + newModePages.Add(kvp.Key, + string.IsNullOrWhiteSpace(kvp.Value) ? "Undecoded" : kvp.Value.Replace("\n", "
")); modePages = newModePages; } diff --git a/DiscImageChef.Server/App_Start/SscTestedMedia.cs b/DiscImageChef.Server/App_Start/SscTestedMedia.cs index bc649c2f1..a2a63b9dd 100644 --- a/DiscImageChef.Server/App_Start/SscTestedMedia.cs +++ b/DiscImageChef.Server/App_Start/SscTestedMedia.cs @@ -33,7 +33,7 @@ using System.Collections.Generic; using DiscImageChef.CommonTypes.Metadata; -namespace DiscImageChef.Server.App_Start +namespace DiscImageChef.Server { public static class SscTestedMedia { @@ -42,16 +42,16 @@ namespace DiscImageChef.Server.App_Start /// /// List to put values on /// List of tested media - public static void Report(IEnumerable testedMedia, ref List mediaOneValue) + public static void Report(IEnumerable testedMedia, ref List mediaOneValue) { - foreach(SequentialMedia media in testedMedia) + foreach(TestedSequentialMedia media in testedMedia) { if(!string.IsNullOrWhiteSpace(media.MediumTypeName)) { mediaOneValue.Add($"Information for medium named \"{media.MediumTypeName}\""); - if(media.MediumTypeSpecified) mediaOneValue.Add($"Medium type code: {media.MediumType:X2}h"); + if(media.MediumType.HasValue) mediaOneValue.Add($"Medium type code: {media.MediumType:X2}h"); } - else if(media.MediumTypeSpecified) + else if(media.MediumType.HasValue) mediaOneValue.Add($"Information for medium type {media.MediumType:X2}h"); else mediaOneValue.Add("Information for unknown medium type"); @@ -59,9 +59,9 @@ namespace DiscImageChef.Server.App_Start mediaOneValue.Add($"Medium manufactured by: {media.Manufacturer}"); if(!string.IsNullOrWhiteSpace(media.Model)) mediaOneValue.Add($"Medium model: {media.Model}"); - if(media.DensitySpecified) mediaOneValue.Add($"Medium has density code {media.Density:X2}h"); - if(media.CanReadMediaSerial) mediaOneValue.Add("Drive can read medium serial number."); - if(media.MediaIsRecognized) mediaOneValue.Add("DiscImageChef recognizes this medium."); + if(media.Density.HasValue) mediaOneValue.Add($"Medium has density code {media.Density:X2}h"); + if(media.CanReadMediaSerial == true) mediaOneValue.Add("Drive can read medium serial number."); + if(media.MediaIsRecognized) mediaOneValue.Add("Drive recognizes this medium."); mediaOneValue.Add(""); } diff --git a/DiscImageChef.Server/App_Start/TestedMedia.cs b/DiscImageChef.Server/App_Start/TestedMedia.cs index 03dfd41ab..166a19356 100644 --- a/DiscImageChef.Server/App_Start/TestedMedia.cs +++ b/DiscImageChef.Server/App_Start/TestedMedia.cs @@ -31,7 +31,6 @@ // ****************************************************************************/ using System.Collections.Generic; -using DiscImageChef.CommonTypes.Metadata; namespace DiscImageChef.Server.App_Start { @@ -43,17 +42,17 @@ namespace DiscImageChef.Server.App_Start /// true if device report is from an ATA device /// List to put values on /// List of tested media - public static void Report(IEnumerable testedMedias, bool ata, ref List mediaOneValue) + public static void Report(List testedMedias, ref List mediaOneValue) { - foreach(testedMediaType testedMedia in testedMedias) + foreach(CommonTypes.Metadata.TestedMedia testedMedia in testedMedias) { if(!string.IsNullOrWhiteSpace(testedMedia.MediumTypeName)) { mediaOneValue.Add($"Information for medium named \"{testedMedia.MediumTypeName}\""); - if(testedMedia.MediumTypeSpecified) + if(testedMedia.MediumType != null) mediaOneValue.Add($"Medium type code: {testedMedia.MediumType:X2}h"); } - else if(testedMedia.MediumTypeSpecified) + else if(testedMedia.MediumType != null) mediaOneValue.Add($"Information for medium type {testedMedia.MediumType:X2}h"); else mediaOneValue.Add("Information for unknown medium type"); @@ -65,16 +64,16 @@ namespace DiscImageChef.Server.App_Start mediaOneValue.Add($"Medium manufactured by: {testedMedia.Manufacturer}"); if(!string.IsNullOrWhiteSpace(testedMedia.Model)) mediaOneValue.Add($"Medium model: {testedMedia.Model}"); - if(testedMedia.DensitySpecified) mediaOneValue.Add($"Density code: {testedMedia.Density:X2}h"); + if(testedMedia.Density != null) mediaOneValue.Add($"Density code: {testedMedia.Density:X2}h"); - if(testedMedia.BlockSizeSpecified) + if(testedMedia.BlockSize != null) mediaOneValue.Add($"Logical sector size: {testedMedia.BlockSize} bytes"); - if(testedMedia.PhysicalBlockSizeSpecified) + if(testedMedia.PhysicalBlockSize != null) mediaOneValue.Add($"Physical sector size: {testedMedia.PhysicalBlockSize} bytes"); - if(testedMedia.LongBlockSizeSpecified) + if(testedMedia.LongBlockSize != null) mediaOneValue.Add($"READ LONG sector size: {testedMedia.LongBlockSize} bytes"); - if(testedMedia.BlocksSpecified && testedMedia.BlockSizeSpecified) + if(testedMedia.Blocks != null && testedMedia.BlockSize != null) { mediaOneValue.Add($"Medium has {testedMedia.Blocks} blocks of {testedMedia.BlockSize} bytes each"); @@ -114,7 +113,7 @@ namespace DiscImageChef.Server.App_Start .Add($"Medium size in CHS mode: {(ulong)currentSectors * testedMedia.BlockSize} bytes, {(ulong)currentSectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)((ulong)currentSectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); } - if(testedMedia.LBASectorsSpecified) + if(testedMedia.LBASectors != null) { mediaOneValue.Add($"Sectors addressable in sectors in 28-bit LBA mode: {testedMedia.LBASectors}"); @@ -129,7 +128,7 @@ namespace DiscImageChef.Server.App_Start .Add($"Medium size in 28-bit LBA mode: {(ulong)testedMedia.LBASectors * testedMedia.BlockSize} bytes, {(ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)((ulong)testedMedia.LBASectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); } - if(testedMedia.LBA48SectorsSpecified) + if(testedMedia.LBA48Sectors != null) { mediaOneValue.Add($"Sectors addressable in sectors in 48-bit LBA mode: {testedMedia.LBA48Sectors}"); @@ -144,155 +143,161 @@ namespace DiscImageChef.Server.App_Start .Add($"Medium size in 48-bit LBA mode: {testedMedia.LBA48Sectors * testedMedia.BlockSize} bytes, {testedMedia.LBA48Sectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)(testedMedia.LBA48Sectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); } - if(testedMedia.NominalRotationRateSpecified && testedMedia.NominalRotationRate != 0x0000 && - testedMedia.NominalRotationRate != 0xFFFF) + if(testedMedia.NominalRotationRate != null && testedMedia.NominalRotationRate != 0x0000 && + testedMedia.NominalRotationRate != 0xFFFF) mediaOneValue.Add(testedMedia.NominalRotationRate == 0x0001 ? "Medium does not rotate." : $"Medium rotates at {testedMedia.NominalRotationRate} rpm"); - if(testedMedia.BlockSizeSpecified && - testedMedia.PhysicalBlockSizeSpecified && - testedMedia.BlockSize != testedMedia.PhysicalBlockSize && - (testedMedia.LogicalAlignment & 0x8000) == 0x0000 && + if(testedMedia.BlockSize != null && + testedMedia.PhysicalBlockSize != null && + testedMedia.BlockSize.Value != testedMedia.PhysicalBlockSize.Value && + (testedMedia.LogicalAlignment & 0x8000) == 0x0000 && (testedMedia.LogicalAlignment & 0x4000) == 0x4000) mediaOneValue .Add($"Logical sector starts at offset {testedMedia.LogicalAlignment & 0x3FFF} from physical sector"); - if(testedMedia.SupportsRead && ata) + if(testedMedia.SupportsReadSectors == true) mediaOneValue.Add("Device can use the READ SECTOR(S) command in CHS mode with this medium"); - if(testedMedia.SupportsReadRetry) + if(testedMedia.SupportsReadRetry == true) mediaOneValue.Add("Device can use the READ SECTOR(S) RETRY command in CHS mode with this medium"); - if(testedMedia.SupportsReadDma) + if(testedMedia.SupportsReadDma == true) mediaOneValue.Add("Device can use the READ DMA command in CHS mode with this medium"); - if(testedMedia.SupportsReadDmaRetry) + if(testedMedia.SupportsReadDmaRetry == true) mediaOneValue.Add("Device can use the READ DMA RETRY command in CHS mode with this medium"); - if(testedMedia.SupportsReadLong && ata) + if(testedMedia.SupportsReadLong == true) mediaOneValue.Add("Device can use the READ LONG command in CHS mode with this medium"); - if(testedMedia.SupportsReadLongRetry) + if(testedMedia.SupportsReadLongRetry == true) mediaOneValue.Add("Device can use the READ LONG RETRY command in CHS mode with this medium"); - if(testedMedia.SupportsReadLba) + if(testedMedia.SupportsReadLba == true) mediaOneValue.Add("Device can use the READ SECTOR(S) command in 28-bit LBA mode with this medium"); - if(testedMedia.SupportsReadRetryLba) + if(testedMedia.SupportsReadRetryLba == true) mediaOneValue .Add("Device can use the READ SECTOR(S) RETRY command in 28-bit LBA mode with this medium"); - if(testedMedia.SupportsReadDmaLba) + if(testedMedia.SupportsReadDmaLba == true) mediaOneValue.Add("Device can use the READ DMA command in 28-bit LBA mode with this medium"); - if(testedMedia.SupportsReadDmaRetryLba) + if(testedMedia.SupportsReadDmaRetryLba == true) mediaOneValue.Add("Device can use the READ DMA RETRY command in 28-bit LBA mode with this medium"); - if(testedMedia.SupportsReadLongLba) + if(testedMedia.SupportsReadLongLba == true) mediaOneValue.Add("Device can use the READ LONG command in 28-bit LBA mode with this medium"); - if(testedMedia.SupportsReadLongRetryLba) + if(testedMedia.SupportsReadLongRetryLba == true) mediaOneValue.Add("Device can use the READ LONG RETRY command in 28-bit LBA mode with this medium"); - if(testedMedia.SupportsReadLba48) + if(testedMedia.SupportsReadLba48 == true) mediaOneValue.Add("Device can use the READ SECTOR(S) command in 48-bit LBA mode with this medium"); - if(testedMedia.SupportsReadDmaLba48) + if(testedMedia.SupportsReadDmaLba48 == true) mediaOneValue.Add("Device can use the READ DMA command in 48-bit LBA mode with this medium"); - if(testedMedia.SupportsSeek) + if(testedMedia.SupportsSeek == true) mediaOneValue.Add("Device can use the SEEK command in CHS mode with this medium"); - if(testedMedia.SupportsSeekLba) + if(testedMedia.SupportsSeekLba == true) mediaOneValue.Add("Device can use the SEEK command in 28-bit LBA mode with this medium"); - if(testedMedia.SupportsReadCapacity) + if(testedMedia.SupportsReadCapacity == true) mediaOneValue.Add("Device can use the READ CAPACITY (10) command with this medium"); - if(testedMedia.SupportsReadCapacity16) + if(testedMedia.SupportsReadCapacity16 == true) mediaOneValue.Add("Device can use the READ CAPACITY (16) command with this medium"); - if(testedMedia.SupportsRead && !ata) + if(testedMedia.SupportsRead6 == true) mediaOneValue.Add("Device can use the READ (6) command with this medium"); - if(testedMedia.SupportsRead10) + if(testedMedia.SupportsRead10 == true) mediaOneValue.Add("Device can use the READ (10) command with this medium"); - if(testedMedia.SupportsRead12) + if(testedMedia.SupportsRead12 == true) mediaOneValue.Add("Device can use the READ (12) command with this medium"); - if(testedMedia.SupportsRead16) + if(testedMedia.SupportsRead16 == true) mediaOneValue.Add("Device can use the READ (16) command with this medium"); - if(testedMedia.SupportsReadLong && !ata) + if(testedMedia.SupportsReadLong == true) mediaOneValue.Add("Device can use the READ LONG (10) command with this medium"); - if(testedMedia.SupportsReadLong16) + if(testedMedia.SupportsReadLong16 == true) mediaOneValue.Add("Device can use the READ LONG (16) command with this medium"); - if(testedMedia.SupportsReadCd) + if(testedMedia.SupportsReadCd == true) mediaOneValue.Add("Device can use the READ CD command with LBA addressing with this medium"); - if(testedMedia.SupportsReadCdMsf) + if(testedMedia.SupportsReadCdMsf == true) mediaOneValue.Add("Device can use the READ CD command with MM:SS:FF addressing with this medium"); - if(testedMedia.SupportsReadCdRaw) + if(testedMedia.SupportsReadCdRaw == true) mediaOneValue .Add("Device can use the READ CD command with LBA addressing with this medium to read raw sector"); - if(testedMedia.SupportsReadCdMsfRaw) + if(testedMedia.SupportsReadCdMsfRaw == true) mediaOneValue .Add("Device can use the READ CD command with MM:SS:FF addressing with this medium read raw sector"); - if(testedMedia.SupportsHLDTSTReadRawDVD) + if(testedMedia.SupportsHLDTSTReadRawDVD == true) mediaOneValue.Add("Device can use the HL-DT-ST vendor READ DVD (RAW) command with this medium"); - if(testedMedia.SupportsNECReadCDDA) + if(testedMedia.SupportsNECReadCDDA == true) mediaOneValue.Add("Device can use the NEC vendor READ CD-DA command with this medium"); - if(testedMedia.SupportsPioneerReadCDDA) + if(testedMedia.SupportsPioneerReadCDDA == true) mediaOneValue.Add("Device can use the PIONEER vendor READ CD-DA command with this medium"); - if(testedMedia.SupportsPioneerReadCDDAMSF) + if(testedMedia.SupportsPioneerReadCDDAMSF == true) mediaOneValue.Add("Device can use the PIONEER vendor READ CD-DA MSF command with this medium"); - if(testedMedia.SupportsPlextorReadCDDA) + if(testedMedia.SupportsPlextorReadCDDA == true) mediaOneValue.Add("Device can use the PLEXTOR vendor READ CD-DA command with this medium"); - if(testedMedia.SupportsPlextorReadRawDVD) + if(testedMedia.SupportsPlextorReadRawDVD == true) mediaOneValue.Add("Device can use the PLEXOR vendor READ DVD (RAW) command with this medium"); - if(testedMedia.CanReadAACS) + if(testedMedia.CanReadAACS == true) mediaOneValue.Add("Device can read the Advanced Access Content System from this medium"); - if(testedMedia.CanReadADIP) + if(testedMedia.CanReadADIP == true) mediaOneValue.Add("Device can read the DVD ADress-In-Pregroove from this medium"); - if(testedMedia.CanReadATIP) + if(testedMedia.CanReadATIP == true) mediaOneValue.Add("Device can read the CD Absolute-Time-In-Pregroove from this medium"); - if(testedMedia.CanReadBCA) mediaOneValue.Add("Device can read the Burst Cutting Area from this medium"); - if(testedMedia.CanReadC2Pointers) + if(testedMedia.CanReadBCA == true) + mediaOneValue.Add("Device can read the Burst Cutting Area from this medium"); + if(testedMedia.CanReadC2Pointers == true) mediaOneValue.Add("Device can report the C2 pointers when reading from this medium"); - if(testedMedia.CanReadCMI) + if(testedMedia.CanReadCMI == true) mediaOneValue.Add("Device can read the Copyright Management Information from this medium"); - if(testedMedia.CanReadCorrectedSubchannel) + if(testedMedia.CanReadCorrectedSubchannel == true) mediaOneValue.Add("Device can correct subchannels when reading from this medium"); - if(testedMedia.CanReadCorrectedSubchannelWithC2) + if(testedMedia.CanReadCorrectedSubchannelWithC2 == true) mediaOneValue .Add("Device can correct subchannels and report the C2 pointers when reading from this medium"); - if(testedMedia.CanReadDCB) + if(testedMedia.CanReadDCB == true) mediaOneValue.Add("Device can read the Disc Control Blocks from this medium"); - if(testedMedia.CanReadDDS) + if(testedMedia.CanReadDDS == true) mediaOneValue.Add("Device can read the Disc Definition Structure from this medium"); - if(testedMedia.CanReadDMI) + if(testedMedia.CanReadDMI == true) mediaOneValue.Add("Device can read the Disc Manufacurer Information from this medium"); - if(testedMedia.CanReadDiscInformation) + if(testedMedia.CanReadDiscInformation == true) mediaOneValue.Add("Device can read the Disc Information from this medium"); - if(testedMedia.CanReadFullTOC) + if(testedMedia.CanReadFullTOC == true) mediaOneValue.Add("Device can read the Table of Contents from this medium, without processing it"); - if(testedMedia.CanReadHDCMI) + if(testedMedia.CanReadHDCMI == true) mediaOneValue.Add("Device can read the HD DVD Copyright Management Information from this medium"); - if(testedMedia.CanReadLayerCapacity) + if(testedMedia.CanReadLayerCapacity == true) mediaOneValue.Add("Device can read the layer capacity from this medium"); - if(testedMedia.CanReadLeadIn) mediaOneValue.Add("Device can read the Lead-In from this medium"); - if(testedMedia.CanReadLeadOut) mediaOneValue.Add("Device can read the Lead-Out from this medium"); - if(testedMedia.CanReadMediaID) mediaOneValue.Add("Device can read the Media ID from this medium"); - if(testedMedia.CanReadMediaSerial) + if(testedMedia.CanReadFirstTrackPreGap == true) + mediaOneValue.Add("Device can read the first track's pregap data"); + if(testedMedia.CanReadLeadIn == true) mediaOneValue.Add("Device can read the Lead-In from this medium"); + if(testedMedia.CanReadLeadOut == true) + mediaOneValue.Add("Device can read the Lead-Out from this medium"); + if(testedMedia.CanReadMediaID == true) + mediaOneValue.Add("Device can read the Media ID from this medium"); + if(testedMedia.CanReadMediaSerial == true) mediaOneValue.Add("Device can read the Media Serial Number from this medium"); - if(testedMedia.CanReadPAC) mediaOneValue.Add("Device can read the PAC from this medium"); - if(testedMedia.CanReadPFI) + if(testedMedia.CanReadPAC == true) mediaOneValue.Add("Device can read the PAC from this medium"); + if(testedMedia.CanReadPFI == true) mediaOneValue.Add("Device can read the Physical Format Information from this medium"); - if(testedMedia.CanReadPMA) + if(testedMedia.CanReadPMA == true) mediaOneValue.Add("Device can read the Power Management Area from this medium"); - if(testedMedia.CanReadPQSubchannel) + if(testedMedia.CanReadPQSubchannel == true) mediaOneValue.Add("Device can read the P to Q subchannels from this medium"); - if(testedMedia.CanReadPQSubchannelWithC2) + if(testedMedia.CanReadPQSubchannelWithC2 == true) mediaOneValue .Add("Device can read the P to Q subchannels from this medium reporting the C2 pointers"); - if(testedMedia.CanReadPRI) + if(testedMedia.CanReadPRI == true) mediaOneValue.Add("Device can read the Pre-Recorded Information from this medium"); - if(testedMedia.CanReadRWSubchannel) + if(testedMedia.CanReadRWSubchannel == true) mediaOneValue.Add("Device can read the R to W subchannels from this medium"); - if(testedMedia.CanReadRWSubchannelWithC2) + if(testedMedia.CanReadRWSubchannelWithC2 == true) mediaOneValue .Add("Device can read the R to W subchannels from this medium reporting the C2 pointers"); - if(testedMedia.CanReadRecordablePFI) + if(testedMedia.CanReadRecordablePFI == true) mediaOneValue.Add("Device can read the Physical Format Information from Lead-In from this medium"); - if(testedMedia.CanReadSpareAreaInformation) + if(testedMedia.CanReadSpareAreaInformation == true) mediaOneValue.Add("Device can read the Spare Area Information from this medium"); - if(testedMedia.CanReadTOC) mediaOneValue.Add("Device can read the Table of Contents from this medium"); + if(testedMedia.CanReadTOC == true) + mediaOneValue.Add("Device can read the Table of Contents from this medium"); mediaOneValue.Add(""); } diff --git a/DiscImageChef.Server/DiscImageChef.Server.csproj b/DiscImageChef.Server/DiscImageChef.Server.csproj index 0b4c56b61..74495e524 100644 --- a/DiscImageChef.Server/DiscImageChef.Server.csproj +++ b/DiscImageChef.Server/DiscImageChef.Server.csproj @@ -295,6 +295,10 @@ {0beb3088-b634-4289-ae17-cdf2d25d00d5} DiscImageChef.Decoders + + {f8bdf57b-1571-4cd0-84b3-b422088d359a} + DiscImageChef.Helpers + diff --git a/DiscImageChef.Server/ViewReport.aspx.cs b/DiscImageChef.Server/ViewReport.aspx.cs index 217d47c50..06c6de3b0 100644 --- a/DiscImageChef.Server/ViewReport.aspx.cs +++ b/DiscImageChef.Server/ViewReport.aspx.cs @@ -33,17 +33,15 @@ using System; using System.Collections.Generic; using System.IO; -using System.Text; +using System.Linq; using System.Web; using System.Web.Hosting; using System.Web.UI; -using System.Xml.Serialization; -using DiscImageChef.CommonTypes.Metadata; using DiscImageChef.Decoders.PCMCIA; using DiscImageChef.Decoders.SCSI; using DiscImageChef.Server.App_Start; -using Ata = DiscImageChef.Server.App_Start.Ata; -using TestedMedia = DiscImageChef.Server.App_Start.TestedMedia; +using DiscImageChef.Server.Models; +using TestedMedia = DiscImageChef.CommonTypes.Metadata.TestedMedia; using Tuple = DiscImageChef.Decoders.PCMCIA.Tuple; namespace DiscImageChef.Server @@ -57,56 +55,24 @@ namespace DiscImageChef.Server { try { - string manufacturer = Request.QueryString["manufacturer"]; - string model = Request.QueryString["model"]; - string revision = Request.QueryString["revision"]; - - // Strip non-ascii, strip slashes and question marks - if(manufacturer != null) - manufacturer = Encoding - .ASCII.GetString(Encoding.Convert(Encoding.UTF8, Encoding.ASCII, - Encoding.UTF8.GetBytes(manufacturer))) - .Replace('/', '_').Replace('\\', '_').Replace('?', '_'); - if(model != null) - model = Encoding - .ASCII.GetString(Encoding.Convert(Encoding.UTF8, Encoding.ASCII, - Encoding.UTF8.GetBytes(model))).Replace('/', '_') - .Replace('\\', '_').Replace('?', '_'); - if(revision != null) - revision = Encoding - .ASCII.GetString(Encoding.Convert(Encoding.UTF8, Encoding.ASCII, - Encoding.UTF8.GetBytes(revision))).Replace('/', '_') - .Replace('\\', '_').Replace('?', '_'); - - string xmlFile = null; - if(!string.IsNullOrWhiteSpace(manufacturer) && !string.IsNullOrWhiteSpace(model) && - !string.IsNullOrWhiteSpace(revision)) xmlFile = manufacturer + "_" + model + "_" + revision + ".xml"; - else if(!string.IsNullOrWhiteSpace(manufacturer) && !string.IsNullOrWhiteSpace(model)) - xmlFile = manufacturer + "_" + model + ".xml"; - else if(!string.IsNullOrWhiteSpace(model) && !string.IsNullOrWhiteSpace(revision)) - xmlFile = model + "_" + revision + ".xml"; - else if(!string.IsNullOrWhiteSpace(model)) xmlFile = model + ".xml"; - - if(xmlFile == null || - !File.Exists(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), - "Reports", xmlFile))) + if(!int.TryParse(Request.QueryString["id"], out int id) || id <= 0) { - content.InnerHtml = "Could not find the specified report"; + content.InnerHtml = "Incorrect device report request"; return; } - lblManufacturer.Text = Request.QueryString["manufacturer"]; - lblModel.Text = Request.QueryString["model"]; - lblRevision.Text = Request.QueryString["revision"]; + DicServerContext ctx = new DicServerContext(); + Device report = ctx.Devices.FirstOrDefault(d => d.Id == id); - DeviceReport report = new DeviceReport(); - XmlSerializer xs = new XmlSerializer(report.GetType()); - StreamReader sr = - new - StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), - "Reports", xmlFile)); - report = (DeviceReport)xs.Deserialize(sr); - sr.Close(); + if(report is null) + { + content.InnerHtml = "Cannot find requested report"; + return; + } + + lblManufacturer.Text = report.Manufacturer; + lblModel.Text = report.Model; + lblRevision.Text = report.Revision; if(report.USB != null) { @@ -223,7 +189,7 @@ namespace DiscImageChef.Server else divPcmcia.Visible = false; bool removable = true; - testedMediaType[] testedMedia = null; + List testedMedia = null; bool ata = false; bool atapi = false; bool sscMedia = false; @@ -233,7 +199,7 @@ namespace DiscImageChef.Server ata = true; List ataOneValue = new List(); Dictionary ataTwoValue = new Dictionary(); - ataType ataReport; + CommonTypes.Metadata.Ata ataReport; if(report.ATAPI != null) { @@ -243,7 +209,7 @@ namespace DiscImageChef.Server } else ataReport = report.ATA; - bool cfa = report.CompactFlashSpecified && report.CompactFlash; + bool cfa = report.CompactFlash; if(atapi && !cfa) lblAtaDeviceType.Text = "ATAPI device"; else if(!atapi && cfa) lblAtaDeviceType.Text = "CompactFlash device"; @@ -264,13 +230,16 @@ namespace DiscImageChef.Server Dictionary modePages = new Dictionary(); Dictionary evpdPages = new Dictionary(); - lblScsiVendor.Text = - VendorString.Prettify(report.SCSI.Inquiry.VendorIdentification) != - report.SCSI.Inquiry.VendorIdentification - ? $"{report.SCSI.Inquiry.VendorIdentification} ({VendorString.Prettify(report.SCSI.Inquiry.VendorIdentification)})" - : report.SCSI.Inquiry.VendorIdentification; - lblScsiProduct.Text = report.SCSI.Inquiry.ProductIdentification; - lblScsiRevision.Text = report.SCSI.Inquiry.ProductRevisionLevel; + string vendorId = StringHandlers.CToString(report.SCSI.Inquiry?.VendorIdentification); + if(report.SCSI.Inquiry != null) + { + Inquiry.SCSIInquiry inq = report.SCSI.Inquiry.Value; + lblScsiVendor.Text = VendorString.Prettify(vendorId) != vendorId + ? $"{vendorId} ({VendorString.Prettify(vendorId)})" + : vendorId; + lblScsiProduct.Text = StringHandlers.CToString(inq.ProductIdentification); + lblScsiRevision.Text = StringHandlers.CToString(inq.ProductRevisionLevel); + } scsiOneValue.AddRange(ScsiInquiry.Report(report.SCSI.Inquiry)); @@ -279,8 +248,12 @@ namespace DiscImageChef.Server if(report.SCSI.SupportsModeSubpages) scsiOneValue.Add("Device supports MODE SENSE subpages"); if(report.SCSI.ModeSense != null) - ScsiModeSense.Report(report.SCSI.ModeSense, report.SCSI.Inquiry.VendorIdentification, - report.SCSI.Inquiry.PeripheralDeviceType, ref scsiOneValue, ref modePages); + { + PeripheralDeviceTypes devType = PeripheralDeviceTypes.DirectAccess; + if(report.SCSI.Inquiry != null) + devType = (PeripheralDeviceTypes)report.SCSI.Inquiry.Value.PeripheralDeviceType; + ScsiModeSense.Report(report.SCSI.ModeSense, vendorId, devType, ref scsiOneValue, ref modePages); + } if(modePages.Count > 0) { @@ -289,8 +262,7 @@ namespace DiscImageChef.Server } else divScsiModeSense.Visible = false; - if(report.SCSI.EVPDPages != null) - ScsiEvpd.Report(report.SCSI.EVPDPages, report.SCSI.Inquiry.VendorIdentification, ref evpdPages); + if(report.SCSI.EVPDPages != null) ScsiEvpd.Report(report.SCSI.EVPDPages, vendorId, ref evpdPages); if(evpdPages.Count > 0) { @@ -335,17 +307,14 @@ namespace DiscImageChef.Server { divScsiSsc.Visible = true; - lblScsiSscGranularity.Text = report.SCSI.SequentialDevice.BlockSizeGranularitySpecified - ? report.SCSI.SequentialDevice.BlockSizeGranularity.ToString() - : "Unspecified"; + lblScsiSscGranularity.Text = + report.SCSI.SequentialDevice.BlockSizeGranularity?.ToString() ?? "Unspecified"; - lblScsiSscMaxBlock.Text = report.SCSI.SequentialDevice.MaxBlockLengthSpecified - ? report.SCSI.SequentialDevice.MaxBlockLength.ToString() - : "Unspecified"; + lblScsiSscMaxBlock.Text = + report.SCSI.SequentialDevice.MaxBlockLength?.ToString() ?? "Unspecified"; - lblScsiSscMinBlock.Text = report.SCSI.SequentialDevice.MinBlockLengthSpecified - ? report.SCSI.SequentialDevice.MinBlockLength.ToString() - : "Unspecified"; + lblScsiSscMinBlock.Text = + report.SCSI.SequentialDevice.MinBlockLength?.ToString() ?? "Unspecified"; if(report.SCSI.SequentialDevice.SupportedDensities != null) { @@ -380,8 +349,8 @@ namespace DiscImageChef.Server removable = false; scsiOneValue.Add(""); - if(report.SCSI.ReadCapabilities.BlocksSpecified && - report.SCSI.ReadCapabilities.BlockSizeSpecified) + if(report.SCSI.ReadCapabilities.Blocks.HasValue && + report.SCSI.ReadCapabilities.BlockSize.HasValue) { scsiOneValue .Add($"Device has {report.SCSI.ReadCapabilities.Blocks} blocks of {report.SCSI.ReadCapabilities.BlockSize} bytes each"); @@ -400,29 +369,29 @@ namespace DiscImageChef.Server .Add($"Device size: {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize} bytes, {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / 1000 / 1000} Mb, {(double)(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize) / 1024 / 1024:F2} MiB"); } - if(report.SCSI.ReadCapabilities.MediumTypeSpecified) + if(report.SCSI.ReadCapabilities.MediumType.HasValue) scsiOneValue.Add($"Medium type code: {report.SCSI.ReadCapabilities.MediumType:X2}h"); - if(report.SCSI.ReadCapabilities.DensitySpecified) + if(report.SCSI.ReadCapabilities.Density.HasValue) scsiOneValue.Add($"Density code: {report.SCSI.ReadCapabilities.Density:X2}h"); - if((report.SCSI.ReadCapabilities.SupportsReadLong || - report.SCSI.ReadCapabilities.SupportsReadLong16) && - report.SCSI.ReadCapabilities.LongBlockSizeSpecified) + if((report.SCSI.ReadCapabilities.SupportsReadLong == true || + report.SCSI.ReadCapabilities.SupportsReadLong16 == true) && + report.SCSI.ReadCapabilities.LongBlockSize.HasValue) scsiOneValue.Add($"Long block size: {report.SCSI.ReadCapabilities.LongBlockSize} bytes"); - if(report.SCSI.ReadCapabilities.SupportsReadCapacity) + if(report.SCSI.ReadCapabilities.SupportsReadCapacity == true) scsiOneValue.Add("Device supports READ CAPACITY (10) command."); - if(report.SCSI.ReadCapabilities.SupportsReadCapacity16) + if(report.SCSI.ReadCapabilities.SupportsReadCapacity16 == true) scsiOneValue.Add("Device supports READ CAPACITY (16) command."); - if(report.SCSI.ReadCapabilities.SupportsRead) + if(report.SCSI.ReadCapabilities.SupportsRead6 == true) scsiOneValue.Add("Device supports READ (6) command."); - if(report.SCSI.ReadCapabilities.SupportsRead10) + if(report.SCSI.ReadCapabilities.SupportsRead10 == true) scsiOneValue.Add("Device supports READ (10) command."); - if(report.SCSI.ReadCapabilities.SupportsRead12) + if(report.SCSI.ReadCapabilities.SupportsRead12 == true) scsiOneValue.Add("Device supports READ (12) command."); - if(report.SCSI.ReadCapabilities.SupportsRead16) + if(report.SCSI.ReadCapabilities.SupportsRead16 == true) scsiOneValue.Add("Device supports READ (16) command."); - if(report.SCSI.ReadCapabilities.SupportsReadLong) + if(report.SCSI.ReadCapabilities.SupportsReadLong == true) scsiOneValue.Add("Device supports READ LONG (10) command."); - if(report.SCSI.ReadCapabilities.SupportsReadLong16) + if(report.SCSI.ReadCapabilities.SupportsReadLong16 == true) scsiOneValue.Add("Device supports READ LONG (16) command."); } else testedMedia = report.SCSI.RemovableMedias; @@ -509,7 +478,7 @@ namespace DiscImageChef.Server if(removable && !sscMedia && testedMedia != null) { List mediaOneValue = new List(); - TestedMedia.Report(testedMedia, ata, ref mediaOneValue); + App_Start.TestedMedia.Report(testedMedia, ref mediaOneValue); if(mediaOneValue.Count > 0) { divTestedMedia.Visible = true; diff --git a/DiscImageChef.sln.DotSettings b/DiscImageChef.sln.DotSettings index 1235e3f99..5dfe170be 100644 --- a/DiscImageChef.sln.DotSettings +++ b/DiscImageChef.sln.DotSettings @@ -177,4 +177,6 @@ </TypePattern> </Patterns> True - True \ No newline at end of file + True + True + True \ No newline at end of file