2017-05-28 21:01:17 +01:00
// /***************************************************************************
// The Disc Image Chef
// ----------------------------------------------------------------------------
//
// Filename : MMC.cs
2017-12-19 03:50:57 +00:00
// Author(s) : Natalia Portillo <claunia@claunia.com>
2017-05-28 21:01:17 +01:00
//
2017-12-19 03:50:57 +00:00
// Component : Core algorithms.
2017-05-28 21:01:17 +01:00
//
// --[ Description ] ----------------------------------------------------------
//
2017-12-19 03:50:57 +00:00
// Creates reports from SCSI MultiMedia devices.
2017-05-28 21:01:17 +01:00
//
// --[ License ] --------------------------------------------------------------
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
2017-12-19 03:50:57 +00:00
// Copyright © 2011-2018 Natalia Portillo
2017-05-28 21:01:17 +01:00
// ****************************************************************************/
2017-12-19 03:50:57 +00:00
2017-05-28 21:01:17 +01:00
using System ;
using System.Collections.Generic ;
using System.IO ;
2017-12-21 14:30:38 +00:00
using System.Text ;
using System.Threading ;
2018-06-25 19:08:16 +01:00
using DiscImageChef.CommonTypes.Metadata ;
2017-05-28 21:01:17 +01:00
using DiscImageChef.Console ;
2017-12-21 14:30:38 +00:00
using DiscImageChef.Decoders.SCSI ;
using DiscImageChef.Decoders.SCSI.MMC ;
2017-05-28 21:01:17 +01:00
using DiscImageChef.Devices ;
namespace DiscImageChef.Core.Devices.Report.SCSI
{
2017-12-23 01:46:08 +00:00
/// <summary>
2017-12-23 17:41:23 +00:00
/// Implements creating a report for a SCSI MultiMedia device
2017-12-23 01:46:08 +00:00
/// </summary>
2017-12-20 17:46:47 +00:00
static class Mmc
2017-05-28 21:01:17 +01:00
{
2017-12-23 01:46:08 +00:00
/// <summary>
2017-12-23 17:41:23 +00:00
/// Fills a SCSI device report with parameters and media tests specific to a MultiMedia device
2017-12-23 01:46:08 +00:00
/// </summary>
/// <param name="dev">Device</param>
/// <param name="report">Device report</param>
/// <param name="debug">If debug is enabled</param>
/// <param name="cdromMode">Decoded MODE PAGE 2Ah</param>
internal static void Report ( Device dev , ref DeviceReport report , bool debug , ref Modes . ModePage_2A ? cdromMode )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
if ( report = = null ) return ;
2017-05-28 21:01:17 +01:00
2018-06-22 08:08:38 +01:00
bool sense ;
2017-12-21 23:00:30 +00:00
const uint TIMEOUT = 5 ;
2017-05-28 21:01:17 +01:00
2017-12-23 01:46:08 +00:00
List < string > mediaTypes = new List < string > ( ) ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice = new mmcType ( ) ;
if ( cdromMode . HasValue )
{
report . SCSI . MultiMediaDevice . ModeSense2A = new mmcModeType ( ) ;
if ( cdromMode . Value . BufferSize ! = 0 )
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . BufferSize = cdromMode . Value . BufferSize ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . BufferSizeSpecified = true ;
}
2018-06-22 08:08:38 +01:00
2017-05-28 21:01:17 +01:00
if ( cdromMode . Value . CurrentSpeed ! = 0 )
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . CurrentSpeed = cdromMode . Value . CurrentSpeed ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . CurrentSpeedSpecified = true ;
}
2018-06-22 08:08:38 +01:00
2017-05-28 21:01:17 +01:00
if ( cdromMode . Value . CurrentWriteSpeed ! = 0 )
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . CurrentWriteSpeed =
cdromMode . Value . CurrentWriteSpeed ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . CurrentWriteSpeedSpecified = true ;
}
2018-06-22 08:08:38 +01:00
2017-05-28 21:01:17 +01:00
if ( cdromMode . Value . CurrentWriteSpeedSelected ! = 0 )
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . ModeSense2A . CurrentWriteSpeedSelected =
cdromMode . Value . CurrentWriteSpeedSelected ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . CurrentWriteSpeedSelectedSpecified = true ;
}
2018-06-22 08:08:38 +01:00
2017-05-28 21:01:17 +01:00
if ( cdromMode . Value . MaximumSpeed ! = 0 )
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . MaximumSpeed = cdromMode . Value . MaximumSpeed ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . MaximumSpeedSpecified = true ;
}
2018-06-22 08:08:38 +01:00
2017-05-28 21:01:17 +01:00
if ( cdromMode . Value . MaxWriteSpeed ! = 0 )
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . MaximumWriteSpeed = cdromMode . Value . MaxWriteSpeed ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . MaximumWriteSpeedSpecified = true ;
}
2018-06-22 08:08:38 +01:00
2017-05-28 21:01:17 +01:00
if ( cdromMode . Value . RotationControlSelected ! = 0 )
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . ModeSense2A . RotationControlSelected =
cdromMode . Value . RotationControlSelected ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . RotationControlSelectedSpecified = true ;
}
2018-06-22 08:08:38 +01:00
2017-05-28 21:01:17 +01:00
if ( cdromMode . Value . SupportedVolumeLevels ! = 0 )
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . ModeSense2A . SupportedVolumeLevels =
cdromMode . Value . SupportedVolumeLevels ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . SupportedVolumeLevelsSpecified = true ;
}
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . AccurateCDDA = cdromMode . Value . AccurateCDDA ;
report . SCSI . MultiMediaDevice . ModeSense2A . BCK = cdromMode . Value . BCK ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . BufferUnderRunProtection = cdromMode . Value . BUF ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . CanEject = cdromMode . Value . Eject ;
report . SCSI . MultiMediaDevice . ModeSense2A . CanLockMedia = cdromMode . Value . Lock ;
report . SCSI . MultiMediaDevice . ModeSense2A . CDDACommand = cdromMode . Value . CDDACommand ;
report . SCSI . MultiMediaDevice . ModeSense2A . CompositeAudioVideo = cdromMode . Value . Composite ;
report . SCSI . MultiMediaDevice . ModeSense2A . CSSandCPPMSupported = cdromMode . Value . CMRSupported = = 1 ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . DeterministicSlotChanger = cdromMode . Value . SDP ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . DigitalPort1 = cdromMode . Value . DigitalPort1 ;
report . SCSI . MultiMediaDevice . ModeSense2A . DigitalPort2 = cdromMode . Value . DigitalPort2 ;
report . SCSI . MultiMediaDevice . ModeSense2A . LeadInPW = cdromMode . Value . LeadInPW ;
report . SCSI . MultiMediaDevice . ModeSense2A . LoadingMechanismType = cdromMode . Value . LoadingMechanism ;
report . SCSI . MultiMediaDevice . ModeSense2A . LockStatus = cdromMode . Value . LockState ;
report . SCSI . MultiMediaDevice . ModeSense2A . LSBF = cdromMode . Value . LSBF ;
report . SCSI . MultiMediaDevice . ModeSense2A . PlaysAudio = cdromMode . Value . AudioPlay ;
report . SCSI . MultiMediaDevice . ModeSense2A . PreventJumperStatus = cdromMode . Value . PreventJumper ;
report . SCSI . MultiMediaDevice . ModeSense2A . RCK = cdromMode . Value . RCK ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsBarcode = cdromMode . Value . ReadBarcode ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsBothSides = cdromMode . Value . SCC ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsCDR = cdromMode . Value . ReadCDR ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsCDRW = cdromMode . Value . ReadCDRW ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsDeinterlavedSubchannel =
cdromMode . Value . DeinterlaveSubchannel ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsDVDR = cdromMode . Value . ReadDVDR ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsDVDRAM = cdromMode . Value . ReadDVDRAM ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsDVDROM = cdromMode . Value . ReadDVDROM ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsISRC = cdromMode . Value . ISRC ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsMode2Form2 = cdromMode . Value . Mode2Form2 ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsMode2Form1 = cdromMode . Value . Mode2Form1 ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsPacketCDR = cdromMode . Value . Method2 ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsSubchannel = cdromMode . Value . Subchannel ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReadsUPC = cdromMode . Value . UPC ;
report . SCSI . MultiMediaDevice . ModeSense2A . ReturnsC2Pointers = cdromMode . Value . C2Pointer ;
report . SCSI . MultiMediaDevice . ModeSense2A . SeparateChannelMute = cdromMode . Value . SeparateChannelMute ;
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . SeparateChannelVolume = cdromMode . Value . SeparateChannelVolume ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . ModeSense2A . SSS = cdromMode . Value . SSS ;
report . SCSI . MultiMediaDevice . ModeSense2A . SupportsMultiSession = cdromMode . Value . MultiSession ;
report . SCSI . MultiMediaDevice . ModeSense2A . TestWrite = cdromMode . Value . TestWrite ;
report . SCSI . MultiMediaDevice . ModeSense2A . WritesCDR = cdromMode . Value . WriteCDR ;
report . SCSI . MultiMediaDevice . ModeSense2A . WritesCDRW = cdromMode . Value . WriteCDRW ;
report . SCSI . MultiMediaDevice . ModeSense2A . WritesDVDR = cdromMode . Value . WriteDVDR ;
report . SCSI . MultiMediaDevice . ModeSense2A . WritesDVDRAM = cdromMode . Value . WriteDVDRAM ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . ModeSense2A . WriteSpeedPerformanceDescriptors =
cdromMode . Value . WriteSpeedPerformanceDescriptors ;
2017-05-28 21:01:17 +01:00
mediaTypes . Add ( "CD-ROM" ) ;
mediaTypes . Add ( "Audio CD" ) ;
2017-12-19 20:33:03 +00:00
if ( cdromMode . Value . ReadCDR ) mediaTypes . Add ( "CD-R" ) ;
if ( cdromMode . Value . ReadCDRW ) mediaTypes . Add ( "CD-RW" ) ;
if ( cdromMode . Value . ReadDVDROM ) mediaTypes . Add ( "DVD-ROM" ) ;
if ( cdromMode . Value . ReadDVDRAM ) mediaTypes . Add ( "DVD-RAM" ) ;
if ( cdromMode . Value . ReadDVDR ) mediaTypes . Add ( "DVD-R" ) ;
2017-05-28 21:01:17 +01:00
}
DicConsole . WriteLine ( "Querying MMC GET CONFIGURATION..." ) ;
2017-12-21 23:00:30 +00:00
sense = dev . GetConfiguration ( out byte [ ] buffer , out byte [ ] senseBuffer , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! sense )
{
2017-12-21 14:30:38 +00:00
Features . SeparatedFeatures ftr = Features . Separate ( buffer ) ;
2017-05-28 21:01:17 +01:00
if ( ftr . Descriptors ! = null & & ftr . Descriptors . Length > 0 )
{
report . SCSI . MultiMediaDevice . Features = new mmcFeaturesType ( ) ;
2017-12-21 14:30:38 +00:00
foreach ( Features . FeatureDescriptor desc in ftr . Descriptors )
2017-05-28 21:01:17 +01:00
switch ( desc . Code )
{
case 0x0001 :
2017-12-19 20:33:03 +00:00
{
2017-12-23 17:41:23 +00:00
Feature_0001 ? ftr0001 = Features . Decode_0001 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0001 . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . PhysicalInterfaceStandard =
ftr0001 . Value . PhysicalInterfaceStandard ;
report . SCSI . MultiMediaDevice . Features . PhysicalInterfaceStandardSpecified = true ;
if ( ( uint ) ftr0001 . Value . PhysicalInterfaceStandard > 0x8 )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . PhysicalInterfaceStandardNumber =
( uint ) ftr0001 . Value . PhysicalInterfaceStandard ;
report . SCSI . MultiMediaDevice . Features . PhysicalInterfaceStandardNumberSpecified =
true ;
report . SCSI . MultiMediaDevice . Features . PhysicalInterfaceStandard =
2017-12-21 14:30:38 +00:00
PhysicalInterfaces . Unspecified ;
2017-05-28 21:01:17 +01:00
}
2018-06-22 08:08:38 +01:00
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . SupportsDeviceBusyEvent = ftr0001 . Value . DBE ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0003 :
2017-12-19 20:33:03 +00:00
{
2017-12-23 17:41:23 +00:00
Feature_0003 ? ftr0003 = Features . Decode_0003 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0003 . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . LoadingMechanismType =
ftr0003 . Value . LoadingMechanismType ;
report . SCSI . MultiMediaDevice . Features . LoadingMechanismTypeSpecified = true ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanLoad =
ftr0003 . Value . Load ;
report . SCSI . MultiMediaDevice . Features . CanEject =
ftr0003 . Value . Eject ;
report . SCSI . MultiMediaDevice . Features . PreventJumper =
ftr0003 . Value . PreventJumper ;
report . SCSI . MultiMediaDevice . Features . DBML =
ftr0003 . Value . DBML ;
report . SCSI . MultiMediaDevice . Features . Locked =
ftr0003 . Value . Lock ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0004 :
2017-12-19 20:33:03 +00:00
{
2017-12-23 17:41:23 +00:00
Feature_0004 ? ftr0004 = Features . Decode_0004 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0004 . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . SupportsWriteProtectPAC = ftr0004 . Value . DWP ;
report . SCSI . MultiMediaDevice . Features . SupportsWriteInhibitDCB = ftr0004 . Value . WDCB ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . SupportsPWP = ftr0004 . Value . SPWP ;
report . SCSI . MultiMediaDevice . Features . SupportsSWPP = ftr0004 . Value . SSWPP ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0010 :
2017-12-19 20:33:03 +00:00
{
2017-12-23 17:41:23 +00:00
Feature_0010 ? ftr0010 = Features . Decode_0010 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0010 . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
if ( ftr0010 . Value . LogicalBlockSize > 0 )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . LogicalBlockSize =
ftr0010 . Value . LogicalBlockSize ;
report . SCSI . MultiMediaDevice . Features . LogicalBlockSizeSpecified = true ;
}
2018-06-22 08:08:38 +01:00
2017-12-19 20:33:03 +00:00
if ( ftr0010 . Value . Blocking > 0 )
{
report . SCSI . MultiMediaDevice . Features . BlocksPerReadableUnit =
ftr0010 . Value . Blocking ;
report . SCSI . MultiMediaDevice . Features . BlocksPerReadableUnitSpecified = true ;
2017-05-28 21:01:17 +01:00
}
2018-06-22 08:08:38 +01:00
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . ErrorRecoveryPage = ftr0010 . Value . PP ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x001D :
report . SCSI . MultiMediaDevice . Features . MultiRead = true ;
break ;
case 0x001E :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanReadCD = true ;
2017-12-23 17:41:23 +00:00
Feature_001E ? ftr001E = Features . Decode_001E ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr001E . HasValue )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . SupportsDAP = ftr001E . Value . DAP ;
report . SCSI . MultiMediaDevice . Features . SupportsC2 = ftr001E . Value . C2 ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanReadLeadInCDText = ftr001E . Value . CDText ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x001F :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanReadDVD = true ;
2017-12-23 17:41:23 +00:00
Feature_001F ? ftr001F = Features . Decode_001F ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr001F . HasValue )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . DVDMultiRead = ftr001F . Value . MULTI110 ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanReadAllDualRW = ftr001F . Value . DualRW ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanReadAllDualR = ftr001F . Value . DualR ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0022 :
report . SCSI . MultiMediaDevice . Features . CanEraseSector = true ;
break ;
case 0x0023 :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanFormat = true ;
2017-12-23 17:41:23 +00:00
Feature_0023 ? ftr0023 = Features . Decode_0023 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0023 . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanFormatBDREWithoutSpare =
ftr0023 . Value . RENoSA ;
report . SCSI . MultiMediaDevice . Features . CanExpandBDRESpareArea = ftr0023 . Value . Expand ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanFormatQCert = ftr0023 . Value . QCert ;
report . SCSI . MultiMediaDevice . Features . CanFormatCert = ftr0023 . Value . Cert ;
report . SCSI . MultiMediaDevice . Features . CanFormatFRF = ftr0023 . Value . FRF ;
report . SCSI . MultiMediaDevice . Features . CanFormatRRM = ftr0023 . Value . RRM ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0024 :
report . SCSI . MultiMediaDevice . Features . CanReadSpareAreaInformation = true ;
break ;
case 0x0027 :
report . SCSI . MultiMediaDevice . Features . CanWriteCDRWCAV = true ;
break ;
case 0x0028 :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanReadCDMRW = true ;
2017-12-23 17:41:23 +00:00
Feature_0028 ? ftr0028 = Features . Decode_0028 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0028 . HasValue )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanReadDVDPlusMRW = ftr0028 . Value . DVDPRead ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanWriteDVDPlusMRW = ftr0028 . Value . DVDPWrite ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanWriteCDMRW = ftr0028 . Value . Write ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x002A :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanReadDVDPlusRW = true ;
2017-12-23 17:41:23 +00:00
Feature_002A ? ftr002A = Features . Decode_002A ( desc . Data ) ;
if ( ftr002A . HasValue )
report . SCSI . MultiMediaDevice . Features . CanWriteDVDPlusRW = ftr002A . Value . Write ;
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x002B :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanReadDVDPlusR = true ;
2017-12-23 17:41:23 +00:00
Feature_002B ? ftr002B = Features . Decode_002B ( desc . Data ) ;
if ( ftr002B . HasValue )
report . SCSI . MultiMediaDevice . Features . CanWriteDVDPlusR = ftr002B . Value . Write ;
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x002D :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanWriteCDTAO = true ;
2017-12-23 17:41:23 +00:00
Feature_002D ? ftr002D = Features . Decode_002D ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr002D . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . BufferUnderrunFreeInTAO = ftr002D . Value . BUF ;
report . SCSI . MultiMediaDevice . Features . CanWriteRawSubchannelInTAO =
ftr002D . Value . RWRaw ;
report . SCSI . MultiMediaDevice . Features . CanWritePackedSubchannelInTAO =
ftr002D . Value . RWPack ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanTestWriteInTAO =
ftr002D . Value . TestWrite ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanOverwriteTAOTrack = ftr002D . Value . CDRW ;
report . SCSI . MultiMediaDevice . Features . CanWriteRWSubchannelInTAO =
ftr002D . Value . RWSubchannel ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x002E :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanWriteCDSAO = true ;
2017-12-23 17:41:23 +00:00
Feature_002E ? ftr002E = Features . Decode_002E ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr002E . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . BufferUnderrunFreeInSAO = ftr002E . Value . BUF ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanWriteRawMultiSession =
ftr002E . Value . RAWMS ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanWriteRaw = ftr002E . Value . RAW ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanTestWriteInSAO =
ftr002E . Value . TestWrite ;
report . SCSI . MultiMediaDevice . Features . CanOverwriteSAOTrack =
ftr002E . Value . CDRW ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanWriteRWSubchannelInSAO = ftr002E . Value . RW ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x002F :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanWriteDVDR = true ;
2017-12-23 17:41:23 +00:00
Feature_002F ? ftr002F = Features . Decode_002F ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr002F . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . BufferUnderrunFreeInDVD = ftr002F . Value . BUF ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanWriteDVDRDL = ftr002F . Value . RDL ;
report . SCSI . MultiMediaDevice . Features . CanTestWriteDVD =
ftr002F . Value . TestWrite ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanWriteDVDRW = ftr002F . Value . DVDRW ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0030 :
report . SCSI . MultiMediaDevice . Features . CanReadDDCD = true ;
break ;
case 0x0031 :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanWriteDDCDR = true ;
2017-12-23 17:41:23 +00:00
Feature_0031 ? ftr0031 = Features . Decode_0031 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0031 . HasValue )
report . SCSI . MultiMediaDevice . Features . CanTestWriteDDCDR = ftr0031 . Value . TestWrite ;
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0032 :
report . SCSI . MultiMediaDevice . Features . CanWriteDDCDRW = true ;
break ;
case 0x0037 :
report . SCSI . MultiMediaDevice . Features . CanWriteCDRW = true ;
break ;
case 0x0038 :
report . SCSI . MultiMediaDevice . Features . CanPseudoOverwriteBDR = true ;
break ;
case 0x003A :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanReadDVDPlusRWDL = true ;
2017-12-23 17:41:23 +00:00
Feature_003A ? ftr003A = Features . Decode_003A ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr003A . HasValue )
report . SCSI . MultiMediaDevice . Features . CanWriteDVDPlusRWDL = ftr003A . Value . Write ;
}
2017-05-28 21:01:17 +01:00
break ;
case 0x003B :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanReadDVDPlusRDL = true ;
2017-12-23 17:41:23 +00:00
Feature_003B ? ftr003B = Features . Decode_003B ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr003B . HasValue )
report . SCSI . MultiMediaDevice . Features . CanWriteDVDPlusRDL = ftr003B . Value . Write ;
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0040 :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanReadBD = true ;
2017-12-23 17:41:23 +00:00
Feature_0040 ? ftr0040 = Features . Decode_0040 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0040 . HasValue )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanReadBluBCA = ftr0040 . Value . BCA ;
report . SCSI . MultiMediaDevice . Features . CanReadBDRE2 = ftr0040 . Value . RE2 ;
report . SCSI . MultiMediaDevice . Features . CanReadBDRE1 = ftr0040 . Value . RE1 ;
report . SCSI . MultiMediaDevice . Features . CanReadOldBDRE = ftr0040 . Value . OldRE ;
report . SCSI . MultiMediaDevice . Features . CanReadBDR = ftr0040 . Value . R ;
report . SCSI . MultiMediaDevice . Features . CanReadOldBDR = ftr0040 . Value . OldR ;
report . SCSI . MultiMediaDevice . Features . CanReadBDROM = ftr0040 . Value . ROM ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanReadOldBDROM = ftr0040 . Value . OldROM ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0041 :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanWriteBD = true ;
2017-12-23 17:41:23 +00:00
Feature_0041 ? ftr0041 = Features . Decode_0041 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0041 . HasValue )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanWriteBDRE2 = ftr0041 . Value . RE2 ;
report . SCSI . MultiMediaDevice . Features . CanWriteBDRE1 = ftr0041 . Value . RE1 ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanWriteOldBDRE = ftr0041 . Value . OldRE ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanWriteBDR = ftr0041 . Value . R ;
report . SCSI . MultiMediaDevice . Features . CanWriteOldBDR = ftr0041 . Value . OldR ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0050 :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanReadHDDVD = true ;
2017-12-23 17:41:23 +00:00
Feature_0050 ? ftr0050 = Features . Decode_0050 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0050 . HasValue )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanReadHDDVDR = ftr0050 . Value . HDDVDR ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanReadHDDVDRAM = ftr0050 . Value . HDDVDRAM ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0051 :
2017-12-19 20:33:03 +00:00
{
// TODO: Write HD DVD-RW
2017-12-23 17:41:23 +00:00
Feature_0051 ? ftr0051 = Features . Decode_0051 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0051 . HasValue )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanWriteHDDVDR = ftr0051 . Value . HDDVDR ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanWriteHDDVDRAM = ftr0051 . Value . HDDVDRAM ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0080 :
report . SCSI . MultiMediaDevice . Features . SupportsHybridDiscs = true ;
break ;
case 0x0101 :
report . SCSI . MultiMediaDevice . Features . SupportsModePage1Ch = true ;
break ;
case 0x0102 :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . EmbeddedChanger = true ;
2017-12-23 17:41:23 +00:00
Feature_0102 ? ftr0102 = Features . Decode_0102 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0102 . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . ChangerIsSideChangeCapable =
ftr0102 . Value . SCC ;
report . SCSI . MultiMediaDevice . Features . ChangerSupportsDiscPresent =
ftr0102 . Value . SDP ;
report . SCSI . MultiMediaDevice . Features . ChangerSlots =
( byte ) ( ftr0102 . Value . HighestSlotNumber + 1 ) ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0103 :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . CanPlayCDAudio = true ;
2017-12-23 17:41:23 +00:00
Feature_0103 ? ftr0103 = Features . Decode_0103 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0103 . HasValue )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanAudioScan = ftr0103 . Value . Scan ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanMuteSeparateChannels = ftr0103 . Value . SCM ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . SupportsSeparateVolume = ftr0103 . Value . SV ;
2017-12-19 20:33:03 +00:00
if ( ftr0103 . Value . VolumeLevels > 0 )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . VolumeLevelsSpecified = true ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . VolumeLevels =
ftr0103 . Value . VolumeLevels ;
2017-05-28 21:01:17 +01:00
}
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0104 :
report . SCSI . MultiMediaDevice . Features . CanUpgradeFirmware = true ;
break ;
case 0x0106 :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . SupportsCSS = true ;
2017-12-23 17:41:23 +00:00
Feature_0106 ? ftr0106 = Features . Decode_0106 ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr0106 . HasValue )
if ( ftr0106 . Value . CSSVersion > 0 )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CSSVersionSpecified = true ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CSSVersion =
ftr0106 . Value . CSSVersion ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x0108 :
report . SCSI . MultiMediaDevice . Features . CanReportDriveSerial = true ;
break ;
case 0x0109 :
report . SCSI . MultiMediaDevice . Features . CanReportMediaSerial = true ;
break ;
case 0x010B :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . SupportsCPRM = true ;
2017-12-23 17:41:23 +00:00
Feature_010B ? ftr010B = Features . Decode_010B ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr010B . HasValue )
if ( ftr010B . Value . CPRMVersion > 0 )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CPRMVersionSpecified = true ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CPRMVersion =
ftr010B . Value . CPRMVersion ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x010C :
2017-12-19 20:33:03 +00:00
{
2017-12-23 17:41:23 +00:00
Feature_010C ? ftr010C = Features . Decode_010C ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr010C . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-21 23:00:30 +00:00
byte [ ] temp = new byte [ 4 ] ;
2017-12-19 20:33:03 +00:00
temp [ 0 ] = ( byte ) ( ( ftr010C . Value . Century & 0xFF00 ) > > 8 ) ;
temp [ 1 ] = ( byte ) ( ftr010C . Value . Century & 0xFF ) ;
temp [ 2 ] = ( byte ) ( ( ftr010C . Value . Year & 0xFF00 ) > > 8 ) ;
temp [ 3 ] = ( byte ) ( ftr010C . Value . Year & 0xFF ) ;
2017-12-21 23:00:30 +00:00
string syear = Encoding . ASCII . GetString ( temp ) ;
2018-06-22 08:08:38 +01:00
temp = new byte [ 2 ] ;
2017-12-19 20:33:03 +00:00
temp [ 0 ] = ( byte ) ( ( ftr010C . Value . Month & 0xFF00 ) > > 8 ) ;
temp [ 1 ] = ( byte ) ( ftr010C . Value . Month & 0xFF ) ;
2017-12-21 23:00:30 +00:00
string smonth = Encoding . ASCII . GetString ( temp ) ;
2018-06-22 08:08:38 +01:00
temp = new byte [ 2 ] ;
2017-12-19 20:33:03 +00:00
temp [ 0 ] = ( byte ) ( ( ftr010C . Value . Day & 0xFF00 ) > > 8 ) ;
temp [ 1 ] = ( byte ) ( ftr010C . Value . Day & 0xFF ) ;
2017-12-21 23:00:30 +00:00
string sday = Encoding . ASCII . GetString ( temp ) ;
2018-06-22 08:08:38 +01:00
temp = new byte [ 2 ] ;
2017-12-19 20:33:03 +00:00
temp [ 0 ] = ( byte ) ( ( ftr010C . Value . Hour & 0xFF00 ) > > 8 ) ;
temp [ 1 ] = ( byte ) ( ftr010C . Value . Hour & 0xFF ) ;
2017-12-21 23:00:30 +00:00
string shour = Encoding . ASCII . GetString ( temp ) ;
2018-06-22 08:08:38 +01:00
temp = new byte [ 2 ] ;
2017-12-19 20:33:03 +00:00
temp [ 0 ] = ( byte ) ( ( ftr010C . Value . Minute & 0xFF00 ) > > 8 ) ;
temp [ 1 ] = ( byte ) ( ftr010C . Value . Minute & 0xFF ) ;
2017-12-21 23:00:30 +00:00
string sminute = Encoding . ASCII . GetString ( temp ) ;
2018-06-22 08:08:38 +01:00
temp = new byte [ 2 ] ;
2017-12-19 20:33:03 +00:00
temp [ 0 ] = ( byte ) ( ( ftr010C . Value . Second & 0xFF00 ) > > 8 ) ;
temp [ 1 ] = ( byte ) ( ftr010C . Value . Second & 0xFF ) ;
2017-12-21 23:00:30 +00:00
string ssecond = Encoding . ASCII . GetString ( temp ) ;
2017-12-19 20:33:03 +00:00
try
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . FirmwareDate =
new DateTime ( int . Parse ( syear ) , int . Parse ( smonth ) , int . Parse ( sday ) ,
int . Parse ( shour ) , int . Parse ( sminute ) , int . Parse ( ssecond ) ,
DateTimeKind . Utc ) ;
2017-05-28 21:01:17 +01:00
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . FirmwareDateSpecified = true ;
}
2018-06-22 08:08:38 +01:00
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
2017-12-23 17:41:23 +00:00
catch
{
// ignored
}
2018-06-22 08:08:38 +01:00
#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x010D :
2017-12-19 20:33:03 +00:00
{
report . SCSI . MultiMediaDevice . Features . SupportsAACS = true ;
2017-12-23 17:41:23 +00:00
Feature_010D ? ftr010D = Features . Decode_010D ( desc . Data ) ;
2017-12-19 20:33:03 +00:00
if ( ftr010D . HasValue )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanReadDriveAACSCertificate =
ftr010D . Value . RDC ;
report . SCSI . MultiMediaDevice . Features . CanReadCPRM_MKB = ftr010D . Value . RMC ;
report . SCSI . MultiMediaDevice . Features . CanWriteBusEncryptedBlocks =
ftr010D . Value . WBE ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . SupportsBusEncryption = ftr010D . Value . BEC ;
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanGenerateBindingNonce = ftr010D . Value . BNG ;
if ( ftr010D . Value . BindNonceBlocks > 0 )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . BindingNonceBlocksSpecified = true ;
report . SCSI . MultiMediaDevice . Features . BindingNonceBlocks =
ftr010D . Value . BindNonceBlocks ;
}
2017-05-28 21:01:17 +01:00
2017-12-19 20:33:03 +00:00
if ( ftr010D . Value . AGIDs > 0 )
{
report . SCSI . MultiMediaDevice . Features . AGIDsSpecified = true ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . AGIDs = ftr010D . Value . AGIDs ;
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
2017-12-19 20:33:03 +00:00
if ( ftr010D . Value . AACSVersion > 0 )
{
report . SCSI . MultiMediaDevice . Features . AACSVersionSpecified = true ;
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . AACSVersion =
ftr010D . Value . AACSVersion ;
2017-05-28 21:01:17 +01:00
}
}
2017-12-19 20:33:03 +00:00
}
2017-05-28 21:01:17 +01:00
break ;
case 0x010E :
report . SCSI . MultiMediaDevice . Features . CanWriteCSSManagedDVD = true ;
break ;
case 0x0113 :
report . SCSI . MultiMediaDevice . Features . SupportsSecurDisc = true ;
break ;
case 0x0142 :
report . SCSI . MultiMediaDevice . Features . SupportsOSSC = true ;
break ;
case 0x0110 :
report . SCSI . MultiMediaDevice . Features . SupportsVCPS = true ;
break ;
}
}
2018-06-22 08:08:38 +01:00
if ( report . SCSI . MultiMediaDevice . Features . CanReadBD | |
report . SCSI . MultiMediaDevice . Features . CanReadBDR | |
report . SCSI . MultiMediaDevice . Features . CanReadBDRE1 | |
report . SCSI . MultiMediaDevice . Features . CanReadBDRE2 | |
report . SCSI . MultiMediaDevice . Features . CanReadBDROM | |
report . SCSI . MultiMediaDevice . Features . CanReadOldBDR | |
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanReadOldBDRE | |
report . SCSI . MultiMediaDevice . Features . CanReadOldBDROM )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
if ( ! mediaTypes . Contains ( "BD-ROM" ) ) mediaTypes . Add ( "BD-ROM" ) ;
if ( ! mediaTypes . Contains ( "BD-R" ) ) mediaTypes . Add ( "BD-R" ) ;
if ( ! mediaTypes . Contains ( "BD-RE" ) ) mediaTypes . Add ( "BD-RE" ) ;
if ( ! mediaTypes . Contains ( "BD-R LTH" ) ) mediaTypes . Add ( "BD-R LTH" ) ;
if ( ! mediaTypes . Contains ( "BD-R XL" ) ) mediaTypes . Add ( "BD-R XL" ) ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
if ( report . SCSI . MultiMediaDevice . Features . CanReadCD | | report . SCSI . MultiMediaDevice . Features . MultiRead )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
if ( ! mediaTypes . Contains ( "CD-ROM" ) ) mediaTypes . Add ( "CD-ROM" ) ;
if ( ! mediaTypes . Contains ( "Audio CD" ) ) mediaTypes . Add ( "Audio CD" ) ;
if ( ! mediaTypes . Contains ( "CD-R" ) ) mediaTypes . Add ( "CD-R" ) ;
if ( ! mediaTypes . Contains ( "CD-RW" ) ) mediaTypes . Add ( "CD-RW" ) ;
2017-05-28 21:01:17 +01:00
}
2017-12-23 17:41:23 +00:00
if ( report . SCSI . MultiMediaDevice . Features . CanReadCDMRW )
2018-06-22 08:08:38 +01:00
if ( ! mediaTypes . Contains ( "CD-MRW" ) )
mediaTypes . Add ( "CD-MRW" ) ;
2017-05-28 21:01:17 +01:00
if ( report . SCSI . MultiMediaDevice . Features . CanReadDDCD )
{
2017-12-19 20:33:03 +00:00
if ( ! mediaTypes . Contains ( "DDCD-ROM" ) ) mediaTypes . Add ( "DDCD-ROM" ) ;
if ( ! mediaTypes . Contains ( "DDCD-R" ) ) mediaTypes . Add ( "DDCD-R" ) ;
if ( ! mediaTypes . Contains ( "DDCD-RW" ) ) mediaTypes . Add ( "DDCD-RW" ) ;
2017-05-28 21:01:17 +01:00
}
2018-06-22 08:08:38 +01:00
if ( report . SCSI . MultiMediaDevice . Features . CanReadDVD | |
report . SCSI . MultiMediaDevice . Features . DVDMultiRead | |
report . SCSI . MultiMediaDevice . Features . CanReadDVDPlusR | |
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanReadDVDPlusRDL | |
2018-06-22 08:08:38 +01:00
report . SCSI . MultiMediaDevice . Features . CanReadDVDPlusRW | |
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanReadDVDPlusRWDL )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
if ( ! mediaTypes . Contains ( "DVD-ROM" ) ) mediaTypes . Add ( "DVD-ROM" ) ;
if ( ! mediaTypes . Contains ( "DVD-R" ) ) mediaTypes . Add ( "DVD-R" ) ;
if ( ! mediaTypes . Contains ( "DVD-RW" ) ) mediaTypes . Add ( "DVD-RW" ) ;
if ( ! mediaTypes . Contains ( "DVD+R" ) ) mediaTypes . Add ( "DVD+R" ) ;
if ( ! mediaTypes . Contains ( "DVD+RW" ) ) mediaTypes . Add ( "DVD+RW" ) ;
if ( ! mediaTypes . Contains ( "DVD-R DL" ) ) mediaTypes . Add ( "DVD-R DL" ) ;
if ( ! mediaTypes . Contains ( "DVD+R DL" ) ) mediaTypes . Add ( "DVD+R DL" ) ;
2017-05-28 21:01:17 +01:00
}
2017-12-23 17:41:23 +00:00
if ( report . SCSI . MultiMediaDevice . Features . CanReadDVDPlusMRW )
2018-06-22 08:08:38 +01:00
if ( ! mediaTypes . Contains ( "DVD+MRW" ) )
mediaTypes . Add ( "DVD+MRW" ) ;
2017-05-28 21:01:17 +01:00
if ( report . SCSI . MultiMediaDevice . Features . CanReadHDDVD | |
2017-12-19 20:33:03 +00:00
report . SCSI . MultiMediaDevice . Features . CanReadHDDVDR )
2017-05-28 21:01:17 +01:00
{
2017-12-19 20:33:03 +00:00
if ( ! mediaTypes . Contains ( "HD DVD-ROM" ) ) mediaTypes . Add ( "HD DVD-ROM" ) ;
if ( ! mediaTypes . Contains ( "HD DVD-R" ) ) mediaTypes . Add ( "HD DVD-R" ) ;
if ( ! mediaTypes . Contains ( "HD DVD-RW" ) ) mediaTypes . Add ( "HD DVD-RW" ) ;
2017-05-28 21:01:17 +01:00
}
2017-12-23 17:41:23 +00:00
if ( report . SCSI . MultiMediaDevice . Features . CanReadHDDVDRAM )
2018-06-22 08:08:38 +01:00
if ( ! mediaTypes . Contains ( "HD DVD-RAM" ) )
mediaTypes . Add ( "HD DVD-RAM" ) ;
2017-05-28 21:01:17 +01:00
}
2017-12-20 17:15:26 +00:00
bool tryPlextor = false , tryHldtst = false , tryPioneer = false , tryNec = false ;
2017-05-28 21:01:17 +01:00
tryPlextor | = dev . Manufacturer . ToLowerInvariant ( ) = = "plextor" ;
2018-06-22 08:08:38 +01:00
tryHldtst | = dev . Manufacturer . ToLowerInvariant ( ) = = "hl-dt-st" ;
2017-05-28 21:01:17 +01:00
tryPioneer | = dev . Manufacturer . ToLowerInvariant ( ) = = "pioneer" ;
2018-06-22 08:08:38 +01:00
tryNec | = dev . Manufacturer . ToLowerInvariant ( ) = = "nec" ;
2017-05-28 21:01:17 +01:00
// Very old CD drives do not contain mode page 2Ah neither GET CONFIGURATION, so just try all CDs on them
// Also don't get confident, some drives didn't know CD-RW but are able to read them
if ( mediaTypes . Count = = 0 | | mediaTypes . Contains ( "CD-ROM" ) )
{
2017-12-19 20:33:03 +00:00
if ( ! mediaTypes . Contains ( "CD-ROM" ) ) mediaTypes . Add ( "CD-ROM" ) ;
if ( ! mediaTypes . Contains ( "Audio CD" ) ) mediaTypes . Add ( "Audio CD" ) ;
if ( ! mediaTypes . Contains ( "CD-R" ) ) mediaTypes . Add ( "CD-R" ) ;
if ( ! mediaTypes . Contains ( "CD-RW" ) ) mediaTypes . Add ( "CD-RW" ) ;
2017-05-28 21:01:17 +01:00
}
mediaTypes . Sort ( ) ;
List < testedMediaType > mediaTests = new List < testedMediaType > ( ) ;
foreach ( string mediaType in mediaTypes )
{
2017-12-21 23:00:30 +00:00
ConsoleKeyInfo pressedKey = new ConsoleKeyInfo ( ) ;
2017-05-28 21:01:17 +01:00
while ( pressedKey . Key ! = ConsoleKey . Y & & pressedKey . Key ! = ConsoleKey . N )
{
DicConsole . Write ( "Do you have a {0} disc that you can insert in the drive? (Y/N): " , mediaType ) ;
pressedKey = System . Console . ReadKey ( ) ;
DicConsole . WriteLine ( ) ;
}
if ( pressedKey . Key = = ConsoleKey . Y )
{
2017-12-21 23:00:30 +00:00
dev . AllowMediumRemoval ( out senseBuffer , TIMEOUT , out _ ) ;
dev . EjectTray ( out senseBuffer , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Please insert it in the drive and press any key when it is ready." ) ;
System . Console . ReadKey ( true ) ;
2017-12-21 23:00:30 +00:00
testedMediaType mediaTest =
new testedMediaType { MediumTypeName = mediaType , MediaIsRecognized = true } ;
2017-05-28 21:01:17 +01:00
2017-12-21 23:00:30 +00:00
sense = dev . ScsiTestUnitReady ( out senseBuffer , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( sense )
{
2017-12-21 14:30:38 +00:00
FixedSense ? decSense = Sense . DecodeFixed ( senseBuffer ) ;
2017-05-28 21:01:17 +01:00
if ( decSense . HasValue )
if ( decSense . Value . ASC = = 0x3A )
{
int leftRetries = 20 ;
while ( leftRetries > 0 )
{
DicConsole . Write ( "\rWaiting for drive to become ready" ) ;
2017-12-21 14:30:38 +00:00
Thread . Sleep ( 2000 ) ;
2017-12-21 23:00:30 +00:00
sense = dev . ScsiTestUnitReady ( out senseBuffer , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
if ( ! sense ) break ;
2017-05-28 21:01:17 +01:00
leftRetries - - ;
}
mediaTest . MediaIsRecognized & = ! sense ;
}
else if ( decSense . Value . ASC = = 0x04 & & decSense . Value . ASCQ = = 0x01 )
{
int leftRetries = 20 ;
while ( leftRetries > 0 )
2017-09-11 18:34:01 +01:00
{
DicConsole . Write ( "\rWaiting for drive to become ready" ) ;
2017-12-21 14:30:38 +00:00
Thread . Sleep ( 2000 ) ;
2017-12-21 23:00:30 +00:00
sense = dev . ScsiTestUnitReady ( out senseBuffer , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
if ( ! sense ) break ;
2017-09-11 18:34:01 +01:00
leftRetries - - ;
}
mediaTest . MediaIsRecognized & = ! sense ;
}
// These should be trapped by the OS but seems in some cases they're not
else if ( decSense . Value . ASC = = 0x28 )
{
int leftRetries = 20 ;
while ( leftRetries > 0 )
2017-05-28 21:01:17 +01:00
{
DicConsole . Write ( "\rWaiting for drive to become ready" ) ;
2017-12-21 14:30:38 +00:00
Thread . Sleep ( 2000 ) ;
2017-12-21 23:00:30 +00:00
sense = dev . ScsiTestUnitReady ( out senseBuffer , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
if ( ! sense ) break ;
2017-05-28 21:01:17 +01:00
leftRetries - - ;
}
mediaTest . MediaIsRecognized & = ! sense ;
}
2017-12-19 20:33:03 +00:00
else mediaTest . MediaIsRecognized = false ;
else mediaTest . MediaIsRecognized = false ;
2017-05-28 21:01:17 +01:00
}
if ( mediaTest . MediaIsRecognized )
{
2018-06-22 08:08:38 +01:00
mediaTest . SupportsReadCapacitySpecified = true ;
2017-05-28 21:01:17 +01:00
mediaTest . SupportsReadCapacity16Specified = true ;
DicConsole . WriteLine ( "Querying SCSI READ CAPACITY..." ) ;
2017-12-21 23:00:30 +00:00
sense = dev . ReadCapacity ( out buffer , out senseBuffer , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! sense & & ! dev . Error )
{
mediaTest . SupportsReadCapacity = true ;
2017-12-19 20:33:03 +00:00
mediaTest . Blocks =
2017-12-20 17:26:28 +00:00
( ulong ) ( ( buffer [ 0 ] < < 24 ) + ( buffer [ 1 ] < < 16 ) + ( buffer [ 2 ] < < 8 ) + buffer [ 3 ] ) + 1 ;
2017-12-19 20:33:03 +00:00
mediaTest . BlockSize =
2017-12-20 17:26:28 +00:00
( uint ) ( ( buffer [ 5 ] < < 24 ) + ( buffer [ 5 ] < < 16 ) + ( buffer [ 6 ] < < 8 ) + buffer [ 7 ] ) ;
2018-06-22 08:08:38 +01:00
mediaTest . BlocksSpecified = true ;
2017-05-28 21:01:17 +01:00
mediaTest . BlockSizeSpecified = true ;
}
DicConsole . WriteLine ( "Querying SCSI READ CAPACITY (16)..." ) ;
2017-12-21 23:00:30 +00:00
sense = dev . ReadCapacity16 ( out buffer , out buffer , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! sense & & ! dev . Error )
{
mediaTest . SupportsReadCapacity16 = true ;
byte [ ] temp = new byte [ 8 ] ;
Array . Copy ( buffer , 0 , temp , 0 , 8 ) ;
Array . Reverse ( temp ) ;
mediaTest . Blocks = BitConverter . ToUInt64 ( temp , 0 ) + 1 ;
2017-12-19 20:33:03 +00:00
mediaTest . BlockSize =
2017-12-20 17:26:28 +00:00
( uint ) ( ( buffer [ 5 ] < < 24 ) + ( buffer [ 5 ] < < 16 ) + ( buffer [ 6 ] < < 8 ) + buffer [ 7 ] ) ;
2018-06-22 08:08:38 +01:00
mediaTest . BlocksSpecified = true ;
2017-05-28 21:01:17 +01:00
mediaTest . BlockSizeSpecified = true ;
}
2017-12-21 23:00:30 +00:00
Modes . DecodedMode ? decMode = null ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying SCSI MODE SENSE (10)..." ) ;
2017-12-19 20:33:03 +00:00
sense = dev . ModeSense10 ( out buffer , out senseBuffer , false , true ,
2017-12-21 23:00:30 +00:00
ScsiModeSensePageControl . Current , 0x3F , 0x00 , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! sense & & ! dev . Error )
{
report . SCSI . SupportsModeSense10 = true ;
2018-06-22 08:08:38 +01:00
decMode = Modes . DecodeMode10 ( buffer , dev . ScsiType ) ;
2017-12-19 20:33:03 +00:00
if ( debug ) mediaTest . ModeSense10Data = buffer ;
2017-05-28 21:01:17 +01:00
}
2018-06-22 08:08:38 +01:00
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying SCSI MODE SENSE..." ) ;
2017-12-21 23:00:30 +00:00
sense = dev . ModeSense ( out buffer , out senseBuffer , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! sense & & ! dev . Error )
{
report . SCSI . SupportsModeSense6 = true ;
2018-06-22 08:08:38 +01:00
if ( ! decMode . HasValue ) decMode = Modes . DecodeMode6 ( buffer , dev . ScsiType ) ;
2017-12-19 20:33:03 +00:00
if ( debug ) mediaTest . ModeSense6Data = buffer ;
2017-05-28 21:01:17 +01:00
}
if ( decMode . HasValue )
{
2018-06-22 08:08:38 +01:00
mediaTest . MediumType = ( byte ) decMode . Value . Header . MediumType ;
2017-05-28 21:01:17 +01:00
mediaTest . MediumTypeSpecified = true ;
2018-06-22 08:08:38 +01:00
if ( decMode . Value . Header . BlockDescriptors ! = null & &
2017-12-19 20:33:03 +00:00
decMode . Value . Header . BlockDescriptors . Length > 0 )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
mediaTest . Density = ( byte ) decMode . Value . Header . BlockDescriptors [ 0 ] . Density ;
2017-05-28 21:01:17 +01:00
mediaTest . DensitySpecified = true ;
}
}
2018-06-22 08:08:38 +01:00
if ( mediaType . StartsWith ( "CD-" , StringComparison . Ordinal ) | |
2017-12-19 20:33:03 +00:00
mediaType . StartsWith ( "DDCD-" , StringComparison . Ordinal ) | | mediaType = = "Audio CD" )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
mediaTest . CanReadTOCSpecified = true ;
2017-05-28 21:01:17 +01:00
mediaTest . CanReadFullTOCSpecified = true ;
DicConsole . WriteLine ( "Querying CD TOC..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadTOC =
2017-12-21 23:00:30 +00:00
! dev . ReadTocPmaAtip ( out buffer , out senseBuffer , false , 0 , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadTOC ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readtoc" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-06-03 19:26:48 +01:00
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying CD Full TOC..." ) ;
2017-12-23 17:41:23 +00:00
mediaTest . CanReadFullTOC = ! dev . ReadRawToc ( out buffer , out senseBuffer , 1 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadFullTOC ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readfulltoc" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
2018-06-22 08:08:38 +01:00
if ( mediaType . StartsWith ( "CD-R" , StringComparison . Ordinal ) | |
2017-12-19 20:33:03 +00:00
mediaType . StartsWith ( "DDCD-R" , StringComparison . Ordinal ) )
2017-05-28 21:01:17 +01:00
{
mediaTest . CanReadATIPSpecified = true ;
2018-06-22 08:08:38 +01:00
mediaTest . CanReadPMASpecified = true ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying CD ATIP..." ) ;
2017-12-21 23:00:30 +00:00
mediaTest . CanReadATIP = ! dev . ReadAtip ( out buffer , out senseBuffer , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadATIP ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "atip" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying CD PMA..." ) ;
2017-12-21 23:00:30 +00:00
mediaTest . CanReadPMA = ! dev . ReadPma ( out buffer , out senseBuffer , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadPMA ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "pma" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
2018-06-22 08:08:38 +01:00
if ( mediaType . StartsWith ( "DVD-" , StringComparison . Ordinal ) | |
2017-12-19 20:33:03 +00:00
mediaType . StartsWith ( "HD DVD-" , StringComparison . Ordinal ) )
2017-05-28 21:01:17 +01:00
{
mediaTest . CanReadPFISpecified = true ;
mediaTest . CanReadDMISpecified = true ;
DicConsole . WriteLine ( "Querying DVD PFI..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPFI =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd , 0 , 0 ,
2017-12-23 17:41:23 +00:00
MmcDiscStructureFormat . PhysicalInformation , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadPFI ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "pfi" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying DVD DMI..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadDMI =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd , 0 , 0 ,
2017-12-21 23:00:30 +00:00
MmcDiscStructureFormat . DiscManufacturingInformation , 0 , TIMEOUT ,
out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadDMI ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "dmi" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
if ( mediaType = = "DVD-ROM" )
{
mediaTest . CanReadCMISpecified = true ;
DicConsole . WriteLine ( "Querying DVD CMI..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadCMI =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd , 0 , 0 ,
2017-12-23 17:41:23 +00:00
MmcDiscStructureFormat . CopyrightInformation , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadCMI ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "cmi" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
2017-12-23 17:41:23 +00:00
switch ( mediaType )
{
2017-12-21 04:43:29 +00:00
case "DVD-ROM" :
case "HD DVD-ROM" :
mediaTest . CanReadBCASpecified = true ;
DicConsole . WriteLine ( "Querying DVD BCA..." ) ;
mediaTest . CanReadBCA =
2017-12-23 17:41:23 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd ,
0 , 0 , MmcDiscStructureFormat . BurstCuttingArea , 0 , TIMEOUT ,
2017-12-21 23:00:30 +00:00
out _ ) ;
2017-12-21 04:43:29 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadBCA ) ;
if ( debug )
DataFile . WriteTo ( "SCSI Report" , "bca" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
mediaTest . CanReadAACSSpecified = true ;
DicConsole . WriteLine ( "Querying DVD AACS..." ) ;
mediaTest . CanReadAACS =
2017-12-23 17:41:23 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd ,
0 , 0 , MmcDiscStructureFormat . DvdAacs , 0 , TIMEOUT , out _ ) ;
2017-12-21 04:43:29 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadAACS ) ;
if ( debug )
DataFile . WriteTo ( "SCSI Report" , "aacs" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
break ;
case "BD-ROM" :
mediaTest . CanReadBCASpecified = true ;
DicConsole . WriteLine ( "Querying BD BCA..." ) ;
mediaTest . CanReadBCA =
2017-12-23 17:41:23 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Bd , 0 ,
0 , MmcDiscStructureFormat . BdBurstCuttingArea , 0 , TIMEOUT ,
2017-12-21 23:00:30 +00:00
out _ ) ;
2017-12-21 04:43:29 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadBCA ) ;
if ( debug )
DataFile . WriteTo ( "SCSI Report" , "bdbca" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
break ;
case "DVD-RAM" :
case "HD DVD-RAM" :
2018-06-22 08:08:38 +01:00
mediaTest . CanReadDDSSpecified = true ;
2017-12-21 04:43:29 +00:00
mediaTest . CanReadSpareAreaInformationSpecified = true ;
mediaTest . CanReadDDS =
2017-12-23 17:41:23 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd ,
0 , 0 , MmcDiscStructureFormat . DvdramDds , 0 , TIMEOUT , out _ ) ;
2017-12-21 04:43:29 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadDDS ) ;
if ( debug )
DataFile . WriteTo ( "SCSI Report" , "dds" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
mediaTest . CanReadSpareAreaInformation =
2017-12-23 17:41:23 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd ,
0 , 0 , MmcDiscStructureFormat . DvdramSpareAreaInformation , 0 ,
TIMEOUT , out _ ) ;
2017-12-21 04:43:29 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadSpareAreaInformation ) ;
if ( debug )
DataFile . WriteTo ( "SCSI Report" , "sai" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
break ;
2017-05-28 21:01:17 +01:00
}
if ( mediaType . StartsWith ( "BD-R" , StringComparison . Ordinal ) & & mediaType ! = "BD-ROM" )
{
2018-06-22 08:08:38 +01:00
mediaTest . CanReadDDSSpecified = true ;
2017-05-28 21:01:17 +01:00
mediaTest . CanReadSpareAreaInformationSpecified = true ;
DicConsole . WriteLine ( "Querying BD DDS..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadDDS =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Bd , 0 , 0 ,
2017-12-21 23:00:30 +00:00
MmcDiscStructureFormat . BdDds , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadDDS ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "bddds" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying BD SAI..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadSpareAreaInformation =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Bd , 0 , 0 ,
2017-12-21 23:00:30 +00:00
MmcDiscStructureFormat . BdSpareAreaInformation , 0 , TIMEOUT ,
out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadSpareAreaInformation ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "bdsai" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
if ( mediaType = = "DVD-R" | | mediaType = = "DVD-RW" )
{
mediaTest . CanReadPRISpecified = true ;
DicConsole . WriteLine ( "Querying DVD PRI..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPRI =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd , 0 , 0 ,
2017-12-23 17:41:23 +00:00
MmcDiscStructureFormat . PreRecordedInfo , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadPRI ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "pri" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
if ( mediaType = = "DVD-R" | | mediaType = = "DVD-RW" | | mediaType = = "HD DVD-R" )
{
2018-06-22 08:08:38 +01:00
mediaTest . CanReadMediaIDSpecified = true ;
2017-05-28 21:01:17 +01:00
mediaTest . CanReadRecordablePFISpecified = true ;
DicConsole . WriteLine ( "Querying DVD Media ID..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadMediaID =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd , 0 , 0 ,
2017-12-23 17:41:23 +00:00
MmcDiscStructureFormat . DvdrMediaIdentifier , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadMediaID ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "mediaid" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying DVD Embossed PFI..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadRecordablePFI =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd , 0 , 0 ,
2017-12-21 23:00:30 +00:00
MmcDiscStructureFormat . DvdrPhysicalInformation , 0 , TIMEOUT ,
out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadRecordablePFI ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "epfi" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
2017-12-18 17:53:04 +00:00
if ( mediaType . StartsWith ( "DVD+R" , StringComparison . Ordinal ) | | mediaType = = "DVD+MRW" )
2017-05-28 21:01:17 +01:00
{
mediaTest . CanReadADIPSpecified = true ;
2018-06-22 08:08:38 +01:00
mediaTest . CanReadDCBSpecified = true ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying DVD ADIP..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadADIP =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd , 0 , 0 ,
2017-12-21 23:00:30 +00:00
MmcDiscStructureFormat . Adip , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadADIP ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "adip" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying DVD DCB..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadDCB =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd , 0 , 0 ,
2017-12-21 23:00:30 +00:00
MmcDiscStructureFormat . Dcb , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadDCB ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "dcb" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
if ( mediaType = = "HD DVD-ROM" )
{
mediaTest . CanReadHDCMISpecified = true ;
DicConsole . WriteLine ( "Querying HD DVD CMI..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadHDCMI =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd , 0 , 0 ,
2017-12-21 23:00:30 +00:00
MmcDiscStructureFormat . HddvdCopyrightInformation , 0 , TIMEOUT ,
out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadHDCMI ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "hdcmi" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
if ( mediaType . EndsWith ( " DL" , StringComparison . Ordinal ) )
{
mediaTest . CanReadLayerCapacitySpecified = true ;
DicConsole . WriteLine ( "Querying DVD Layer Capacity..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadLayerCapacity =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Dvd , 0 , 0 ,
2017-12-23 17:41:23 +00:00
MmcDiscStructureFormat . DvdrLayerCapacity , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadLayerCapacity ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "layer" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
if ( mediaType . StartsWith ( "BD-R" , StringComparison . Ordinal ) )
{
mediaTest . CanReadDiscInformationSpecified = true ;
2018-06-22 08:08:38 +01:00
mediaTest . CanReadPACSpecified = true ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying BD Disc Information..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadDiscInformation =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Bd , 0 , 0 ,
2017-12-23 17:41:23 +00:00
MmcDiscStructureFormat . DiscInformation , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadDiscInformation ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "di" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Querying BD PAC..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPAC =
2017-12-20 17:15:26 +00:00
! dev . ReadDiscStructure ( out buffer , out senseBuffer , MmcDiscStructureMediaType . Bd , 0 , 0 ,
2017-12-21 23:00:30 +00:00
MmcDiscStructureFormat . Pac , 0 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadPAC ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "pac" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
2018-06-22 08:08:38 +01:00
mediaTest . SupportsReadSpecified = true ;
2017-05-28 21:01:17 +01:00
mediaTest . SupportsRead10Specified = true ;
mediaTest . SupportsRead12Specified = true ;
mediaTest . SupportsRead16Specified = true ;
DicConsole . WriteLine ( "Trying SCSI READ (6)..." ) ;
2017-12-23 17:41:23 +00:00
mediaTest . SupportsRead = ! dev . Read6 ( out buffer , out senseBuffer , 0 , 2048 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . SupportsRead ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "read6" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" + mediaType +
".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying SCSI READ (10)..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsRead10 = ! dev . Read10 ( out buffer , out senseBuffer , 0 , false , true , false ,
2017-12-21 23:00:30 +00:00
false , 0 , 2048 , 0 , 1 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . SupportsRead10 ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "read10" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" + mediaType +
".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying SCSI READ (12)..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsRead12 = ! dev . Read12 ( out buffer , out senseBuffer , 0 , false , true , false ,
2017-12-21 23:00:30 +00:00
false , 0 , 2048 , 0 , 1 , false , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . SupportsRead12 ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "read12" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" + mediaType +
".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying SCSI READ (16)..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsRead16 = ! dev . Read16 ( out buffer , out senseBuffer , 0 , false , true , false , 0 ,
2017-12-21 23:00:30 +00:00
2048 , 0 , 1 , false , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . SupportsRead16 ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "read16" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" + mediaType +
".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
if ( debug )
if ( ! tryPlextor )
{
pressedKey = new ConsoleKeyInfo ( ) ;
while ( pressedKey . Key ! = ConsoleKey . Y & & pressedKey . Key ! = ConsoleKey . N )
{
2017-12-19 20:33:03 +00:00
DicConsole
2018-06-22 08:08:38 +01:00
. Write ( "Do you have want to try Plextor vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): " ) ;
2017-05-28 21:01:17 +01:00
pressedKey = System . Console . ReadKey ( ) ;
DicConsole . WriteLine ( ) ;
}
tryPlextor | = pressedKey . Key = = ConsoleKey . Y ;
}
2018-06-22 08:08:38 +01:00
if ( mediaType . StartsWith ( "CD-" , StringComparison . Ordinal ) | |
2017-12-19 20:33:03 +00:00
mediaType . StartsWith ( "DDCD-" , StringComparison . Ordinal ) | | mediaType = = "Audio CD" )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
mediaTest . CanReadC2PointersSpecified = true ;
mediaTest . CanReadCorrectedSubchannelSpecified = true ;
2017-05-28 21:01:17 +01:00
mediaTest . CanReadCorrectedSubchannelWithC2Specified = true ;
2018-06-22 08:08:38 +01:00
mediaTest . CanReadLeadInSpecified = true ;
mediaTest . CanReadLeadOutSpecified = true ;
mediaTest . CanReadPQSubchannelSpecified = true ;
mediaTest . CanReadPQSubchannelWithC2Specified = true ;
mediaTest . CanReadRWSubchannelSpecified = true ;
mediaTest . CanReadRWSubchannelWithC2Specified = true ;
mediaTest . SupportsReadCdMsfSpecified = true ;
mediaTest . SupportsReadCdSpecified = true ;
mediaTest . SupportsReadCdMsfRawSpecified = true ;
mediaTest . SupportsReadCdRawSpecified = true ;
2017-05-28 21:01:17 +01:00
if ( mediaType = = "Audio CD" )
{
DicConsole . WriteLine ( "Trying SCSI READ CD..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsReadCd = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2352 , 1 ,
2017-12-20 17:15:26 +00:00
MmcSectorTypes . Cdda , false , false , false ,
2017-12-19 20:33:03 +00:00
MmcHeaderCodes . None , true , false ,
2017-12-21 23:00:30 +00:00
MmcErrorField . None , MmcSubchannel . None , TIMEOUT ,
out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . SupportsReadCd ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcd" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying SCSI READ CD MSF..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsReadCdMsf = ! dev . ReadCdMsf ( out buffer , out senseBuffer , 0x00000200 ,
2017-12-20 17:15:26 +00:00
0x00000201 , 2352 , MmcSectorTypes . Cdda ,
2017-12-19 20:33:03 +00:00
false , false , MmcHeaderCodes . None , true ,
false , MmcErrorField . None ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . None , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . SupportsReadCdMsf ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdmsf" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
else
{
DicConsole . WriteLine ( "Trying SCSI READ CD..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsReadCd = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2048 , 1 ,
MmcSectorTypes . AllTypes , false , false , false ,
MmcHeaderCodes . None , true , false ,
2017-12-21 23:00:30 +00:00
MmcErrorField . None , MmcSubchannel . None , TIMEOUT ,
out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . SupportsReadCd ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcd" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying SCSI READ CD MSF..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsReadCdMsf = ! dev . ReadCdMsf ( out buffer , out senseBuffer , 0x00000200 ,
0x00000201 , 2048 , MmcSectorTypes . AllTypes ,
false , false , MmcHeaderCodes . None , true ,
false , MmcErrorField . None ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . None , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . SupportsReadCdMsf ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdmsf" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying SCSI READ CD full sector..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsReadCdRaw = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2352 , 1 ,
MmcSectorTypes . AllTypes , false , false , true ,
MmcHeaderCodes . AllHeaders , true , true ,
MmcErrorField . None , MmcSubchannel . None ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . SupportsReadCdRaw ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdraw" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying SCSI READ CD MSF full sector..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsReadCdMsfRaw = ! dev . ReadCdMsf ( out buffer , out senseBuffer , 0x00000200 ,
0x00000201 , 2352 ,
MmcSectorTypes . AllTypes , false , false ,
MmcHeaderCodes . AllHeaders , true , true ,
MmcErrorField . None , MmcSubchannel . None ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . SupportsReadCdMsfRaw ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdmsfraw" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
if ( mediaTest . SupportsReadCdRaw | | mediaType = = "Audio CD" )
{
DicConsole . WriteLine ( "Trying to read CD Lead-In..." ) ;
for ( int i = - 150 ; i < 0 ; i + + )
{
if ( mediaType = = "Audio CD" )
2017-12-19 20:33:03 +00:00
sense = dev . ReadCd ( out buffer , out senseBuffer , ( uint ) i , 2352 , 1 ,
2017-12-20 17:15:26 +00:00
MmcSectorTypes . Cdda , false , false , false ,
2017-12-19 20:33:03 +00:00
MmcHeaderCodes . None , true , false , MmcErrorField . None ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . None , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
else
2017-12-19 20:33:03 +00:00
sense = dev . ReadCd ( out buffer , out senseBuffer , ( uint ) i , 2352 , 1 ,
MmcSectorTypes . AllTypes , false , false , true ,
MmcHeaderCodes . AllHeaders , true , true , MmcErrorField . None ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . None , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , sense ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "leadin" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-12-21 06:06:19 +00:00
if ( sense ) continue ;
mediaTest . CanReadLeadIn = true ;
break ;
2017-05-28 21:01:17 +01:00
}
DicConsole . WriteLine ( "Trying to read CD Lead-Out..." ) ;
if ( mediaType = = "Audio CD" )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadLeadOut = ! dev . ReadCd ( out buffer , out senseBuffer ,
( uint ) ( mediaTest . Blocks + 1 ) , 2352 , 1 ,
2017-12-20 17:15:26 +00:00
MmcSectorTypes . Cdda , false , false , false ,
2017-12-19 20:33:03 +00:00
MmcHeaderCodes . None , true , false ,
MmcErrorField . None , MmcSubchannel . None ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
else
2017-12-19 20:33:03 +00:00
mediaTest . CanReadLeadOut = ! dev . ReadCd ( out buffer , out senseBuffer ,
( uint ) ( mediaTest . Blocks + 1 ) , 2352 , 1 ,
MmcSectorTypes . AllTypes , false , false , true ,
MmcHeaderCodes . AllHeaders , true , true ,
MmcErrorField . None , MmcSubchannel . None ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadLeadOut ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "leadout" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
2017-12-18 17:53:04 +00:00
if ( mediaType = = "Audio CD" )
2017-05-28 21:01:17 +01:00
{
DicConsole . WriteLine ( "Trying to read C2 Pointers..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadC2Pointers = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2646 , 1 ,
2017-12-20 17:15:26 +00:00
MmcSectorTypes . Cdda , false , false , false ,
2017-12-19 20:33:03 +00:00
MmcHeaderCodes . None , true , false ,
MmcErrorField . C2Pointers , MmcSubchannel . None ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadC2Pointers )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadC2Pointers = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2648 , 1 ,
2017-12-20 17:15:26 +00:00
MmcSectorTypes . Cdda , false , false , false ,
2017-12-19 20:33:03 +00:00
MmcHeaderCodes . None , true , false ,
MmcErrorField . C2PointersAndBlock ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . None , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadC2Pointers ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying to read subchannels..." ) ;
2017-12-23 17:41:23 +00:00
mediaTest . CanReadPQSubchannel =
! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2368 , 1 , MmcSectorTypes . Cdda , false ,
false , false , MmcHeaderCodes . None , true , false , MmcErrorField . None ,
MmcSubchannel . Q16 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadPQSubchannel ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdpq" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-12-23 17:41:23 +00:00
mediaTest . CanReadRWSubchannel =
! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2448 , 1 , MmcSectorTypes . Cdda , false ,
false , false , MmcHeaderCodes . None , true , false , MmcErrorField . None ,
MmcSubchannel . Raw , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadRWSubchannel ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdrw" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-12-23 17:41:23 +00:00
mediaTest . CanReadCorrectedSubchannel =
! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2448 , 1 , MmcSectorTypes . Cdda , false ,
false , false , MmcHeaderCodes . None , true , false , MmcErrorField . None ,
MmcSubchannel . Rw , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadCorrectedSubchannel ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdsub" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying to read subchannels with C2 Pointers..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPQSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2662 ,
2017-12-20 17:15:26 +00:00
1 , MmcSectorTypes . Cdda , false , false ,
2017-12-19 20:33:03 +00:00
false , MmcHeaderCodes . None , true ,
false , MmcErrorField . C2Pointers ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . Q16 , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadPQSubchannelWithC2 )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPQSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 ,
2017-12-20 17:15:26 +00:00
2664 , 1 , MmcSectorTypes . Cdda ,
2017-12-19 20:33:03 +00:00
false , false , false ,
MmcHeaderCodes . None , true , false ,
MmcErrorField . C2PointersAndBlock ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . Q16 , TIMEOUT ,
out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadPQSubchannelWithC2 ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdpqc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
mediaTest . CanReadRWSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2712 ,
2017-12-20 17:15:26 +00:00
1 , MmcSectorTypes . Cdda , false , false ,
2017-12-19 20:33:03 +00:00
false , MmcHeaderCodes . None , true ,
false , MmcErrorField . C2Pointers ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . Raw , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadRWSubchannelWithC2 )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadRWSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 ,
2017-12-20 17:15:26 +00:00
2714 , 1 , MmcSectorTypes . Cdda ,
2017-12-19 20:33:03 +00:00
false , false , false ,
MmcHeaderCodes . None , true , false ,
MmcErrorField . C2PointersAndBlock ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . Raw , TIMEOUT ,
out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadRWSubchannelWithC2 ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdrwc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-12-23 17:41:23 +00:00
mediaTest . CanReadCorrectedSubchannelWithC2 =
! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2712 , 1 , MmcSectorTypes . Cdda , false ,
false , false , MmcHeaderCodes . None , true , false ,
MmcErrorField . C2Pointers , MmcSubchannel . Rw , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadCorrectedSubchannelWithC2 )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadCorrectedSubchannelWithC2 =
2017-12-20 17:15:26 +00:00
! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2714 , 1 , MmcSectorTypes . Cdda , false ,
2017-12-19 20:33:03 +00:00
false , false , MmcHeaderCodes . None , true , false ,
2017-12-23 17:41:23 +00:00
MmcErrorField . C2PointersAndBlock , MmcSubchannel . Rw , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadCorrectedSubchannelWithC2 ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdsubc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
else if ( mediaTest . SupportsReadCdRaw )
{
DicConsole . WriteLine ( "Trying to read C2 Pointers..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadC2Pointers = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2646 , 1 ,
MmcSectorTypes . AllTypes , false , false , true ,
MmcHeaderCodes . AllHeaders , true , true ,
MmcErrorField . C2Pointers , MmcSubchannel . None ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadC2Pointers )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadC2Pointers = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2648 , 1 ,
MmcSectorTypes . AllTypes , false , false ,
true , MmcHeaderCodes . AllHeaders , true ,
true , MmcErrorField . C2PointersAndBlock ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . None , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadC2Pointers ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying to read subchannels..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPQSubchannel = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2368 , 1 ,
MmcSectorTypes . AllTypes , false , false , true ,
MmcHeaderCodes . AllHeaders , true , true ,
MmcErrorField . None , MmcSubchannel . Q16 ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadPQSubchannel ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdpq" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
mediaTest . CanReadRWSubchannel = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2448 , 1 ,
MmcSectorTypes . AllTypes , false , false , true ,
MmcHeaderCodes . AllHeaders , true , true ,
MmcErrorField . None , MmcSubchannel . Raw ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadRWSubchannel ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdrw" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
mediaTest . CanReadCorrectedSubchannel = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2448 ,
1 , MmcSectorTypes . AllTypes , false ,
false , true ,
MmcHeaderCodes . AllHeaders , true ,
true , MmcErrorField . None ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . Rw , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadCorrectedSubchannel ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdsub" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying to read subchannels with C2 Pointers..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPQSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2662 ,
1 , MmcSectorTypes . AllTypes , false ,
false , true ,
MmcHeaderCodes . AllHeaders , true , true ,
MmcErrorField . C2Pointers ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . Q16 , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadPQSubchannelWithC2 )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPQSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 ,
2664 , 1 , MmcSectorTypes . AllTypes ,
false , false , true ,
MmcHeaderCodes . AllHeaders , true ,
true ,
MmcErrorField . C2PointersAndBlock ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . Q16 , TIMEOUT ,
out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadPQSubchannelWithC2 ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdpqc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
mediaTest . CanReadRWSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2712 ,
1 , MmcSectorTypes . AllTypes , false ,
false , true ,
MmcHeaderCodes . AllHeaders , true , true ,
MmcErrorField . C2Pointers ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . Raw , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadRWSubchannelWithC2 )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadRWSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 ,
2714 , 1 , MmcSectorTypes . AllTypes ,
false , false , true ,
MmcHeaderCodes . AllHeaders , true ,
true ,
MmcErrorField . C2PointersAndBlock ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . Raw , TIMEOUT ,
out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadRWSubchannelWithC2 ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdrwc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
mediaTest . CanReadCorrectedSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 ,
2712 , 1 ,
MmcSectorTypes . AllTypes , false ,
false , true ,
MmcHeaderCodes . AllHeaders ,
true , true ,
MmcErrorField . C2Pointers ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . Rw , TIMEOUT ,
out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadCorrectedSubchannelWithC2 )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadCorrectedSubchannelWithC2 =
! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2714 , 1 , MmcSectorTypes . AllTypes ,
false , false , true , MmcHeaderCodes . AllHeaders , true , true ,
2017-12-23 17:41:23 +00:00
MmcErrorField . C2PointersAndBlock , MmcSubchannel . Rw , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadCorrectedSubchannelWithC2 ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdsubc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
else
{
DicConsole . WriteLine ( "Trying to read C2 Pointers..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadC2Pointers = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2342 , 1 ,
MmcSectorTypes . AllTypes , false , false , false ,
MmcHeaderCodes . None , true , false ,
MmcErrorField . C2Pointers , MmcSubchannel . None ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadC2Pointers )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadC2Pointers = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2344 , 1 ,
MmcSectorTypes . AllTypes , false , false ,
false , MmcHeaderCodes . None , true , false ,
MmcErrorField . C2PointersAndBlock ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . None , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadC2Pointers ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying to read subchannels..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPQSubchannel = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2064 , 1 ,
MmcSectorTypes . AllTypes , false , false ,
false , MmcHeaderCodes . None , true , false ,
MmcErrorField . None , MmcSubchannel . Q16 ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadPQSubchannel ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdpq" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
mediaTest . CanReadRWSubchannel = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2144 , 1 ,
MmcSectorTypes . AllTypes , false , false ,
false , MmcHeaderCodes . None , true , false ,
MmcErrorField . None , MmcSubchannel . Raw ,
2017-12-21 23:00:30 +00:00
TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . CanReadRWSubchannel ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdrw" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
mediaTest . CanReadCorrectedSubchannel = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2144 ,
1 , MmcSectorTypes . AllTypes , false ,
false , false , MmcHeaderCodes . None ,
true , false , MmcErrorField . None ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . Rw , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadCorrectedSubchannel ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdsub" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying to read subchannels with C2 Pointers..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPQSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2358 ,
1 , MmcSectorTypes . AllTypes , false ,
false , false , MmcHeaderCodes . None ,
true , false , MmcErrorField . C2Pointers ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . Q16 , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadPQSubchannelWithC2 )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadPQSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 ,
2360 , 1 , MmcSectorTypes . AllTypes ,
false , false , false ,
MmcHeaderCodes . None , true , false ,
MmcErrorField . C2PointersAndBlock ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . Q16 , TIMEOUT ,
out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadPQSubchannelWithC2 ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdpqc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
mediaTest . CanReadRWSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2438 ,
1 , MmcSectorTypes . AllTypes , false ,
false , false , MmcHeaderCodes . None ,
true , false , MmcErrorField . C2Pointers ,
2017-12-23 17:41:23 +00:00
MmcSubchannel . Raw , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadRWSubchannelWithC2 )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadRWSubchannelWithC2 = ! dev . ReadCd ( out buffer , out senseBuffer , 0 ,
2440 , 1 , MmcSectorTypes . AllTypes ,
false , false , false ,
MmcHeaderCodes . None , true , false ,
MmcErrorField . C2PointersAndBlock ,
2017-12-21 23:00:30 +00:00
MmcSubchannel . Raw , TIMEOUT ,
out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadRWSubchannelWithC2 ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdrwc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-12-23 17:41:23 +00:00
mediaTest . CanReadCorrectedSubchannelWithC2 =
! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2438 , 1 , MmcSectorTypes . AllTypes , false ,
false , false , MmcHeaderCodes . None , true , false ,
MmcErrorField . C2Pointers , MmcSubchannel . Rw , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! mediaTest . CanReadCorrectedSubchannelWithC2 )
2017-12-19 20:33:03 +00:00
mediaTest . CanReadCorrectedSubchannelWithC2 =
! dev . ReadCd ( out buffer , out senseBuffer , 0 , 2440 , 1 , MmcSectorTypes . AllTypes ,
false , false , false , MmcHeaderCodes . None , true , false ,
2017-12-23 17:41:23 +00:00
MmcErrorField . C2PointersAndBlock , MmcSubchannel . Rw , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . CanReadCorrectedSubchannelWithC2 ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readcdsubc2" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
if ( debug )
{
2017-12-20 17:15:26 +00:00
if ( ! tryNec )
2017-05-28 21:01:17 +01:00
{
pressedKey = new ConsoleKeyInfo ( ) ;
while ( pressedKey . Key ! = ConsoleKey . Y & & pressedKey . Key ! = ConsoleKey . N )
{
2017-12-19 20:33:03 +00:00
DicConsole
2018-06-22 08:08:38 +01:00
. Write ( "Do you have want to try NEC vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): " ) ;
2017-05-28 21:01:17 +01:00
pressedKey = System . Console . ReadKey ( ) ;
DicConsole . WriteLine ( ) ;
}
2017-12-20 17:15:26 +00:00
tryNec | = pressedKey . Key = = ConsoleKey . Y ;
2017-05-28 21:01:17 +01:00
}
if ( ! tryPioneer )
{
pressedKey = new ConsoleKeyInfo ( ) ;
while ( pressedKey . Key ! = ConsoleKey . Y & & pressedKey . Key ! = ConsoleKey . N )
{
2017-12-19 20:33:03 +00:00
DicConsole
2018-06-22 08:08:38 +01:00
. Write ( "Do you have want to try Pioneer vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): " ) ;
2017-05-28 21:01:17 +01:00
pressedKey = System . Console . ReadKey ( ) ;
DicConsole . WriteLine ( ) ;
}
tryPioneer | = pressedKey . Key = = ConsoleKey . Y ;
}
}
if ( tryPlextor )
{
mediaTest . SupportsPlextorReadCDDASpecified = true ;
DicConsole . WriteLine ( "Trying Plextor READ CD-DA..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsPlextorReadCDDA =
! dev . PlextorReadCdDa ( out buffer , out senseBuffer , 0 , 2352 , 1 ,
2017-12-21 23:00:30 +00:00
PlextorSubchannel . None , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . SupportsPlextorReadCDDA ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "plextorreadcdda" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
if ( tryPioneer )
{
2018-06-22 08:08:38 +01:00
mediaTest . SupportsPioneerReadCDDASpecified = true ;
2017-05-28 21:01:17 +01:00
mediaTest . SupportsPioneerReadCDDAMSFSpecified = true ;
DicConsole . WriteLine ( "Trying Pioneer READ CD-DA..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsPioneerReadCDDA =
! dev . PioneerReadCdDa ( out buffer , out senseBuffer , 0 , 2352 , 1 ,
2017-12-21 23:00:30 +00:00
PioneerSubchannel . None , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . SupportsPioneerReadCDDA ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "pioneerreadcdda" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( "Trying Pioneer READ CD-DA MSF..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsPioneerReadCDDAMSF =
! dev . PioneerReadCdDaMsf ( out buffer , out senseBuffer , 0x00000200 , 0x00000201 , 2352 ,
2017-12-21 23:00:30 +00:00
PioneerSubchannel . None , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . SupportsPioneerReadCDDAMSF ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "pioneerreadcddamsf" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
2017-12-20 17:15:26 +00:00
if ( tryNec )
2017-05-28 21:01:17 +01:00
{
mediaTest . SupportsNECReadCDDASpecified = true ;
DicConsole . WriteLine ( "Trying NEC READ CD-DA..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsNECReadCDDA =
2017-12-21 23:00:30 +00:00
! dev . NecReadCdDa ( out buffer , out senseBuffer , 0 , 1 , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" , ! mediaTest . SupportsNECReadCDDA ) ;
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "necreadcdda" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
}
mediaTest . LongBlockSize = mediaTest . BlockSize ;
DicConsole . WriteLine ( "Trying SCSI READ LONG (10)..." ) ;
2017-12-23 17:41:23 +00:00
sense = dev . ReadLong10 ( out buffer , out senseBuffer , false , false , 0 , 0xFFFF , TIMEOUT , out _ ) ;
2017-05-28 21:01:17 +01:00
if ( sense & & ! dev . Error )
{
2017-12-21 14:30:38 +00:00
FixedSense ? decSense = Sense . DecodeFixed ( senseBuffer ) ;
2017-05-28 21:01:17 +01:00
if ( decSense . HasValue )
2017-12-23 17:41:23 +00:00
if ( decSense . Value . SenseKey = = SenseKeys . IllegalRequest & & decSense . Value . ASC = = 0x24 & &
2018-06-22 08:08:38 +01:00
decSense . Value . ASCQ = = 0x00 )
2017-05-28 21:01:17 +01:00
{
mediaTest . SupportsReadLong = true ;
if ( decSense . Value . InformationValid & & decSense . Value . ILI )
{
2018-06-22 08:08:38 +01:00
mediaTest . LongBlockSize =
0xFFFF - ( decSense . Value . Information & 0xFFFF ) ;
2017-05-28 21:01:17 +01:00
mediaTest . LongBlockSizeSpecified = true ;
}
}
}
if ( debug )
2017-12-20 17:15:26 +00:00
if ( ! tryHldtst )
2017-05-28 21:01:17 +01:00
{
pressedKey = new ConsoleKeyInfo ( ) ;
while ( pressedKey . Key ! = ConsoleKey . Y & & pressedKey . Key ! = ConsoleKey . N )
{
2017-12-19 20:33:03 +00:00
DicConsole
2018-06-22 08:08:38 +01:00
. Write ( "Do you have want to try HL-DT-ST (aka LG) vendor commands? THIS IS DANGEROUS AND CAN IRREVERSIBLY DESTROY YOUR DRIVE (IF IN DOUBT PRESS 'N') (Y/N): " ) ;
2017-05-28 21:01:17 +01:00
pressedKey = System . Console . ReadKey ( ) ;
DicConsole . WriteLine ( ) ;
}
2017-12-20 17:15:26 +00:00
tryHldtst | = pressedKey . Key = = ConsoleKey . Y ;
2017-05-28 21:01:17 +01:00
}
if ( mediaTest . SupportsReadLong & & mediaTest . LongBlockSize = = mediaTest . BlockSize )
{
2017-12-18 17:53:04 +00:00
// DVDs
2017-12-23 17:41:23 +00:00
sense = dev . ReadLong10 ( out buffer , out senseBuffer , false , false , 0 , 37856 , TIMEOUT , out _ ) ;
2017-12-18 17:53:04 +00:00
if ( ! sense & & ! dev . Error )
2017-05-28 21:01:17 +01:00
{
2018-06-22 08:08:38 +01:00
mediaTest . SupportsReadLong = true ;
mediaTest . LongBlockSize = 37856 ;
2017-12-18 17:53:04 +00:00
mediaTest . LongBlockSizeSpecified = true ;
2017-05-28 21:01:17 +01:00
}
}
if ( tryPlextor )
{
mediaTest . SupportsPlextorReadRawDVDSpecified = true ;
DicConsole . WriteLine ( "Trying Plextor trick to raw read DVDs..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsPlextorReadRawDVD =
2017-12-21 23:00:30 +00:00
! dev . PlextorReadRawDvd ( out buffer , out senseBuffer , 0 , 1 , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . SupportsPlextorReadRawDVD ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "plextorrawdvd" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
if ( mediaTest . SupportsPlextorReadRawDVD )
mediaTest . SupportsPlextorReadRawDVD = ! ArrayHelpers . ArrayIsNullOrEmpty ( buffer ) ;
}
2017-12-20 17:15:26 +00:00
if ( tryHldtst )
2017-05-28 21:01:17 +01:00
{
mediaTest . SupportsHLDTSTReadRawDVDSpecified = true ;
DicConsole . WriteLine ( "Trying HL-DT-ST (aka LG) trick to raw read DVDs..." ) ;
2017-12-19 20:33:03 +00:00
mediaTest . SupportsHLDTSTReadRawDVD =
2017-12-21 23:00:30 +00:00
! dev . HlDtStReadRawDvd ( out buffer , out senseBuffer , 0 , 1 , TIMEOUT , out _ ) ;
2017-12-19 20:33:03 +00:00
DicConsole . DebugWriteLine ( "SCSI Report" , "Sense = {0}" ,
! mediaTest . SupportsHLDTSTReadRawDVD ) ;
2017-06-03 19:26:48 +01:00
if ( debug )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "hldtstrawdvd" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-05-28 21:01:17 +01:00
}
if ( mediaTest . SupportsReadLong & & mediaTest . LongBlockSize = = mediaTest . BlockSize )
{
pressedKey = new ConsoleKeyInfo ( ) ;
while ( pressedKey . Key ! = ConsoleKey . Y & & pressedKey . Key ! = ConsoleKey . N )
{
2017-12-19 20:33:03 +00:00
DicConsole
2018-06-22 08:08:38 +01:00
. Write ( "Drive supports SCSI READ LONG but I cannot find the correct size. Do you want me to try? (This can take hours) (Y/N): " ) ;
2017-05-28 21:01:17 +01:00
pressedKey = System . Console . ReadKey ( ) ;
DicConsole . WriteLine ( ) ;
}
if ( pressedKey . Key = = ConsoleKey . Y )
{
2017-12-23 17:41:23 +00:00
for ( ushort i = ( ushort ) mediaTest . BlockSize ; ; i + + )
2017-05-28 21:01:17 +01:00
{
DicConsole . Write ( "\rTrying to READ LONG with a size of {0} bytes..." , i ) ;
2017-12-21 23:00:30 +00:00
sense = dev . ReadLong10 ( out buffer , out senseBuffer , false , false , 0 , i , TIMEOUT ,
out _ ) ;
2017-05-28 21:01:17 +01:00
if ( ! sense )
{
if ( debug )
{
2017-12-19 20:33:03 +00:00
FileStream bingo =
2017-12-23 17:41:23 +00:00
new FileStream ( $"{mediaType}_readlong.bin" , FileMode . Create ) ;
2017-05-28 21:01:17 +01:00
bingo . Write ( buffer , 0 , buffer . Length ) ;
bingo . Close ( ) ;
}
2018-06-22 08:08:38 +01:00
mediaTest . LongBlockSize = i ;
2017-05-28 21:01:17 +01:00
mediaTest . LongBlockSizeSpecified = true ;
break ;
}
2017-06-04 01:26:31 +01:00
2017-12-19 20:33:03 +00:00
if ( i = = ushort . MaxValue ) break ;
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
2017-05-28 21:01:17 +01:00
DicConsole . WriteLine ( ) ;
}
}
2017-06-03 19:26:48 +01:00
2017-12-19 20:33:03 +00:00
if ( debug & & mediaTest . SupportsReadLong & & mediaTest . LongBlockSizeSpecified & &
mediaTest . LongBlockSize ! = mediaTest . BlockSize )
2017-06-03 19:26:48 +01:00
{
2017-12-19 20:33:03 +00:00
sense = dev . ReadLong10 ( out buffer , out senseBuffer , false , false , 0 ,
2017-12-21 23:00:30 +00:00
( ushort ) mediaTest . LongBlockSize , TIMEOUT , out _ ) ;
2017-06-03 19:26:48 +01:00
if ( ! sense )
2017-12-19 20:33:03 +00:00
DataFile . WriteTo ( "SCSI Report" , "readlong10" ,
"_debug_" + report . SCSI . Inquiry . ProductIdentification + "_" +
mediaType + ".bin" , "read results" , buffer ) ;
2017-06-03 19:26:48 +01:00
}
2017-05-28 21:01:17 +01:00
}
2017-12-19 20:33:03 +00:00
2017-05-28 21:01:17 +01:00
mediaTests . Add ( mediaTest ) ;
}
2017-12-19 20:33:03 +00:00
2017-05-28 21:01:17 +01:00
report . SCSI . MultiMediaDevice . TestedMedia = mediaTests . ToArray ( ) ;
}
}
}
2017-12-19 20:33:03 +00:00
}