From a37e0f3e7e5af0cd2f5e335fa1ee56608f021190 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 27 Oct 2022 10:59:41 +0100 Subject: [PATCH] Add workaround for device report the AccessTek/Optorite DD0203 drive. --- Aaru.Core/Devices/Report/MMC.cs | 93 +++++++++++++++++++++------------ Aaru.sln.DotSettings | 1 + 2 files changed, 62 insertions(+), 32 deletions(-) diff --git a/Aaru.Core/Devices/Report/MMC.cs b/Aaru.Core/Devices/Report/MMC.cs index dc0979c80..6f0e7badf 100644 --- a/Aaru.Core/Devices/Report/MMC.cs +++ b/Aaru.Core/Devices/Report/MMC.cs @@ -1429,15 +1429,22 @@ public sealed partial class DeviceReport mediaTest.RWSubchannelData = buffer; - mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 11, 2448, 1, - MmcSectorTypes.Cdda, false, false, false, - MmcHeaderCodes.None, true, false, - MmcErrorField.None, MmcSubchannel.Rw, - _dev.Timeout, out _); + // AccessTek/Optorite DD0203 returns OK but then the firmware dies + if(_dev.Model.StartsWith("DVD RW 4XMax", StringComparison.Ordinal)) + mediaTest.CanReadCorrectedSubchannel = false; + else + { + mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 11, 2448, 1, + MmcSectorTypes.Cdda, false, false, false, + MmcHeaderCodes.None, true, false, + MmcErrorField.None, MmcSubchannel.Rw, + _dev.Timeout, out _); - AaruConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCorrectedSubchannel); + AaruConsole.DebugWriteLine("SCSI Report", "Sense = {0}", + !mediaTest.CanReadCorrectedSubchannel); - mediaTest.CorrectedSubchannelData = buffer; + mediaTest.CorrectedSubchannelData = buffer; + } }); Spectre.ProgressSingleSpinner(ctx => @@ -1564,15 +1571,22 @@ public sealed partial class DeviceReport mediaTest.RWSubchannelData = buffer; - mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2448, 1, - MmcSectorTypes.AllTypes, false, false, true, - MmcHeaderCodes.AllHeaders, true, true, - MmcErrorField.None, MmcSubchannel.Rw, - _dev.Timeout, out _); + // AccessTek/Optorite DD0203 returns OK but then the firmware dies + if(_dev.Model.StartsWith("DVD RW 4XMax", StringComparison.Ordinal)) + mediaTest.CanReadCorrectedSubchannel = false; + else + { + mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2448, 1, + MmcSectorTypes.AllTypes, false, false, true, + MmcHeaderCodes.AllHeaders, true, true, + MmcErrorField.None, MmcSubchannel.Rw, + _dev.Timeout, out _); - AaruConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCorrectedSubchannel); + AaruConsole.DebugWriteLine("SCSI Report", "Sense = {0}", + !mediaTest.CanReadCorrectedSubchannel); - mediaTest.CorrectedSubchannelData = buffer; + mediaTest.CorrectedSubchannelData = buffer; + } }); Spectre.ProgressSingleSpinner(ctx => @@ -1627,19 +1641,27 @@ public sealed partial class DeviceReport true, MmcErrorField.C2Pointers, MmcSubchannel.Rw, _dev.Timeout, out _); - if(mediaTest.CanReadCorrectedSubchannelWithC2 == false) - mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, 16, - 2714, 1, MmcSectorTypes.AllTypes, - false, false, true, - MmcHeaderCodes.AllHeaders, true, true, - MmcErrorField.C2PointersAndBlock, - MmcSubchannel.Rw, _dev.Timeout, - out _); + // AccessTek/Optorite DD0203 returns OK but then the firmware dies + if(_dev.Model.StartsWith("DVD RW 4XMax", StringComparison.Ordinal)) + mediaTest.CanReadCorrectedSubchannel = false; + else + { + if(mediaTest.CanReadCorrectedSubchannelWithC2 == false) + mediaTest.CanReadCorrectedSubchannelWithC2 = !_dev.ReadCd(out buffer, out senseBuffer, + 16, 2714, 1, + MmcSectorTypes.AllTypes, false, + false, true, + MmcHeaderCodes.AllHeaders, true, + true, + MmcErrorField.C2PointersAndBlock, + MmcSubchannel.Rw, _dev.Timeout, + out _); - AaruConsole.DebugWriteLine("SCSI Report", "Sense = {0}", - !mediaTest.CanReadCorrectedSubchannelWithC2); + AaruConsole.DebugWriteLine("SCSI Report", "Sense = {0}", + !mediaTest.CanReadCorrectedSubchannelWithC2); - mediaTest.CorrectedSubchannelWithC2Data = buffer; + mediaTest.CorrectedSubchannelWithC2Data = buffer; + } } }); } @@ -1695,15 +1717,22 @@ public sealed partial class DeviceReport mediaTest.RWSubchannelData = buffer; - mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2144, 1, - MmcSectorTypes.AllTypes, false, false, false, - MmcHeaderCodes.None, true, false, - MmcErrorField.None, MmcSubchannel.Rw, - _dev.Timeout, out _); + // AccessTek/Optorite DD0203 returns OK but then the firmware dies + if(_dev.Model.StartsWith("DVD RW 4XMax", StringComparison.Ordinal)) + mediaTest.CanReadCorrectedSubchannel = false; + else + { + mediaTest.CanReadCorrectedSubchannel = !_dev.ReadCd(out buffer, out senseBuffer, 16, 2144, 1, + MmcSectorTypes.AllTypes, false, false, + false, MmcHeaderCodes.None, true, false, + MmcErrorField.None, MmcSubchannel.Rw, + _dev.Timeout, out _); - AaruConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadCorrectedSubchannel); + AaruConsole.DebugWriteLine("SCSI Report", "Sense = {0}", + !mediaTest.CanReadCorrectedSubchannel); - mediaTest.CorrectedSubchannelData = buffer; + mediaTest.CorrectedSubchannelData = buffer; + } }); Spectre.ProgressSingleSpinner(ctx => diff --git a/Aaru.sln.DotSettings b/Aaru.sln.DotSettings index 2ea982ec2..0dbc9420b 100644 --- a/Aaru.sln.DotSettings +++ b/Aaru.sln.DotSettings @@ -465,6 +465,7 @@ True True True + True True True True