diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs index 1b7d3d8c6..dd4151a8b 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs @@ -114,7 +114,11 @@ partial class Dump sense = _dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x01, _dev.Timeout, out _); - if(sense) + Modes.DecodedMode? dcMode6 = null; + if(!sense) + dcMode6 = Modes.DecodeMode6(cmdBuf, PeripheralDeviceTypes.MultiMediaDevice); + + if(sense || dcMode6 is null) { sense = _dev.ModeSense10(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x01, _dev.Timeout, out _); @@ -133,8 +137,6 @@ partial class Dump } else { - Modes.DecodedMode? dcMode6 = Modes.DecodeMode6(cmdBuf, PeripheralDeviceTypes.MultiMediaDevice); - if(dcMode6?.Pages != null) { foreach(Modes.ModePage modePage in dcMode6.Value.Pages.Where(modePage => modePage is diff --git a/Aaru.Core/Devices/Dumping/PlayStationPortable/MemoryStick.cs b/Aaru.Core/Devices/Dumping/PlayStationPortable/MemoryStick.cs index 250f069a3..d89bdc90d 100644 --- a/Aaru.Core/Devices/Dumping/PlayStationPortable/MemoryStick.cs +++ b/Aaru.Core/Devices/Dumping/PlayStationPortable/MemoryStick.cs @@ -373,7 +373,11 @@ public partial class Dump sense = _dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, _dev.Timeout, out _); - if(sense) + Modes.DecodedMode? dcMode6 = null; + if(!sense) + dcMode6 = Modes.DecodeMode6(readBuffer, _dev.ScsiType); + + if(sense || dcMode6 is null) { sense = _dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, _dev.Timeout, out _); @@ -392,8 +396,6 @@ public partial class Dump } else { - Modes.DecodedMode? dcMode6 = Modes.DecodeMode6(readBuffer, _dev.ScsiType); - if(dcMode6.HasValue) { foreach(Modes.ModePage modePage in dcMode6.Value.Pages.Where(modePage => diff --git a/Aaru.Core/Devices/Dumping/Sbc/Error.cs b/Aaru.Core/Devices/Dumping/Sbc/Error.cs index 4c8203bdd..7443b42fa 100644 --- a/Aaru.Core/Devices/Dumping/Sbc/Error.cs +++ b/Aaru.Core/Devices/Dumping/Sbc/Error.cs @@ -77,7 +77,11 @@ partial class Dump sense = _dev.ModeSense6(out buffer, out _, false, ScsiModeSensePageControl.Current, 0x01, _dev.Timeout, out _); - if(sense) + Modes.DecodedMode? dcMode6 = null; + if(!sense) + dcMode6 = Modes.DecodeMode6(buffer, _dev.ScsiType); + + if(sense || dcMode6 is null) { sense = _dev.ModeSense10(out buffer, out _, false, ScsiModeSensePageControl.Current, 0x01, _dev.Timeout, out _); @@ -96,8 +100,6 @@ partial class Dump } else { - Modes.DecodedMode? dcMode6 = Modes.DecodeMode6(buffer, _dev.ScsiType); - if(dcMode6?.Pages != null) { foreach(Modes.ModePage modePage in dcMode6.Value.Pages.Where(modePage => modePage is diff --git a/Aaru.Core/Devices/Dumping/XGD.cs b/Aaru.Core/Devices/Dumping/XGD.cs index 3072c55b5..82b39dd73 100644 --- a/Aaru.Core/Devices/Dumping/XGD.cs +++ b/Aaru.Core/Devices/Dumping/XGD.cs @@ -971,9 +971,6 @@ partial class Dump Humanize())); UpdateStatus?.Invoke(string.Format(Localization.Core.Average_write_speed_0, - ByteSize.FromBytes(blockSize * (blocks + 1)). - Per(imageWriteDuration.Seconds()). - Humanize())); _dumpLog.WriteLine(string.Format(Localization.Core.Dump_finished_in_0, _dumpStopwatch.Elapsed.Humanize(minUnit: TimeUnit.Second))); @@ -1071,7 +1068,11 @@ partial class Dump sense = _dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, _dev.Timeout, out _); - if(sense) + Modes.DecodedMode? dcMode6 = null; + if(!sense) + dcMode6 = Modes.DecodeMode6(readBuffer, PeripheralDeviceTypes.MultiMediaDevice); + + if(sense || dcMode6 is null) { sense = _dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, _dev.Timeout, out _); @@ -1091,8 +1092,6 @@ partial class Dump } else { - Modes.DecodedMode? dcMode6 = Modes.DecodeMode6(readBuffer, PeripheralDeviceTypes.MultiMediaDevice); - if(dcMode6.HasValue) { foreach(Modes.ModePage modePage in dcMode6.Value.Pages.Where(modePage => diff --git a/Aaru.Decoders/SCSI/Modes/Mode6.cs b/Aaru.Decoders/SCSI/Modes/Mode6.cs index 33e4773f5..87caa8112 100644 --- a/Aaru.Decoders/SCSI/Modes/Mode6.cs +++ b/Aaru.Decoders/SCSI/Modes/Mode6.cs @@ -55,6 +55,11 @@ public static partial class Modes if(modeResponse[3] > 0) { + // An incorrect size field, we cannot know if the following bytes are really the pages (probably not), + // so consider the MODE SENSE(6) response as invalid + if(modeResponse[3] + 4 > modeResponse.Length) + return null; + header.BlockDescriptors = new BlockDescriptor[modeResponse[3] / 8]; for(var i = 0; i < header.BlockDescriptors.Length; i++) diff --git a/Aaru.Images/ZZZRawImage/Read.cs b/Aaru.Images/ZZZRawImage/Read.cs index cbaa249d8..185e7c3f5 100644 --- a/Aaru.Images/ZZZRawImage/Read.cs +++ b/Aaru.Images/ZZZRawImage/Read.cs @@ -986,10 +986,10 @@ public sealed partial class ZZZRawImage Modes.DecodedMode? decMode = null; - if(_mediaTags.TryGetValue(MediaTagType.SCSI_MODESENSE_6, out byte[] mode6)) - decMode = Modes.DecodeMode6(mode6, devType); - else if(_mediaTags.TryGetValue(MediaTagType.SCSI_MODESENSE_10, out byte[] mode10)) + if(_mediaTags.TryGetValue(MediaTagType.SCSI_MODESENSE_10, out byte[] mode10)) decMode = Modes.DecodeMode10(mode10, devType); + else if(_mediaTags.TryGetValue(MediaTagType.SCSI_MODESENSE_6, out byte[] mode6)) + decMode = Modes.DecodeMode6(mode6, devType); byte mediumType = 0; byte densityCode = 0; @@ -1067,8 +1067,8 @@ public sealed partial class ZZZRawImage _imageInfo.MediaType = MediaTypeFromDevice.GetFromScsi((byte)devType, _imageInfo.DriveManufacturer, _imageInfo.DriveModel, mediumType, densityCode, _imageInfo.Sectors, _imageInfo.SectorSize, - _mediaTags.ContainsKey(MediaTagType. - USB_Descriptors), _rawCompactDisc); + _mediaTags.ContainsKey(MediaTagType + .USB_Descriptors), _rawCompactDisc); } if(_imageInfo.MediaType == MediaType.Unknown) @@ -1164,8 +1164,8 @@ public sealed partial class ZZZRawImage var fs = new FileStream(basename + ".metadata.json", FileMode.Open); AaruMetadata = - (JsonSerializer.Deserialize(fs, typeof(MetadataJson), MetadataJsonContext.Default) as MetadataJson)? - .AaruMetadata; + (JsonSerializer.Deserialize(fs, typeof(MetadataJson), MetadataJsonContext.Default) as MetadataJson) + ?.AaruMetadata; fs.Close(); }