2015-12-30 11:45:27 +00:00
|
|
|
|
// /***************************************************************************
|
|
|
|
|
|
// The Disc Image Chef
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
//
|
|
|
|
|
|
// Filename : MediaScan.cs
|
2016-07-28 18:13:49 +01:00
|
|
|
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
2015-12-30 11:45:27 +00:00
|
|
|
|
//
|
2016-07-28 18:13:49 +01:00
|
|
|
|
// Component : Verbs.
|
2015-12-30 11:45:27 +00:00
|
|
|
|
//
|
|
|
|
|
|
// --[ Description ] ----------------------------------------------------------
|
|
|
|
|
|
//
|
2016-07-28 18:13:49 +01:00
|
|
|
|
// Implements the 'media-scan' verb.
|
2015-12-30 11:45:27 +00: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/>.
|
|
|
|
|
|
//
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
2016-07-28 18:13:49 +01:00
|
|
|
|
// Copyright © 2011-2016 Natalia Portillo
|
2015-12-30 11:45:27 +00:00
|
|
|
|
// ****************************************************************************/
|
2016-07-28 18:13:49 +01:00
|
|
|
|
|
2015-12-30 11:45:27 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
using DiscImageChef.Console;
|
|
|
|
|
|
using DiscImageChef.Devices;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
|
|
namespace DiscImageChef.Commands
|
|
|
|
|
|
{
|
|
|
|
|
|
public static class MediaScan
|
|
|
|
|
|
{
|
|
|
|
|
|
static bool aborted;
|
2016-02-04 17:12:35 +00:00
|
|
|
|
static Core.MHDDLog mhddLog;
|
|
|
|
|
|
static Core.IBGLog ibgLog;
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
2016-04-08 01:13:42 +01:00
|
|
|
|
public static void doMediaScan(MediaScanOptions options)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.DebugWriteLine("Media-Scan command", "--debug={0}", options.Debug);
|
|
|
|
|
|
DicConsole.DebugWriteLine("Media-Scan command", "--verbose={0}", options.Verbose);
|
|
|
|
|
|
DicConsole.DebugWriteLine("Media-Scan command", "--device={0}", options.DevicePath);
|
|
|
|
|
|
DicConsole.DebugWriteLine("Media-Scan command", "--mhdd-log={0}", options.MHDDLogPath);
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
DicConsole.DebugWriteLine("Media-Scan command", "--ibg-log={0}", options.IBGLogPath);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!System.IO.File.Exists(options.DevicePath))
|
2016-02-04 16:51:03 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Specified device does not exist.");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(options.DevicePath.Length == 2 && options.DevicePath[1] == ':' &&
|
2016-07-28 22:25:26 +01:00
|
|
|
|
options.DevicePath[0] != '/' && char.IsLetter(options.DevicePath[0]))
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-07-28 22:25:26 +01:00
|
|
|
|
options.DevicePath = "\\\\.\\" + char.ToUpper(options.DevicePath[0]) + ':';
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog = null;
|
|
|
|
|
|
ibgLog = null;
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
|
|
|
|
|
Device dev = new Device(options.DevicePath);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(dev.Error)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Error {0} opening device.", dev.LastError);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* commandline:
* DiscImageChef.Settings/Settings.cs:
* DiscImageChef.Settings/docs/README.txt:
* DiscImageChef.Settings/packages.config:
* DiscImageChef.Settings/docs/LICENSE.txt:
* DiscImageChef.Settings/docs/ChangeLog.txt:
* DiscImageChef.Settings/docs/mono/index.xml:
* DiscImageChef.Settings/docs/html/index.html:
* DiscImageChef.Settings/Properties/AssemblyInfo.cs:
* DiscImageChef.Settings/DiscImageChef.Settings.csproj:
* DiscImageChef.Settings/docs/mono/ns-Claunia.PropertyList.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/UID.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/UID.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSSet.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/index.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSSet.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDate.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSData.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDate.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSData.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSArray.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSNumber.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSString.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSObject.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSArray.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSNumber.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSString.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSObject.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDictionary.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDictionary.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/XmlPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/XmlPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/ASCIIPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/ASCIIPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListParser.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListWriter.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListWriter.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListFormatException.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListFormatException.html:
Added supports for settings
* DiscImageChef/Commands/Configure.cs:
Added support for settings.
* DiscImageChef/Core/Statistics.cs:
* DiscImageChef/Commands/Verify.cs:
* DiscImageChef/Commands/Entropy.cs:
* DiscImageChef/Commands/Formats.cs:
* DiscImageChef/Commands/PrintHex.cs:
* DiscImageChef/Commands/MediaInfo.cs:
* DiscImageChef/Commands/Statistics.cs:
Added statistics.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
Corrected bug on inquiry decoding.
* DiscImageChef.Decoders/SCSI/Modes.cs:
Corrected bug on decoding mode page 2Ah without write
performance descriptors.
Corrected bug when there is a vendor page 0 in mode sense
decoding.
* DiscImageChef.Devices/Device/Constructor.cs:
Corrected detecting USB or FireWire attached CD/DVD/BD and
tape drives.
Try ATA identify on USB or FireWire that don't have SCSI
INQUIRY.
* DiscImageChef.DiscImages/CDRWin.cs:
Corrected CD-ROM XA vs CD-ROM detection.
* DiscImageChef.Partitions/AppleMap.cs:
Corrected big endian working.
Added debug output.
* DiscImageChef.sln:
Added supports for settings.
* DiscImageChef/Commands/Decode.cs:
* DiscImageChef/Commands/Analyze.cs:
* DiscImageChef/Commands/Compare.cs:
* DiscImageChef/Commands/Checksum.cs:
* DiscImageChef/Commands/Benchmark.cs:
* DiscImageChef/Commands/DeviceInfo.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Added statistics.
* DiscImageChef/Commands/DeviceReport.cs:
Added statistics.
Correct handling empty inquiry string fields.
Suppose it is not removable, til proved wrong.
Corrected MODE SENSE (6/10) detection and calling order.
If device is MMC type but reports neither mode page 2Ah
neither GET CONFIGURATION, try all CDs (old drives work like
that).
Try reading Lead-In and Lead-Out in Audio CD using Audio READ
CD commands.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Added support for DVD raw block (37856 bytes).
Check READ LONG up to 36 times the cooked block size. That
should be enough to detect huge blocked media (like DVD and
BD) without taking ages.
If READ LONG size had to be bruteforced, and debug is
activated, save the result.
* DiscImageChef/Commands/DumpMedia.cs:
Added statistics.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/Commands/MediaScan.cs:
Added statistics.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/DiscImageChef.csproj:
Added support for settings.
Added statistics.
* DiscImageChef/Main.cs:
* DiscImageChef/Options.cs:
Added support for settings.
Added statistics.
2016-02-03 18:58:11 +00:00
|
|
|
|
Core.Statistics.AddDevice(dev);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
switch(dev.Type)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
case DeviceType.ATA:
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
doATAMediaScan(options.MHDDLogPath, options.IBGLogPath, options.DevicePath, dev);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
|
|
|
|
|
case DeviceType.MMC:
|
|
|
|
|
|
case DeviceType.SecureDigital:
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
doSDMediaScan(options.MHDDLogPath, options.IBGLogPath, options.DevicePath, dev);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
|
|
|
|
|
case DeviceType.NVMe:
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
doNVMeMediaScan(options.MHDDLogPath, options.IBGLogPath, options.DevicePath, dev);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
|
|
|
|
|
case DeviceType.ATAPI:
|
|
|
|
|
|
case DeviceType.SCSI:
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
doSCSIMediaScan(options.MHDDLogPath, options.IBGLogPath, options.DevicePath, dev);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
throw new NotSupportedException("Unknown device type.");
|
|
|
|
|
|
}
|
* commandline:
* DiscImageChef.Settings/Settings.cs:
* DiscImageChef.Settings/docs/README.txt:
* DiscImageChef.Settings/packages.config:
* DiscImageChef.Settings/docs/LICENSE.txt:
* DiscImageChef.Settings/docs/ChangeLog.txt:
* DiscImageChef.Settings/docs/mono/index.xml:
* DiscImageChef.Settings/docs/html/index.html:
* DiscImageChef.Settings/Properties/AssemblyInfo.cs:
* DiscImageChef.Settings/DiscImageChef.Settings.csproj:
* DiscImageChef.Settings/docs/mono/ns-Claunia.PropertyList.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/UID.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/UID.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSSet.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/index.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSSet.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDate.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSData.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDate.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSData.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSArray.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSNumber.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSString.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSObject.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSArray.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSNumber.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSString.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSObject.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDictionary.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDictionary.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/XmlPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/XmlPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/ASCIIPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/ASCIIPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListParser.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListWriter.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListWriter.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListFormatException.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListFormatException.html:
Added supports for settings
* DiscImageChef/Commands/Configure.cs:
Added support for settings.
* DiscImageChef/Core/Statistics.cs:
* DiscImageChef/Commands/Verify.cs:
* DiscImageChef/Commands/Entropy.cs:
* DiscImageChef/Commands/Formats.cs:
* DiscImageChef/Commands/PrintHex.cs:
* DiscImageChef/Commands/MediaInfo.cs:
* DiscImageChef/Commands/Statistics.cs:
Added statistics.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
Corrected bug on inquiry decoding.
* DiscImageChef.Decoders/SCSI/Modes.cs:
Corrected bug on decoding mode page 2Ah without write
performance descriptors.
Corrected bug when there is a vendor page 0 in mode sense
decoding.
* DiscImageChef.Devices/Device/Constructor.cs:
Corrected detecting USB or FireWire attached CD/DVD/BD and
tape drives.
Try ATA identify on USB or FireWire that don't have SCSI
INQUIRY.
* DiscImageChef.DiscImages/CDRWin.cs:
Corrected CD-ROM XA vs CD-ROM detection.
* DiscImageChef.Partitions/AppleMap.cs:
Corrected big endian working.
Added debug output.
* DiscImageChef.sln:
Added supports for settings.
* DiscImageChef/Commands/Decode.cs:
* DiscImageChef/Commands/Analyze.cs:
* DiscImageChef/Commands/Compare.cs:
* DiscImageChef/Commands/Checksum.cs:
* DiscImageChef/Commands/Benchmark.cs:
* DiscImageChef/Commands/DeviceInfo.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Added statistics.
* DiscImageChef/Commands/DeviceReport.cs:
Added statistics.
Correct handling empty inquiry string fields.
Suppose it is not removable, til proved wrong.
Corrected MODE SENSE (6/10) detection and calling order.
If device is MMC type but reports neither mode page 2Ah
neither GET CONFIGURATION, try all CDs (old drives work like
that).
Try reading Lead-In and Lead-Out in Audio CD using Audio READ
CD commands.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Added support for DVD raw block (37856 bytes).
Check READ LONG up to 36 times the cooked block size. That
should be enough to detect huge blocked media (like DVD and
BD) without taking ages.
If READ LONG size had to be bruteforced, and debug is
activated, save the result.
* DiscImageChef/Commands/DumpMedia.cs:
Added statistics.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/Commands/MediaScan.cs:
Added statistics.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/DiscImageChef.csproj:
Added support for settings.
Added statistics.
* DiscImageChef/Main.cs:
* DiscImageChef/Options.cs:
Added support for settings.
Added statistics.
2016-02-03 18:58:11 +00:00
|
|
|
|
|
|
|
|
|
|
Core.Statistics.AddCommand("media-scan");
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
static void doATAMediaScan(string MHDDLogPath, string IBGLogPath, string devicePath, Device dev)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-02-10 03:00:39 +00:00
|
|
|
|
byte[] cmdBuf;
|
|
|
|
|
|
bool sense;
|
|
|
|
|
|
ulong blocks = 0;
|
|
|
|
|
|
uint blockSize;
|
|
|
|
|
|
ushort currentProfile = 0x0001;
|
|
|
|
|
|
Decoders.ATA.AtaErrorRegistersCHS errorChs;
|
|
|
|
|
|
Decoders.ATA.AtaErrorRegistersLBA28 errorLba;
|
|
|
|
|
|
Decoders.ATA.AtaErrorRegistersLBA48 errorLba48;
|
|
|
|
|
|
bool lbaMode = false;
|
|
|
|
|
|
byte heads = 0, sectors = 0;
|
|
|
|
|
|
ushort cylinders = 0;
|
|
|
|
|
|
uint timeout = 5;
|
|
|
|
|
|
double duration;
|
|
|
|
|
|
|
|
|
|
|
|
sense = dev.AtaIdentify(out cmdBuf, out errorChs);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!sense && Decoders.ATA.Identify.Decode(cmdBuf).HasValue)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
Decoders.ATA.Identify.IdentifyDevice ataId = Decoders.ATA.Identify.Decode(cmdBuf).Value;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(ataId.CurrentCylinders > 0 && ataId.CurrentHeads > 0 && ataId.CurrentSectorsPerTrack > 0)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
cylinders = ataId.CurrentCylinders;
|
|
|
|
|
|
heads = (byte)ataId.CurrentHeads;
|
|
|
|
|
|
sectors = (byte)ataId.CurrentSectorsPerTrack;
|
|
|
|
|
|
blocks = (ulong)(cylinders * heads * sectors);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((ataId.CurrentCylinders == 0 || ataId.CurrentHeads == 0 || ataId.CurrentSectorsPerTrack == 0) &&
|
2016-02-10 03:00:39 +00:00
|
|
|
|
(ataId.Cylinders > 0 && ataId.Heads > 0 && ataId.SectorsPerTrack > 0))
|
|
|
|
|
|
{
|
|
|
|
|
|
cylinders = ataId.Cylinders;
|
|
|
|
|
|
heads = (byte)ataId.Heads;
|
|
|
|
|
|
sectors = (byte)ataId.SectorsPerTrack;
|
|
|
|
|
|
blocks = (ulong)(cylinders * heads * sectors);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(ataId.Capabilities.HasFlag(Decoders.ATA.Identify.CapabilitiesBit.LBASupport))
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
blocks = ataId.LBASectors;
|
|
|
|
|
|
lbaMode = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(ataId.CommandSet2.HasFlag(Decoders.ATA.Identify.CommandSetBit2.LBA48))
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
blocks = ataId.LBA48Sectors;
|
|
|
|
|
|
lbaMode = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((ataId.PhysLogSectorSize & 0x8000) == 0x0000 &&
|
2016-02-10 03:00:39 +00:00
|
|
|
|
(ataId.PhysLogSectorSize & 0x4000) == 0x4000)
|
|
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((ataId.PhysLogSectorSize & 0x1000) == 0x1000)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(ataId.LogicalSectorWords <= 255 || ataId.LogicalAlignment == 0xFFFF)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
blockSize = 512;
|
|
|
|
|
|
else
|
|
|
|
|
|
blockSize = ataId.LogicalSectorWords * 2;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
blockSize = 512;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
blockSize = 512;
|
|
|
|
|
|
|
|
|
|
|
|
bool ReadLba = false;
|
|
|
|
|
|
bool ReadRetryLba = false;
|
|
|
|
|
|
bool ReadDmaLba = false;
|
|
|
|
|
|
bool ReadDmaRetryLba = false;
|
|
|
|
|
|
bool SeekLba = false;
|
|
|
|
|
|
|
|
|
|
|
|
bool ReadLba48 = false;
|
|
|
|
|
|
bool ReadDmaLba48 = false;
|
|
|
|
|
|
|
|
|
|
|
|
bool Read = false;
|
|
|
|
|
|
bool ReadRetry = false;
|
|
|
|
|
|
bool ReadDma = false;
|
|
|
|
|
|
bool ReadDmaRetry = false;
|
|
|
|
|
|
bool Seek = false;
|
|
|
|
|
|
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorChs, false, 0, 0, 1, 1, timeout, out duration);
|
|
|
|
|
|
Read = (!sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorChs, true, 0, 0, 1, 1, timeout, out duration);
|
|
|
|
|
|
ReadRetry = (!sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorChs, false, 0, 0, 1, 1, timeout, out duration);
|
|
|
|
|
|
ReadDma = (!sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorChs, true, 0, 0, 1, 1, timeout, out duration);
|
|
|
|
|
|
ReadDmaRetry = (!sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
sense = dev.Seek(out errorChs, 0, 0, 1, timeout, out duration);
|
|
|
|
|
|
Seek = (!sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0);
|
|
|
|
|
|
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorLba, false, 0, 1, timeout, out duration);
|
|
|
|
|
|
ReadLba = (!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorLba, true, 0, 1, timeout, out duration);
|
|
|
|
|
|
ReadRetryLba = (!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorLba, false, 0, 1, timeout, out duration);
|
|
|
|
|
|
ReadDmaLba = (!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorLba, true, 0, 1, timeout, out duration);
|
|
|
|
|
|
ReadDmaRetryLba = (!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
sense = dev.Seek(out errorLba, 0, timeout, out duration);
|
|
|
|
|
|
SeekLba = (!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0);
|
|
|
|
|
|
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorLba48, 0, 1, timeout, out duration);
|
|
|
|
|
|
ReadLba48 = (!sense && (errorLba48.status & 0x27) == 0 && errorLba48.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorLba48, 0, 1, timeout, out duration);
|
|
|
|
|
|
ReadDmaLba48 = (!sense && (errorLba48.status & 0x27) == 0 && errorLba48.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!lbaMode)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(blocks > 0xFFFFFFF && !ReadLba48 && !ReadDmaLba48)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Device needs 48-bit LBA commands but I can't issue them... Aborting.");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!ReadLba && !ReadRetryLba && !ReadDmaLba && !ReadDmaRetryLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Device needs 28-bit LBA commands but I can't issue them... Aborting.");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!Read && !ReadRetry && !ReadDma && !ReadDmaRetry)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Device needs CHS commands but I can't issue them... Aborting.");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(ReadDmaLba48)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Using ATA READ DMA EXT command.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadLba48)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Using ATA READ EXT command.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadDmaRetryLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Using ATA READ DMA command with retries (LBA).");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadDmaLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Using ATA READ DMA command (LBA).");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadRetryLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Using ATA READ command with retries (LBA).");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Using ATA READ command (LBA).");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadDmaRetry)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Using ATA READ DMA command with retries (CHS).");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadDma)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Using ATA READ DMA command (CHS).");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadRetry)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Using ATA READ command with retries (CHS).");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(Read)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Using ATA READ command (CHS).");
|
|
|
|
|
|
|
2016-04-06 17:07:14 +01:00
|
|
|
|
byte blocksToRead = 254;
|
2016-02-10 03:00:39 +00:00
|
|
|
|
bool error = true;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
while(lbaMode)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(ReadDmaLba48)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorLba48, 0, blocksToRead, timeout, out duration);
|
|
|
|
|
|
error = !(!sense && (errorLba48.status & 0x27) == 0 && errorLba48.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadLba48)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorLba48, 0, blocksToRead, timeout, out duration);
|
|
|
|
|
|
error = !(!sense && (errorLba48.status & 0x27) == 0 && errorLba48.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadDmaRetryLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorLba, true, 0, blocksToRead, timeout, out duration);
|
|
|
|
|
|
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadDmaLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorLba, false, 0, blocksToRead, timeout, out duration);
|
|
|
|
|
|
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadRetryLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorLba, true, 0, blocksToRead, timeout, out duration);
|
|
|
|
|
|
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorLba, false, 0, blocksToRead, timeout, out duration);
|
|
|
|
|
|
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(error)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
blocksToRead /= 2;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!error || blocksToRead == 1)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(error && lbaMode)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Device error {0} trying to guess ideal transfer length.", dev.LastError);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ulong A = 0; // <3ms
|
|
|
|
|
|
ulong B = 0; // >=3ms, <10ms
|
|
|
|
|
|
ulong C = 0; // >=10ms, <50ms
|
|
|
|
|
|
ulong D = 0; // >=50ms, <150ms
|
|
|
|
|
|
ulong E = 0; // >=150ms, <500ms
|
|
|
|
|
|
ulong F = 0; // >=500ms
|
|
|
|
|
|
ulong errored = 0;
|
|
|
|
|
|
DateTime start;
|
|
|
|
|
|
DateTime end;
|
|
|
|
|
|
double totalDuration = 0;
|
|
|
|
|
|
double currentSpeed = 0;
|
|
|
|
|
|
double maxSpeed = double.MinValue;
|
|
|
|
|
|
double minSpeed = double.MaxValue;
|
|
|
|
|
|
List<ulong> unreadableSectors = new List<ulong>();
|
|
|
|
|
|
double seekMax = double.MinValue;
|
|
|
|
|
|
double seekMin = double.MaxValue;
|
|
|
|
|
|
double seekTotal = 0;
|
|
|
|
|
|
const int seekTimes = 1000;
|
|
|
|
|
|
|
|
|
|
|
|
double seekCur = 0;
|
|
|
|
|
|
|
|
|
|
|
|
Random rnd = new Random();
|
|
|
|
|
|
|
|
|
|
|
|
uint seekPos = (uint)rnd.Next((int)blocks);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
ushort seekCy = (ushort)rnd.Next(cylinders);
|
|
|
|
|
|
byte seekHd = (byte)rnd.Next(heads);
|
|
|
|
|
|
byte seekSc = (byte)rnd.Next(sectors);
|
2016-02-10 03:00:39 +00:00
|
|
|
|
|
|
|
|
|
|
aborted = false;
|
|
|
|
|
|
System.Console.CancelKeyPress += (sender, e) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
e.Cancel = aborted = true;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(lbaMode)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.WriteLine("Reading {0} sectors at a time.", blocksToRead);
|
|
|
|
|
|
|
|
|
|
|
|
mhddLog = new Core.MHDDLog(MHDDLogPath, dev, blocks, blockSize, blocksToRead);
|
|
|
|
|
|
ibgLog = new Core.IBGLog(IBGLogPath, currentProfile);
|
|
|
|
|
|
|
|
|
|
|
|
start = DateTime.UtcNow;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
for(ulong i = 0; i < blocks; i += blocksToRead)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(aborted)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
double cmdDuration = 0;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((blocks - i) < blocksToRead)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
blocksToRead = (byte)(blocks - i);
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(currentSpeed > maxSpeed && currentSpeed != 0)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
maxSpeed = currentSpeed;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(currentSpeed < minSpeed && currentSpeed != 0)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
minSpeed = currentSpeed;
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator
|
2016-02-10 03:00:39 +00:00
|
|
|
|
|
|
|
|
|
|
DicConsole.Write("\rReading sector {0} of {1} ({2:F3} MiB/sec.)", i, blocks, currentSpeed);
|
|
|
|
|
|
|
|
|
|
|
|
error = true;
|
|
|
|
|
|
byte status = 0, errorByte = 0;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(ReadDmaLba48)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorLba48, i, blocksToRead, timeout, out cmdDuration);
|
|
|
|
|
|
error = !(!sense && (errorLba48.status & 0x27) == 0 && errorLba48.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
status = errorLba48.status;
|
|
|
|
|
|
errorByte = errorLba48.error;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadLba48)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorLba48, i, blocksToRead, timeout, out cmdDuration);
|
|
|
|
|
|
error = !(!sense && (errorLba48.status & 0x27) == 0 && errorLba48.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
status = errorLba48.status;
|
|
|
|
|
|
errorByte = errorLba48.error;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadDmaRetryLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorLba, true, (uint)i, blocksToRead, timeout, out cmdDuration);
|
|
|
|
|
|
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
status = errorLba.status;
|
|
|
|
|
|
errorByte = errorLba.error;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadDmaLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorLba, false, (uint)i, blocksToRead, timeout, out cmdDuration);
|
|
|
|
|
|
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
status = errorLba.status;
|
|
|
|
|
|
errorByte = errorLba.error;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadRetryLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorLba, true, (uint)i, blocksToRead, timeout, out cmdDuration);
|
|
|
|
|
|
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
status = errorLba.status;
|
|
|
|
|
|
errorByte = errorLba.error;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorLba, false, (uint)i, blocksToRead, timeout, out cmdDuration);
|
|
|
|
|
|
error = !(!sense && (errorLba.status & 0x27) == 0 && errorLba.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
status = errorLba.status;
|
|
|
|
|
|
errorByte = errorLba.error;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!error)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(cmdDuration >= 500)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
F += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 150)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
E += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 50)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
D += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 10)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
C += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 3)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
B += blocksToRead;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
A += blocksToRead;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
mhddLog.Write(i, cmdDuration);
|
|
|
|
|
|
ibgLog.Write(i, currentSpeed * 1024);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
DicConsole.DebugWriteLine("Media-Scan", "ATA ERROR: {0} STATUS: {1}", errorByte, status);
|
|
|
|
|
|
errored += blocksToRead;
|
|
|
|
|
|
unreadableSectors.Add(i);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(cmdDuration < 500)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
mhddLog.Write(i, 65535);
|
|
|
|
|
|
else
|
|
|
|
|
|
mhddLog.Write(i, cmdDuration);
|
|
|
|
|
|
|
|
|
|
|
|
ibgLog.Write(i, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-10 03:00:39 +00:00
|
|
|
|
currentSpeed = ((double)blockSize * blocksToRead / (double)1048576) / (cmdDuration / (double)1000);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-10 03:00:39 +00:00
|
|
|
|
GC.Collect();
|
|
|
|
|
|
}
|
|
|
|
|
|
end = DateTime.UtcNow;
|
|
|
|
|
|
DicConsole.WriteLine();
|
|
|
|
|
|
mhddLog.Close();
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-10 03:00:39 +00:00
|
|
|
|
ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, (((double)blockSize * (double)(blocks + 1)) / 1024) / (totalDuration / 1000), devicePath);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-10 03:00:39 +00:00
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(SeekLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
for(int i = 0; i < seekTimes; i++)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(aborted)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
seekPos = (uint)rnd.Next((int)blocks);
|
|
|
|
|
|
|
|
|
|
|
|
DicConsole.Write("\rSeeking to sector {0}...\t\t", seekPos);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(SeekLba)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
dev.Seek(out errorLba, seekPos, timeout, out seekCur);
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(seekCur > seekMax && seekCur != 0)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
seekMax = seekCur;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(seekCur < seekMin && seekCur != 0)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
seekMin = seekCur;
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator
|
2016-02-10 03:00:39 +00:00
|
|
|
|
|
|
|
|
|
|
seekTotal += seekCur;
|
|
|
|
|
|
GC.Collect();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
mhddLog = new Core.MHDDLog(MHDDLogPath, dev, blocks, blockSize, blocksToRead);
|
|
|
|
|
|
ibgLog = new Core.IBGLog(IBGLogPath, currentProfile);
|
|
|
|
|
|
|
|
|
|
|
|
ulong currentBlock = 0;
|
|
|
|
|
|
blocks = (ulong)(cylinders * heads * sectors);
|
|
|
|
|
|
start = DateTime.UtcNow;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
for(ushort Cy = 0; Cy < cylinders; Cy++)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
for(byte Hd = 0; Hd < heads; Hd++)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
for(byte Sc = 1; Sc < sectors; Sc++)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(aborted)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
double cmdDuration = 0;
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(currentSpeed > maxSpeed && currentSpeed != 0)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
maxSpeed = currentSpeed;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(currentSpeed < minSpeed && currentSpeed != 0)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
minSpeed = currentSpeed;
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator
|
2016-02-10 03:00:39 +00:00
|
|
|
|
|
|
|
|
|
|
DicConsole.Write("\rReading cylinder {0} head {1} sector {2} ({3:F3} MiB/sec.)", Cy, Hd, Sc, currentSpeed);
|
|
|
|
|
|
|
|
|
|
|
|
error = true;
|
|
|
|
|
|
byte status = 0, errorByte = 0;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(ReadDmaRetry)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorChs, true, Cy, Hd, Sc, 1, timeout, out cmdDuration);
|
|
|
|
|
|
error = !(!sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
status = errorChs.status;
|
|
|
|
|
|
errorByte = errorChs.error;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadDma)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadDma(out cmdBuf, out errorChs, false, Cy, Hd, Sc, 1, timeout, out cmdDuration);
|
|
|
|
|
|
error = !(!sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
status = errorChs.status;
|
|
|
|
|
|
errorByte = errorChs.error;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(ReadRetry)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorChs, true, Cy, Hd, Sc, 1, timeout, out cmdDuration);
|
|
|
|
|
|
error = !(!sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
status = errorChs.status;
|
|
|
|
|
|
errorByte = errorChs.error;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(Read)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read(out cmdBuf, out errorChs, false, Cy, Hd, Sc, 1, timeout, out cmdDuration);
|
|
|
|
|
|
error = !(!sense && (errorChs.status & 0x27) == 0 && errorChs.error == 0 && cmdBuf.Length > 0);
|
|
|
|
|
|
status = errorChs.status;
|
|
|
|
|
|
errorByte = errorChs.error;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!error)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(cmdDuration >= 500)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
F += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 150)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
E += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 50)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
D += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 10)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
C += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 3)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
B += blocksToRead;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
A += blocksToRead;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
mhddLog.Write(currentBlock, cmdDuration);
|
|
|
|
|
|
ibgLog.Write(currentBlock, currentSpeed * 1024);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
DicConsole.DebugWriteLine("Media-Scan", "ATA ERROR: {0} STATUS: {1}", errorByte, status);
|
|
|
|
|
|
errored += blocksToRead;
|
|
|
|
|
|
unreadableSectors.Add(currentBlock);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(cmdDuration < 500)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
mhddLog.Write(currentBlock, 65535);
|
|
|
|
|
|
else
|
|
|
|
|
|
mhddLog.Write(currentBlock, cmdDuration);
|
|
|
|
|
|
|
|
|
|
|
|
ibgLog.Write(currentBlock, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-10 03:00:39 +00:00
|
|
|
|
currentSpeed = ((double)blockSize / (double)1048576) / (cmdDuration / (double)1000);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-10 03:00:39 +00:00
|
|
|
|
GC.Collect();
|
|
|
|
|
|
|
|
|
|
|
|
currentBlock++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
end = DateTime.UtcNow;
|
|
|
|
|
|
DicConsole.WriteLine();
|
|
|
|
|
|
mhddLog.Close();
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-10 03:00:39 +00:00
|
|
|
|
ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, (((double)blockSize * (double)(blocks + 1)) / 1024) / (totalDuration / 1000), devicePath);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-10 03:00:39 +00:00
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(Seek)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
for(int i = 0; i < seekTimes; i++)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(aborted)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
break;
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
seekCy = (ushort)rnd.Next(cylinders);
|
|
|
|
|
|
seekHd = (byte)rnd.Next(heads);
|
|
|
|
|
|
seekSc = (byte)rnd.Next(sectors);
|
2016-02-10 03:00:39 +00:00
|
|
|
|
|
|
|
|
|
|
DicConsole.Write("\rSeeking to cylinder {0}, head {1}, sector {2}...\t\t", seekCy, seekHd, seekSc);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(Seek)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
dev.Seek(out errorChs, seekCy, seekHd, seekSc, timeout, out seekCur);
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(seekCur > seekMax && seekCur != 0)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
seekMax = seekCur;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(seekCur < seekMin && seekCur != 0)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
seekMin = seekCur;
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator
|
2016-02-10 03:00:39 +00:00
|
|
|
|
|
|
|
|
|
|
seekTotal += seekCur;
|
|
|
|
|
|
GC.Collect();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DicConsole.WriteLine();
|
|
|
|
|
|
|
|
|
|
|
|
DicConsole.WriteLine("Took a total of {0} seconds ({1} processing commands).", (end - start).TotalSeconds, totalDuration / 1000);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Avegare speed: {0:F3} MiB/sec.", (((double)blockSize * (double)(blocks + 1)) / 1048576) / (totalDuration / 1000));
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Fastest speed burst: {0:F3} MiB/sec.", maxSpeed);
|
|
|
|
|
|
DicConsole.WriteLine("Slowest speed burst: {0:F3} MiB/sec.", minSpeed);
|
|
|
|
|
|
DicConsole.WriteLine("Summary:");
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took less than 3 ms.", A);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took less than 10 ms but more than 3 ms.", B);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took less than 50 ms but more than 10 ms.", C);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took less than 150 ms but more than 50 ms.", D);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took less than 500 ms but more than 150 ms.", E);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took more than 500 ms.", F);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors could not be read.", unreadableSectors.Count);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(unreadableSectors.Count > 0)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
foreach(ulong bad in unreadableSectors)
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Sector {0} could not be read", bad);
|
|
|
|
|
|
}
|
|
|
|
|
|
DicConsole.WriteLine();
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(seekTotal != 0 || seekMin != double.MaxValue || seekMax != double.MinValue)
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Testing {0} seeks, longest seek took {1:F3} ms, fastest one took {2:F3} ms. ({3:F3} ms average)",
|
|
|
|
|
|
seekTimes, seekMax, seekMin, seekTotal / 1000);
|
|
|
|
|
|
|
|
|
|
|
|
Core.Statistics.AddMediaScan((long)A, (long)B, (long)C, (long)D, (long)E, (long)F, (long)blocks, (long)errored, (long)(blocks - errored));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Unable to communicate with ATA device.");
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
static void doNVMeMediaScan(string MHDDLogPath, string IBGLogPath, string devicePath, Device dev)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
throw new NotImplementedException("NVMe devices not yet supported.");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
static void doSDMediaScan(string MHDDLogPath, string IBGLogPath, string devicePath, Device dev)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
throw new NotImplementedException("MMC/SD devices not yet supported.");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
static void doSCSIMediaScan(string MHDDLogPath, string IBGLogPath, string devicePath, Device dev)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
byte[] cmdBuf;
|
|
|
|
|
|
byte[] senseBuf;
|
|
|
|
|
|
bool sense = false;
|
|
|
|
|
|
double duration;
|
|
|
|
|
|
ulong blocks = 0;
|
|
|
|
|
|
uint blockSize = 0;
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
ushort currentProfile = 0x0001;
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(dev.IsRemovable)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(sense)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
Decoders.SCSI.FixedSense? decSense = Decoders.SCSI.Sense.DecodeFixed(senseBuf);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(decSense.HasValue)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(decSense.Value.ASC == 0x3A)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
int leftRetries = 5;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
while(leftRetries > 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.WriteLine("\rWaiting for drive to become ready");
|
|
|
|
|
|
System.Threading.Thread.Sleep(2000);
|
|
|
|
|
|
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!sense)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
leftRetries--;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(sense)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Please insert media in drive");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(decSense.Value.ASC == 0x04 && decSense.Value.ASCQ == 0x01)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
int leftRetries = 10;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
while(leftRetries > 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.WriteLine("\rWaiting for drive to become ready");
|
|
|
|
|
|
System.Threading.Thread.Sleep(2000);
|
|
|
|
|
|
sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!sense)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
leftRetries--;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(sense)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
if(dev.SCSIType == Decoders.SCSI.PeripheralDeviceTypes.DirectAccess ||
|
|
|
|
|
|
dev.SCSIType == Decoders.SCSI.PeripheralDeviceTypes.MultiMediaDevice ||
|
|
|
|
|
|
dev.SCSIType == Decoders.SCSI.PeripheralDeviceTypes.OCRWDevice ||
|
|
|
|
|
|
dev.SCSIType == Decoders.SCSI.PeripheralDeviceTypes.OpticalDevice ||
|
|
|
|
|
|
dev.SCSIType == Decoders.SCSI.PeripheralDeviceTypes.SimplifiedDevice ||
|
|
|
|
|
|
dev.SCSIType == Decoders.SCSI.PeripheralDeviceTypes.WriteOnceDevice)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadCapacity(out cmdBuf, out senseBuf, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!sense)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
blocks = (ulong)((cmdBuf[0] << 24) + (cmdBuf[1] << 16) + (cmdBuf[2] << 8) + (cmdBuf[3]));
|
|
|
|
|
|
blockSize = (uint)((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + (cmdBuf[7]));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(sense || blocks == 0xFFFFFFFF)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadCapacity16(out cmdBuf, out senseBuf, dev.Timeout, out duration);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(sense && blocks == 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
// Not all MMC devices support READ CAPACITY, as they have READ TOC
|
2016-07-28 22:25:26 +01:00
|
|
|
|
if(dev.SCSIType != Decoders.SCSI.PeripheralDeviceTypes.MultiMediaDevice)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Unable to get media capacity");
|
|
|
|
|
|
DicConsole.ErrorWriteLine("{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!sense)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
byte[] temp = new byte[8];
|
|
|
|
|
|
|
|
|
|
|
|
Array.Copy(cmdBuf, 0, temp, 0, 8);
|
|
|
|
|
|
Array.Reverse(temp);
|
|
|
|
|
|
blocks = BitConverter.ToUInt64(temp, 0);
|
|
|
|
|
|
blockSize = (uint)((cmdBuf[5] << 24) + (cmdBuf[5] << 16) + (cmdBuf[6] << 8) + (cmdBuf[7]));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(blocks != 0 && blockSize != 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
blocks++;
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Media has {0} blocks of {1} bytes/each. (for a total of {2} bytes)",
|
|
|
|
|
|
blocks, blockSize, blocks * (ulong)blockSize);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
if(dev.SCSIType == Decoders.SCSI.PeripheralDeviceTypes.SequentialAccess)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.WriteLine("Scanning will never be supported on SCSI Streaming Devices.");
|
|
|
|
|
|
DicConsole.WriteLine("It has no sense to do it, and it will put too much strain on the tape.");
|
|
|
|
|
|
return;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
}
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(blocks == 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Unable to read medium or empty medium present...");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool compactDisc = true;
|
|
|
|
|
|
Decoders.CD.FullTOC.CDFullTOC? toc = null;
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
if(dev.SCSIType == Decoders.SCSI.PeripheralDeviceTypes.MultiMediaDevice)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.GetConfiguration(out cmdBuf, out senseBuf, 0, MmcGetConfigurationRt.Current, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!sense)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
Decoders.SCSI.MMC.Features.SeparatedFeatures ftr = Decoders.SCSI.MMC.Features.Separate(cmdBuf);
|
|
|
|
|
|
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
currentProfile = ftr.CurrentProfile;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
switch(ftr.CurrentProfile)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
case 0x0005:
|
|
|
|
|
|
case 0x0008:
|
|
|
|
|
|
case 0x0009:
|
|
|
|
|
|
case 0x000A:
|
|
|
|
|
|
case 0x0020:
|
|
|
|
|
|
case 0x0021:
|
|
|
|
|
|
case 0x0022:
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
compactDisc = false;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(compactDisc)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
* DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs:
* DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
* DiscImageChef.Metadata/DeviceReport.cs:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DeviceReport.cs:
* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
Added command to guess drive and media parameters and output
an XML report of them.
* DiscImageChef/Commands/DumpMedia.cs:
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Core/Checksum.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Moved checksum generation to a separate class.
* CICMMetadata:
Added support for ADIP.
* DiscImageChef.CommonTypes/MediaType.cs:
Added parameters of UDO media.
Moved DataPlay outside of Iomega, as it's not from that
manufacturer.
Added missing Exatape media and corrected 160m XL one.
Added SyJet media.
Added all ECMA defined magneto-optical (sectors calculated
from specifications, unchecked).
Added PD media.
Added Imation 320Gb RDX.
Added generic USB flash drives.
* DiscImageChef.Decoders/SCSI/Enums.cs:
Make enumerations public.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
* DiscImageChef.Devices/Device/Constructor.cs:
Trim space padded strings on SCSI INQUIRY.
* DiscImageChef.Devices/Device/ScsiCommands/MMC.cs:
Added PREVENT ALLOW MEDIUM REMOVAL.
Added START STOP UNIT.
* DiscImageChef.Devices/Device/ScsiCommands/NEC.cs:
Rename NEC methods.
* DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs:
Corrected Pioneer transfer length calculation.
* DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs:
Renamed Plextor methods.
* DiscImageChef.Devices/Device/ScsiCommands/SPC.cs:
Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with
MMC same name but different command.
* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
Set platform target to x86 (does it really matter?).
* DiscImageChef.Devices/Linux/Command.cs:
Reduced allocation for readlink() to current kernel
MAX_PATH.
* DiscImageChef.Devices/Linux/Enums.cs:
Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves
commands not working on 32-bit environments.
* DiscImageChef.DiscImages/ZZZRawImage.cs:
Changed ECMA-184 and ECMA-183 enums.
* DiscImageChef.Metadata/Dimensions.cs:
Added all ECMA defined magneto-opticals.
Added PD media.
Added 320Gb RDX.
Corrected Exatape 160m XL.
Added Exatape 22m and 28m.
* DiscImageChef.Metadata/MediaType.cs:
Added 356mm magneto-optical media.
Changed ECMA-184 and ECMA-183 enums.
Added USB generic flash drive.
* DiscImageChef/Commands/DeviceInfo.cs:
Corrected SCSI INQUIRY naming.
Corrected SCSI MODE SENSE (6) parameters.
Reduced SCSI MODE SENSE timeout, some devices just get stuck
with unsupported MODE SENSE commanda and must be left to
timeout.
Changed FUJITSU vendor string comparison.
* DiscImageChef/Commands/MediaInfo.cs:
Added method to calculate MediaType from SCSI parameters
(mode, density, medium type, device type, etc).
Changed some error WriteLine() to debug ones. Too much
verbosity.
Added DVD media type decoding from PFI.
Found a drive that dumps ADIP, enabling it again (not
decoded).
* DiscImageChef/Commands/MediaScan.cs:
Added option to generate ImgBurn compatible log to
media-scan command.
* DiscImageChef/DiscImageChef.csproj:
Moved checksum generation to a separate class.
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Main.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
* DiscImageChef/Options.cs:
Added command to guess drive and media parameters and output
an XML report of them.
Added preliminary command to dump media. Only SCSI for now.
CDs and tapes are not supported. Errors are blalanty
ignored. Options are incomplete. Not yet usable.
Added option to generate ImgBurn compatible log to media-scan
command.
2016-01-31 08:05:56 +00:00
|
|
|
|
currentProfile = 0x0008;
|
2015-12-30 11:45:27 +00:00
|
|
|
|
// We discarded all discs that falsify a TOC before requesting a real TOC
|
|
|
|
|
|
// No TOC, no CD (or an empty one)
|
|
|
|
|
|
bool tocSense = dev.ReadRawToc(out cmdBuf, out senseBuf, 1, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!tocSense)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
toc = Decoders.CD.FullTOC.Decode(cmdBuf);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
compactDisc = false;
|
|
|
|
|
|
|
|
|
|
|
|
byte[] readBuffer;
|
* commandline:
* DiscImageChef.Settings/Settings.cs:
* DiscImageChef.Settings/docs/README.txt:
* DiscImageChef.Settings/packages.config:
* DiscImageChef.Settings/docs/LICENSE.txt:
* DiscImageChef.Settings/docs/ChangeLog.txt:
* DiscImageChef.Settings/docs/mono/index.xml:
* DiscImageChef.Settings/docs/html/index.html:
* DiscImageChef.Settings/Properties/AssemblyInfo.cs:
* DiscImageChef.Settings/DiscImageChef.Settings.csproj:
* DiscImageChef.Settings/docs/mono/ns-Claunia.PropertyList.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/UID.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/UID.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSSet.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/index.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSSet.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDate.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSData.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDate.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSData.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSArray.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSNumber.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSString.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSObject.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSArray.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSNumber.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSString.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSObject.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDictionary.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDictionary.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/XmlPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/XmlPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/ASCIIPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/ASCIIPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListParser.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListWriter.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListWriter.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListFormatException.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListFormatException.html:
Added supports for settings
* DiscImageChef/Commands/Configure.cs:
Added support for settings.
* DiscImageChef/Core/Statistics.cs:
* DiscImageChef/Commands/Verify.cs:
* DiscImageChef/Commands/Entropy.cs:
* DiscImageChef/Commands/Formats.cs:
* DiscImageChef/Commands/PrintHex.cs:
* DiscImageChef/Commands/MediaInfo.cs:
* DiscImageChef/Commands/Statistics.cs:
Added statistics.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
Corrected bug on inquiry decoding.
* DiscImageChef.Decoders/SCSI/Modes.cs:
Corrected bug on decoding mode page 2Ah without write
performance descriptors.
Corrected bug when there is a vendor page 0 in mode sense
decoding.
* DiscImageChef.Devices/Device/Constructor.cs:
Corrected detecting USB or FireWire attached CD/DVD/BD and
tape drives.
Try ATA identify on USB or FireWire that don't have SCSI
INQUIRY.
* DiscImageChef.DiscImages/CDRWin.cs:
Corrected CD-ROM XA vs CD-ROM detection.
* DiscImageChef.Partitions/AppleMap.cs:
Corrected big endian working.
Added debug output.
* DiscImageChef.sln:
Added supports for settings.
* DiscImageChef/Commands/Decode.cs:
* DiscImageChef/Commands/Analyze.cs:
* DiscImageChef/Commands/Compare.cs:
* DiscImageChef/Commands/Checksum.cs:
* DiscImageChef/Commands/Benchmark.cs:
* DiscImageChef/Commands/DeviceInfo.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Added statistics.
* DiscImageChef/Commands/DeviceReport.cs:
Added statistics.
Correct handling empty inquiry string fields.
Suppose it is not removable, til proved wrong.
Corrected MODE SENSE (6/10) detection and calling order.
If device is MMC type but reports neither mode page 2Ah
neither GET CONFIGURATION, try all CDs (old drives work like
that).
Try reading Lead-In and Lead-Out in Audio CD using Audio READ
CD commands.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Added support for DVD raw block (37856 bytes).
Check READ LONG up to 36 times the cooked block size. That
should be enough to detect huge blocked media (like DVD and
BD) without taking ages.
If READ LONG size had to be bruteforced, and debug is
activated, save the result.
* DiscImageChef/Commands/DumpMedia.cs:
Added statistics.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/Commands/MediaScan.cs:
Added statistics.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/DiscImageChef.csproj:
Added support for settings.
Added statistics.
* DiscImageChef/Main.cs:
* DiscImageChef/Options.cs:
Added support for settings.
Added statistics.
2016-02-03 18:58:11 +00:00
|
|
|
|
uint blocksToRead = 64;
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
|
|
|
|
|
ulong A = 0; // <3ms
|
|
|
|
|
|
ulong B = 0; // >=3ms, <10ms
|
|
|
|
|
|
ulong C = 0; // >=10ms, <50ms
|
|
|
|
|
|
ulong D = 0; // >=50ms, <150ms
|
|
|
|
|
|
ulong E = 0; // >=150ms, <500ms
|
|
|
|
|
|
ulong F = 0; // >=500ms
|
|
|
|
|
|
ulong errored = 0;
|
|
|
|
|
|
DateTime start;
|
|
|
|
|
|
DateTime end;
|
|
|
|
|
|
double totalDuration = 0;
|
|
|
|
|
|
double currentSpeed = 0;
|
|
|
|
|
|
double maxSpeed = double.MinValue;
|
|
|
|
|
|
double minSpeed = double.MaxValue;
|
|
|
|
|
|
List<ulong> unreadableSectors = new List<ulong>();
|
|
|
|
|
|
|
|
|
|
|
|
aborted = false;
|
|
|
|
|
|
System.Console.CancelKeyPress += (sender, e) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
e.Cancel = aborted = true;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
bool read6 = false, read10 = false, read12 = false, read16 = false, readcd;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(compactDisc)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(toc == null)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Error trying to decode TOC...");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
readcd = !dev.ReadCd(out readBuffer, out senseBuf, 0, 2352, 1, MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders,
|
|
|
|
|
|
true, true, MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out duration);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(readcd)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Using MMC READ CD command.");
|
|
|
|
|
|
|
|
|
|
|
|
start = DateTime.UtcNow;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
while(true)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(readcd)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadCd(out readBuffer, out senseBuf, 0, 2352, blocksToRead, MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders,
|
|
|
|
|
|
true, true, MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(dev.Error)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
blocksToRead /= 2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!dev.Error || blocksToRead == 1)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(dev.Error)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Device error {0} trying to guess ideal transfer length.", dev.LastError);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DicConsole.WriteLine("Reading {0} sectors at a time.", blocksToRead);
|
|
|
|
|
|
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog = new Core.MHDDLog(MHDDLogPath, dev, blocks, blockSize, blocksToRead);
|
|
|
|
|
|
ibgLog = new Core.IBGLog(IBGLogPath, currentProfile);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
for(ulong i = 0; i < blocks; i += blocksToRead)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(aborted)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
double cmdDuration = 0;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((blocks - i) < blocksToRead)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
blocksToRead = (uint)(blocks - i);
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(currentSpeed > maxSpeed && currentSpeed != 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
maxSpeed = currentSpeed;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(currentSpeed < minSpeed && currentSpeed != 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
minSpeed = currentSpeed;
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
|
|
|
|
|
DicConsole.Write("\rReading sector {0} of {1} ({2:F3} MiB/sec.)", i, blocks, currentSpeed);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(readcd)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.ReadCd(out readBuffer, out senseBuf, (uint)i, 2352, blocksToRead, MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders,
|
|
|
|
|
|
true, true, MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out cmdDuration);
|
|
|
|
|
|
totalDuration += cmdDuration;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!sense)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(cmdDuration >= 500)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
F += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 150)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
E += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 50)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
D += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 10)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
C += blocksToRead;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 3)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
B += blocksToRead;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
A += blocksToRead;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog.Write(i, cmdDuration);
|
|
|
|
|
|
ibgLog.Write(i, currentSpeed * 1024);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
DicConsole.DebugWriteLine("Media-Scan", "READ CD error:\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
|
|
|
|
|
|
|
|
|
|
|
|
Decoders.SCSI.FixedSense? senseDecoded = Decoders.SCSI.Sense.DecodeFixed(senseBuf);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(senseDecoded.HasValue)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
// TODO: This error happens when changing from track type afaik. Need to solve that more cleanly
|
|
|
|
|
|
// LOGICAL BLOCK ADDRESS OUT OF RANGE
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((senseDecoded.Value.ASC != 0x21 || senseDecoded.Value.ASCQ != 0x00) &&
|
2015-12-30 11:45:27 +00:00
|
|
|
|
// ILLEGAL MODE FOR THIS TRACK (requesting sectors as-is, this is a firmware misconception when audio sectors
|
|
|
|
|
|
// are in a track where subchannel indicates data)
|
|
|
|
|
|
(senseDecoded.Value.ASC != 0x64 || senseDecoded.Value.ASCQ != 0x00))
|
|
|
|
|
|
{
|
|
|
|
|
|
errored += blocksToRead;
|
|
|
|
|
|
unreadableSectors.Add(i);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(cmdDuration < 500)
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog.Write(i, 65535);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
else
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog.Write(i, cmdDuration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2016-02-04 17:12:35 +00:00
|
|
|
|
ibgLog.Write(i, 0);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
errored += blocksToRead;
|
|
|
|
|
|
unreadableSectors.Add(i);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(cmdDuration < 500)
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog.Write(i, 65535);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
else
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog.Write(i, cmdDuration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2016-02-04 17:12:35 +00:00
|
|
|
|
ibgLog.Write(i, 0);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2015-12-30 11:45:27 +00:00
|
|
|
|
currentSpeed = ((double)blockSize * blocksToRead / (double)1048576) / (cmdDuration / (double)1000);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2015-12-30 11:45:27 +00:00
|
|
|
|
GC.Collect();
|
|
|
|
|
|
}
|
|
|
|
|
|
end = DateTime.UtcNow;
|
|
|
|
|
|
DicConsole.WriteLine();
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog.Close();
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-04 17:12:35 +00:00
|
|
|
|
ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, (((double)blockSize * (double)(blocks + 1)) / 1024) / (totalDuration / 1000), devicePath);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
read6 = !dev.Read6(out readBuffer, out senseBuf, 0, blockSize, dev.Timeout, out duration);
|
|
|
|
|
|
|
|
|
|
|
|
read10 = !dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, 1, dev.Timeout, out duration);
|
|
|
|
|
|
|
|
|
|
|
|
read12 = !dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, 1, false, dev.Timeout, out duration);
|
|
|
|
|
|
|
|
|
|
|
|
read16 = !dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, 0, blockSize, 0, 1, false, dev.Timeout, out duration);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!read6 && !read10 && !read12 && !read16)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Cannot read medium, aborting scan...");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(read6 && !read10 && !read12 && !read16 && blocks > (0x001FFFFF + 1))
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Device only supports SCSI READ (6) but has more than {0} blocks ({1} blocks total)", 0x001FFFFF + 1, blocks);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
if(!read16 && blocks > 0xFFFFFFFFL + 1L)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-07-28 22:25:26 +01:00
|
|
|
|
DicConsole.ErrorWriteLine("Device only supports SCSI READ (10) but has more than {0} blocks ({1} blocks total)", 0xFFFFFFFFL + 1L, blocks);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(read16)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Using SCSI READ (16) command.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read12)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Using SCSI READ (12) command.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read10)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Using SCSI READ (10) command.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read6)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Using SCSI READ (6) command.");
|
|
|
|
|
|
|
|
|
|
|
|
start = DateTime.UtcNow;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
while(true)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(read16)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, 0, blockSize, 0, blocksToRead, false, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(dev.Error)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
blocksToRead /= 2;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read12)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, 0, blockSize, 0, blocksToRead, false, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(dev.Error)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
blocksToRead /= 2;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read10)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, (ushort)blocksToRead, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(dev.Error)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
blocksToRead /= 2;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read6)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read6(out readBuffer, out senseBuf, 0, blockSize, (byte)blocksToRead, dev.Timeout, out duration);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(dev.Error)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
blocksToRead /= 2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!dev.Error || blocksToRead == 1)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(dev.Error)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
DicConsole.ErrorWriteLine("Device error {0} trying to guess ideal transfer length.", dev.LastError);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DicConsole.WriteLine("Reading {0} sectors at a time.", blocksToRead);
|
|
|
|
|
|
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog = new Core.MHDDLog(MHDDLogPath, dev, blocks, blockSize, blocksToRead);
|
|
|
|
|
|
ibgLog = new Core.IBGLog(IBGLogPath, currentProfile);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
for(ulong i = 0; i < blocks; i += blocksToRead)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(aborted)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
double cmdDuration = 0;
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if((blocks - i) < blocksToRead)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
blocksToRead = (uint)(blocks - i);
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(currentSpeed > maxSpeed && currentSpeed != 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
maxSpeed = currentSpeed;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(currentSpeed < minSpeed && currentSpeed != 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
minSpeed = currentSpeed;
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
|
|
|
|
|
DicConsole.Write("\rReading sector {0} of {1} ({2:F3} MiB/sec.)", i, blocks, currentSpeed);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(read16)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, i, blockSize, 0, blocksToRead, false, dev.Timeout, out cmdDuration);
|
|
|
|
|
|
totalDuration += cmdDuration;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read12)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)i, blockSize, 0, blocksToRead, false, dev.Timeout, out cmdDuration);
|
|
|
|
|
|
totalDuration += cmdDuration;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read10)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, (uint)i, blockSize, 0, (ushort)blocksToRead, dev.Timeout, out cmdDuration);
|
|
|
|
|
|
totalDuration += cmdDuration;
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read6)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
sense = dev.Read6(out readBuffer, out senseBuf, (uint)i, blockSize, (byte)blocksToRead, dev.Timeout, out cmdDuration);
|
|
|
|
|
|
totalDuration += cmdDuration;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(!sense && !dev.Error)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(cmdDuration >= 500)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
F += blocksToRead;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 150)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
E += blocksToRead;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 50)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
D += blocksToRead;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 10)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
C += blocksToRead;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(cmdDuration >= 3)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
B += blocksToRead;
|
|
|
|
|
|
else
|
|
|
|
|
|
A += blocksToRead;
|
|
|
|
|
|
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog.Write(i, cmdDuration);
|
|
|
|
|
|
ibgLog.Write(i, currentSpeed * 1024);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
// TODO: Separate errors on kind of errors.
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
errored += blocksToRead;
|
|
|
|
|
|
unreadableSectors.Add(i);
|
|
|
|
|
|
DicConsole.DebugWriteLine("Media-Scan", "READ error:\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(cmdDuration < 500)
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog.Write(i, 65535);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
else
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog.Write(i, cmdDuration);
|
|
|
|
|
|
ibgLog.Write(i, 0);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2015-12-30 11:45:27 +00:00
|
|
|
|
currentSpeed = ((double)blockSize * blocksToRead / (double)1048576) / (cmdDuration / (double)1000);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
2016-07-28 22:25:26 +01:00
|
|
|
|
|
2015-12-30 11:45:27 +00:00
|
|
|
|
end = DateTime.UtcNow;
|
|
|
|
|
|
DicConsole.WriteLine();
|
2016-02-04 17:12:35 +00:00
|
|
|
|
mhddLog.Close();
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2016-02-04 17:12:35 +00:00
|
|
|
|
ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, (((double)blockSize * (double)(blocks + 1)) / 1024) / (totalDuration / 1000), devicePath);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool seek6, seek10;
|
|
|
|
|
|
|
|
|
|
|
|
seek6 = !dev.Seek6(out senseBuf, 0, dev.Timeout, out duration);
|
|
|
|
|
|
|
|
|
|
|
|
seek10 = !dev.Seek10(out senseBuf, 0, dev.Timeout, out duration);
|
|
|
|
|
|
|
|
|
|
|
|
double seekMax = double.MinValue;
|
|
|
|
|
|
double seekMin = double.MaxValue;
|
|
|
|
|
|
double seekTotal = 0;
|
|
|
|
|
|
const int seekTimes = 1000;
|
|
|
|
|
|
|
|
|
|
|
|
double seekCur = 0;
|
|
|
|
|
|
|
|
|
|
|
|
Random rnd = new Random();
|
|
|
|
|
|
|
|
|
|
|
|
uint seekPos = (uint)rnd.Next((int)blocks);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(seek6)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
dev.Seek6(out senseBuf, seekPos, dev.Timeout, out seekCur);
|
|
|
|
|
|
DicConsole.WriteLine("Using SCSI SEEK (6) command.");
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(seek10)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
dev.Seek10(out senseBuf, seekPos, dev.Timeout, out seekCur);
|
|
|
|
|
|
DicConsole.WriteLine("Using SCSI SEEK (10) command.");
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(read16)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Using SCSI READ (16) command for seeking.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read12)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Using SCSI READ (12) command for seeking.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read10)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Using SCSI READ (10) command for seeking.");
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read6)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Using SCSI READ (6) command for seeking.");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
for(int i = 0; i < seekTimes; i++)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(aborted)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
break;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
|
2015-12-30 11:45:27 +00:00
|
|
|
|
seekPos = (uint)rnd.Next((int)blocks);
|
|
|
|
|
|
|
|
|
|
|
|
DicConsole.Write("\rSeeking to sector {0}...\t\t", seekPos);
|
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(seek6)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
dev.Seek6(out senseBuf, seekPos, dev.Timeout, out seekCur);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(seek10)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
dev.Seek10(out senseBuf, seekPos, dev.Timeout, out seekCur);
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(read16)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
dev.Read16(out readBuffer, out senseBuf, 0, false, true, false, seekPos, blockSize, 0, 1, false, dev.Timeout, out seekCur);
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read12)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, seekPos, blockSize, 0, 1, false, dev.Timeout, out seekCur);
|
|
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read10)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-07-28 22:25:26 +01:00
|
|
|
|
dev.Read10(out readBuffer, out senseBuf, 0, false, true, false, false, seekPos, blockSize, 0, 1, dev.Timeout, out seekCur);
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
2016-04-19 02:11:47 +01:00
|
|
|
|
else if(read6)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
|
|
|
|
|
dev.Read6(out readBuffer, out senseBuf, seekPos, blockSize, 1, dev.Timeout, out seekCur);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(seekCur > seekMax && seekCur != 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
seekMax = seekCur;
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(seekCur < seekMin && seekCur != 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
seekMin = seekCur;
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator
|
2015-12-30 11:45:27 +00:00
|
|
|
|
|
|
|
|
|
|
seekTotal += seekCur;
|
|
|
|
|
|
GC.Collect();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DicConsole.WriteLine();
|
|
|
|
|
|
|
|
|
|
|
|
DicConsole.WriteLine("Took a total of {0} seconds ({1} processing commands).", (end - start).TotalSeconds, totalDuration / 1000);
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable IDE0004 // Without this specific cast, it gives incorrect values
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Avegare speed: {0:F3} MiB/sec.", (((double)blockSize * (double)(blocks + 1)) / 1048576) / (totalDuration / 1000));
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore IDE0004 // Without this specific cast, it gives incorrect values
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Fastest speed burst: {0:F3} MiB/sec.", maxSpeed);
|
|
|
|
|
|
DicConsole.WriteLine("Slowest speed burst: {0:F3} MiB/sec.", minSpeed);
|
|
|
|
|
|
DicConsole.WriteLine("Summary:");
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took less than 3 ms.", A);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took less than 10 ms but more than 3 ms.", B);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took less than 50 ms but more than 10 ms.", C);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took less than 150 ms but more than 50 ms.", D);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took less than 500 ms but more than 150 ms.", E);
|
|
|
|
|
|
DicConsole.WriteLine("{0} sectors took more than 500 ms.", F);
|
2016-02-04 17:12:35 +00:00
|
|
|
|
DicConsole.WriteLine("{0} sectors could not be read.", unreadableSectors.Count);
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(unreadableSectors.Count > 0)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
{
|
2016-04-19 02:11:47 +01:00
|
|
|
|
foreach(ulong bad in unreadableSectors)
|
2015-12-30 11:45:27 +00:00
|
|
|
|
DicConsole.WriteLine("Sector {0} could not be read", bad);
|
|
|
|
|
|
}
|
|
|
|
|
|
DicConsole.WriteLine();
|
|
|
|
|
|
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
2016-04-19 02:11:47 +01:00
|
|
|
|
if(seekTotal != 0 || seekMin != double.MaxValue || seekMax != double.MinValue)
|
2016-07-28 22:25:26 +01:00
|
|
|
|
#pragma warning restore RECS0018 // Comparison of floating point numbers with equality operator
|
2016-02-10 03:00:39 +00:00
|
|
|
|
DicConsole.WriteLine("Testing {0} seeks, longest seek took {1:F3} ms, fastest one took {2:F3} ms. ({3:F3} ms average)",
|
2015-12-30 11:45:27 +00:00
|
|
|
|
seekTimes, seekMax, seekMin, seekTotal / 1000);
|
* commandline:
* DiscImageChef.Settings/Settings.cs:
* DiscImageChef.Settings/docs/README.txt:
* DiscImageChef.Settings/packages.config:
* DiscImageChef.Settings/docs/LICENSE.txt:
* DiscImageChef.Settings/docs/ChangeLog.txt:
* DiscImageChef.Settings/docs/mono/index.xml:
* DiscImageChef.Settings/docs/html/index.html:
* DiscImageChef.Settings/Properties/AssemblyInfo.cs:
* DiscImageChef.Settings/DiscImageChef.Settings.csproj:
* DiscImageChef.Settings/docs/mono/ns-Claunia.PropertyList.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/UID.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/UID.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSSet.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/index.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSSet.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDate.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSData.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDate.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSData.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSArray.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSNumber.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSString.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSObject.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSArray.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSNumber.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSString.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSObject.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/NSDictionary.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/NSDictionary.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/XmlPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/XmlPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/ASCIIPropertyListParser.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/ASCIIPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListParser.xml:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/BinaryPropertyListWriter.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListWriter.html:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/BinaryPropertyListParser.html:
* DiscImageChef.Settings/docs/mono/Claunia.PropertyList/PropertyListFormatException.xml:
* DiscImageChef.Settings/docs/html/Claunia.PropertyList/PropertyListFormatException.html:
Added supports for settings
* DiscImageChef/Commands/Configure.cs:
Added support for settings.
* DiscImageChef/Core/Statistics.cs:
* DiscImageChef/Commands/Verify.cs:
* DiscImageChef/Commands/Entropy.cs:
* DiscImageChef/Commands/Formats.cs:
* DiscImageChef/Commands/PrintHex.cs:
* DiscImageChef/Commands/MediaInfo.cs:
* DiscImageChef/Commands/Statistics.cs:
Added statistics.
* DiscImageChef.Decoders/SCSI/Inquiry.cs:
Corrected bug on inquiry decoding.
* DiscImageChef.Decoders/SCSI/Modes.cs:
Corrected bug on decoding mode page 2Ah without write
performance descriptors.
Corrected bug when there is a vendor page 0 in mode sense
decoding.
* DiscImageChef.Devices/Device/Constructor.cs:
Corrected detecting USB or FireWire attached CD/DVD/BD and
tape drives.
Try ATA identify on USB or FireWire that don't have SCSI
INQUIRY.
* DiscImageChef.DiscImages/CDRWin.cs:
Corrected CD-ROM XA vs CD-ROM detection.
* DiscImageChef.Partitions/AppleMap.cs:
Corrected big endian working.
Added debug output.
* DiscImageChef.sln:
Added supports for settings.
* DiscImageChef/Commands/Decode.cs:
* DiscImageChef/Commands/Analyze.cs:
* DiscImageChef/Commands/Compare.cs:
* DiscImageChef/Commands/Checksum.cs:
* DiscImageChef/Commands/Benchmark.cs:
* DiscImageChef/Commands/DeviceInfo.cs:
* DiscImageChef/Commands/CreateSidecar.cs:
Added statistics.
* DiscImageChef/Commands/DeviceReport.cs:
Added statistics.
Correct handling empty inquiry string fields.
Suppose it is not removable, til proved wrong.
Corrected MODE SENSE (6/10) detection and calling order.
If device is MMC type but reports neither mode page 2Ah
neither GET CONFIGURATION, try all CDs (old drives work like
that).
Try reading Lead-In and Lead-Out in Audio CD using Audio READ
CD commands.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Added support for DVD raw block (37856 bytes).
Check READ LONG up to 36 times the cooked block size. That
should be enough to detect huge blocked media (like DVD and
BD) without taking ages.
If READ LONG size had to be bruteforced, and debug is
activated, save the result.
* DiscImageChef/Commands/DumpMedia.cs:
Added statistics.
Corrected READ LONG information handling, some drives return
2s-complement in 32 bit. Upper 16 bits are ignored.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/Commands/MediaScan.cs:
Added statistics.
Start trying with 64 blocks at a time. Some drives report to
be able to read 255 at a time, but they really don't, they
take a lot longer to read.
* DiscImageChef/DiscImageChef.csproj:
Added support for settings.
Added statistics.
* DiscImageChef/Main.cs:
* DiscImageChef/Options.cs:
Added support for settings.
Added statistics.
2016-02-03 18:58:11 +00:00
|
|
|
|
|
|
|
|
|
|
Core.Statistics.AddMediaScan((long)A, (long)B, (long)C, (long)D, (long)E, (long)F, (long)blocks, (long)errored, (long)(blocks - errored));
|
2015-12-30 11:45:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|