From 8e0d254ed2e2f2697c10e02ce4d805f5f26bd0d4 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Fri, 4 Dec 2015 08:12:20 +0000 Subject: [PATCH] * DiscImageChef.Decoders/SCSI/Sense.cs: Additional length may be bigger than provided buffer. * DiscImageChef/Commands/MediaInfo.cs: Implement detection of medium not present and waiting for drive to become ready. --- DiscImageChef.Decoders/ChangeLog | 5 ++++ DiscImageChef.Decoders/SCSI/Sense.cs | 3 -- DiscImageChef/ChangeLog | 6 ++++ DiscImageChef/Commands/MediaInfo.cs | 45 ++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/DiscImageChef.Decoders/ChangeLog b/DiscImageChef.Decoders/ChangeLog index 1427af06..e86c8adc 100644 --- a/DiscImageChef.Decoders/ChangeLog +++ b/DiscImageChef.Decoders/ChangeLog @@ -1,3 +1,8 @@ +2015-12-04 Natalia Portillo + + * SCSI/Sense.cs: + Additional length may be bigger than provided buffer. + 2015-12-04 Natalia Portillo * DVD/PFI.cs: diff --git a/DiscImageChef.Decoders/SCSI/Sense.cs b/DiscImageChef.Decoders/SCSI/Sense.cs index 51a196c9..02ba3cb1 100644 --- a/DiscImageChef.Decoders/SCSI/Sense.cs +++ b/DiscImageChef.Decoders/SCSI/Sense.cs @@ -304,9 +304,6 @@ namespace DiscImageChef.Decoders.SCSI decoded.Information = (uint)((sense[3] << 24) + (sense[4] << 16) + (sense[5] << 8) + sense[6]); decoded.AdditionalLength = sense[7]; - if (sense.Length < decoded.AdditionalLength + 8) - return decoded; - if(sense.Length >= 12) decoded.CommandSpecific = (uint)((sense[8] << 24) + (sense[9] << 16) + (sense[10] << 8) + sense[11]); diff --git a/DiscImageChef/ChangeLog b/DiscImageChef/ChangeLog index 2dc0bbcf..e128b562 100644 --- a/DiscImageChef/ChangeLog +++ b/DiscImageChef/ChangeLog @@ -1,3 +1,9 @@ +2015-12-04 Natalia Portillo + + * Commands/MediaInfo.cs: + Implement detection of medium not present and waiting for + drive to become ready. + 2015-12-04 Natalia Portillo * Commands/MediaInfo.cs: diff --git a/DiscImageChef/Commands/MediaInfo.cs b/DiscImageChef/Commands/MediaInfo.cs index 85f3c4e8..2e54a8a0 100644 --- a/DiscImageChef/Commands/MediaInfo.cs +++ b/DiscImageChef/Commands/MediaInfo.cs @@ -112,6 +112,51 @@ namespace DiscImageChef.Commands ulong blocks = 0; uint blockSize = 0; + sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration); + if (sense) + { + Decoders.SCSI.FixedSense? decSense = Decoders.SCSI.Sense.DecodeFixed(senseBuf); + if (decSense.HasValue) + { + if (decSense.Value.ASC == 0x3A) + { + DicConsole.ErrorWriteLine("Please insert media in drive"); + return; + } + + if (decSense.Value.ASC == 0x04 && decSense.Value.ASCQ == 0x01) + { + int leftRetries = 10; + while (leftRetries > 0) + { + DicConsole.WriteLine("\rWaiting for drive to become ready"); + System.Threading.Thread.Sleep(2000); + sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration); + if (!sense) + break; + + leftRetries--; + } + + if (sense) + { + DicConsole.ErrorWriteLine("Error testing unit was ready:\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf)); + return; + } + } + else + { + DicConsole.ErrorWriteLine("Error testing unit was ready:\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf)); + return; + } + } + else + { + DicConsole.ErrorWriteLine("Unknown testing unit was ready."); + return; + } + } + if (dev.SCSIType == DiscImageChef.Decoders.SCSI.PeripheralDeviceTypes.DirectAccess || dev.SCSIType == DiscImageChef.Decoders.SCSI.PeripheralDeviceTypes.MultiMediaDevice || dev.SCSIType == DiscImageChef.Decoders.SCSI.PeripheralDeviceTypes.OCRWDevice ||