diff --git a/DiscImageChef.Core/Devices/Dumping/Dump.cs b/DiscImageChef.Core/Devices/Dumping/Dump.cs
index ca9711a1f..9b5989818 100644
--- a/DiscImageChef.Core/Devices/Dumping/Dump.cs
+++ b/DiscImageChef.Core/Devices/Dumping/Dump.cs
@@ -117,7 +117,7 @@ namespace DiscImageChef.Core.Devices.Dumping
// Search for device in master database
_dbDev = _ctx.Devices.FirstOrDefault(d => d.Manufacturer == _dev.Manufacturer && d.Model == _dev.Model &&
- d.Revision == _dev.Revision);
+ d.Revision == _dev.FirmwareRevision);
if(_dbDev is null)
{
diff --git a/DiscImageChef.Core/Devices/Info/DeviceInfo.cs b/DiscImageChef.Core/Devices/Info/DeviceInfo.cs
index cdec2b07d..5dca4a493 100644
--- a/DiscImageChef.Core/Devices/Info/DeviceInfo.cs
+++ b/DiscImageChef.Core/Devices/Info/DeviceInfo.cs
@@ -47,7 +47,7 @@ namespace DiscImageChef.Core.Devices.Info
Type = dev.Type;
Manufacturer = dev.Manufacturer;
Model = dev.Model;
- Revision = dev.Revision;
+ FirmwareRevision = dev.FirmwareRevision;
Serial = dev.Serial;
ScsiType = dev.ScsiType;
IsRemovable = dev.IsRemovable;
@@ -77,23 +77,31 @@ namespace DiscImageChef.Core.Devices.Info
if(sense)
{
DicConsole.DebugWriteLine("Device-Info command", "STATUS = 0x{0:X2}", errorRegisters.Status);
- DicConsole.DebugWriteLine("Device-Info command", "ERROR = 0x{0:X2}", errorRegisters.Error);
+ DicConsole.DebugWriteLine("Device-Info command", "ERROR = 0x{0:X2}", errorRegisters.Error);
+
DicConsole.DebugWriteLine("Device-Info command", "NSECTOR = 0x{0:X2}",
errorRegisters.SectorCount);
+
DicConsole.DebugWriteLine("Device-Info command", "SECTOR = 0x{0:X2}", errorRegisters.Sector);
+
DicConsole.DebugWriteLine("Device-Info command", "CYLHIGH = 0x{0:X2}",
errorRegisters.CylinderHigh);
+
DicConsole.DebugWriteLine("Device-Info command", "CYLLOW = 0x{0:X2}",
errorRegisters.CylinderLow);
+
DicConsole.DebugWriteLine("Device-Info command", "DEVICE = 0x{0:X2}",
errorRegisters.DeviceHead);
+
DicConsole.DebugWriteLine("Device-Info command", "Error code = {0}", dev.LastError);
+
break;
}
if(dev.Error)
{
DicConsole.ErrorWriteLine("Error {0} querying ATA IDENTIFY", dev.LastError);
+
break;
}
@@ -101,7 +109,8 @@ namespace DiscImageChef.Core.Devices.Info
dev.EnableMediaCardPassThrough(out errorRegisters, dev.Timeout, out _);
- if(errorRegisters.Sector == 0xAA && errorRegisters.SectorCount == 0x55)
+ if(errorRegisters.Sector == 0xAA &&
+ errorRegisters.SectorCount == 0x55)
AtaMcptError = errorRegisters;
break;
@@ -114,22 +123,31 @@ namespace DiscImageChef.Core.Devices.Info
if(sense)
{
DicConsole.DebugWriteLine("Device-Info command", "STATUS = 0x{0:X2}", errorRegisters.Status);
- DicConsole.DebugWriteLine("Device-Info command", "ERROR = 0x{0:X2}", errorRegisters.Error);
+ DicConsole.DebugWriteLine("Device-Info command", "ERROR = 0x{0:X2}", errorRegisters.Error);
+
DicConsole.DebugWriteLine("Device-Info command", "NSECTOR = 0x{0:X2}",
errorRegisters.SectorCount);
+
DicConsole.DebugWriteLine("Device-Info command", "SECTOR = 0x{0:X2}", errorRegisters.Sector);
+
DicConsole.DebugWriteLine("Device-Info command", "CYLHIGH = 0x{0:X2}",
errorRegisters.CylinderHigh);
+
DicConsole.DebugWriteLine("Device-Info command", "CYLLOW = 0x{0:X2}",
errorRegisters.CylinderLow);
+
DicConsole.DebugWriteLine("Device-Info command", "DEVICE = 0x{0:X2}",
errorRegisters.DeviceHead);
+
DicConsole.DebugWriteLine("Device-Info command", "Error code = {0}", dev.LastError);
+
break;
}
- if(!dev.Error) AtapiIdentify = ataBuf;
- else DicConsole.ErrorWriteLine("Error {0} querying ATA PACKET IDENTIFY", dev.LastError);
+ if(!dev.Error)
+ AtapiIdentify = ataBuf;
+ else
+ DicConsole.ErrorWriteLine("Error {0} querying ATA PACKET IDENTIFY", dev.LastError);
// ATAPI devices are also SCSI devices
goto case DeviceType.SCSI;
@@ -142,6 +160,7 @@ namespace DiscImageChef.Core.Devices.Info
if(sense)
{
DicConsole.ErrorWriteLine("SCSI error:\n{0}", Sense.PrettifySense(senseBuf));
+
break;
}
@@ -160,50 +179,69 @@ namespace DiscImageChef.Core.Devices.Info
foreach(byte page in pages)
{
sense = dev.ScsiInquiry(out inqBuf, out senseBuf, page);
- if(sense) continue;
+
+ if(sense)
+ continue;
ScsiEvpdPages.Add(page, inqBuf);
}
}
- PeripheralDeviceTypes devType = (PeripheralDeviceTypes)ScsiInquiry.Value.PeripheralDeviceType;
+ var devType = (PeripheralDeviceTypes)ScsiInquiry.Value.PeripheralDeviceType;
sense = dev.ModeSense10(out byte[] modeBuf, out senseBuf, false, true,
ScsiModeSensePageControl.Current, 0x3F, 0xFF, 5, out _);
- if(!sense && !dev.Error) ScsiModeSense10 = modeBuf;
+ if(!sense &&
+ !dev.Error)
+ ScsiModeSense10 = modeBuf;
if(sense || dev.Error)
{
sense = dev.ModeSense10(out modeBuf, out senseBuf, false, true,
ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, out _);
- if(!sense && !dev.Error) ScsiModeSense10 = modeBuf;
+
+ if(!sense &&
+ !dev.Error)
+ ScsiModeSense10 = modeBuf;
}
- if(!sense && !dev.Error) ScsiMode = Modes.DecodeMode10(modeBuf, devType);
+ if(!sense &&
+ !dev.Error)
+ ScsiMode = Modes.DecodeMode10(modeBuf, devType);
bool useMode10 = !(sense || dev.Error || !ScsiMode.HasValue);
sense = dev.ModeSense6(out modeBuf, out senseBuf, false, ScsiModeSensePageControl.Current, 0x3F,
0xFF, 5, out _);
- if(!sense && !dev.Error) ScsiModeSense6 = modeBuf;
+ if(!sense &&
+ !dev.Error)
+ ScsiModeSense6 = modeBuf;
if(sense || dev.Error)
{
sense = dev.ModeSense6(out modeBuf, out senseBuf, false, ScsiModeSensePageControl.Current, 0x3F,
0x00, 5, out _);
- if(!sense && !dev.Error) ScsiModeSense6 = modeBuf;
+ if(!sense &&
+ !dev.Error)
+ ScsiModeSense6 = modeBuf;
}
if(sense || dev.Error)
{
sense = dev.ModeSense(out modeBuf, out senseBuf, 5, out _);
- if(!sense && !dev.Error) ScsiModeSense6 = modeBuf;
+
+ if(!sense &&
+ !dev.Error)
+ ScsiModeSense6 = modeBuf;
}
- if(!sense && !dev.Error && !useMode10) ScsiMode = Modes.DecodeMode6(modeBuf, devType);
+ if(!sense &&
+ !dev.Error &&
+ !useMode10)
+ ScsiMode = Modes.DecodeMode6(modeBuf, devType);
switch(devType)
{
@@ -211,7 +249,8 @@ namespace DiscImageChef.Core.Devices.Info
{
sense = dev.GetConfiguration(out byte[] confBuf, out senseBuf, dev.Timeout, out _);
- if(!sense) MmcConfiguration = confBuf;
+ if(!sense)
+ MmcConfiguration = confBuf;
// TODO: DVD drives respond correctly to BD status.
// While specification says if no medium is present
@@ -267,31 +306,37 @@ namespace DiscImageChef.Core.Devices.Info
switch(dev.Model)
{
- case "DVDR PX-708A":
- case "DVDR PX-708A2":
- case "DVDR PX-712A":
+ case"DVDR PX-708A":
+ case"DVDR PX-708A2":
+ case"DVDR PX-712A":
plxtDvd = true;
+
plxtSense = dev.PlextorReadEeprom(out plxtBuf, out senseBuf, dev.Timeout,
out _);
+
break;
- case "DVDR PX-714A":
- case "DVDR PX-716A":
- case "DVDR PX-716AL":
- case "DVDR PX-755A":
- case "DVDR PX-760A":
+ case"DVDR PX-714A":
+ case"DVDR PX-716A":
+ case"DVDR PX-716AL":
+ case"DVDR PX-755A":
+ case"DVDR PX-760A":
{
plxtBuf = new byte[256 * 4];
+
for(byte i = 0; i < 4; i++)
{
plxtSense = dev.PlextorReadEepromBlock(out byte[] plxtBufSmall,
out senseBuf, i, 256, dev.Timeout,
out _);
- if(plxtSense) break;
+
+ if(plxtSense)
+ break;
Array.Copy(plxtBufSmall, 0, plxtBuf, i * 256, 256);
}
plxtDvd = true;
+
break;
}
@@ -300,11 +345,15 @@ namespace DiscImageChef.Core.Devices.Info
if(dev.Model.StartsWith("CD-R ", StringComparison.Ordinal))
plxtSense = dev.PlextorReadEepromCdr(out plxtBuf, out senseBuf, dev.Timeout,
out _);
+
break;
}
}
- PlextorFeatures = new Plextor {IsDvd = plxtDvd};
+ PlextorFeatures = new Plextor
+ {
+ IsDvd = plxtDvd
+ };
if(!plxtSense)
{
@@ -328,6 +377,7 @@ namespace DiscImageChef.Core.Devices.Info
plxtSense = dev.PlextorGetPoweRec(out senseBuf, out bool plxtPwrRecEnabled,
out ushort plxtPwrRecSpeed, dev.Timeout, out _);
+
if(!plxtSense)
{
PlextorFeatures.PoweRec = true;
@@ -352,6 +402,7 @@ namespace DiscImageChef.Core.Devices.Info
// TODO: Check it with a drive
plxtSense = dev.PlextorGetSilentMode(out plxtBuf, out senseBuf, dev.Timeout, out _);
+
if(!plxtSense)
if(plxtBuf[0] == 1)
{
@@ -374,44 +425,68 @@ namespace DiscImageChef.Core.Devices.Info
}
plxtSense = dev.PlextorGetGigaRec(out plxtBuf, out senseBuf, dev.Timeout, out _);
- if(!plxtSense) PlextorFeatures.GigaRec = true;
+
+ if(!plxtSense)
+ PlextorFeatures.GigaRec = true;
plxtSense = dev.PlextorGetSecuRec(out plxtBuf, out senseBuf, dev.Timeout, out _);
- if(!plxtSense) PlextorFeatures.SecuRec = true;
+
+ if(!plxtSense)
+ PlextorFeatures.SecuRec = true;
plxtSense = dev.PlextorGetSpeedRead(out plxtBuf, out senseBuf, dev.Timeout, out _);
+
if(!plxtSense)
{
PlextorFeatures.SpeedRead = true;
- if((plxtBuf[2] & 0x01) == 0x01) PlextorFeatures.SpeedReadEnabled = true;
+
+ if((plxtBuf[2] & 0x01) == 0x01)
+ PlextorFeatures.SpeedReadEnabled = true;
}
plxtSense = dev.PlextorGetHiding(out plxtBuf, out senseBuf, dev.Timeout, out _);
+
if(!plxtSense)
{
PlextorFeatures.Hiding = true;
- if((plxtBuf[2] & 0x02) == 0x02) PlextorFeatures.HidesRecordables = true;
- if((plxtBuf[2] & 0x01) == 0x01) PlextorFeatures.HidesSessions = true;
+
+ if((plxtBuf[2] & 0x02) == 0x02)
+ PlextorFeatures.HidesRecordables = true;
+
+ if((plxtBuf[2] & 0x01) == 0x01)
+ PlextorFeatures.HidesSessions = true;
}
plxtSense = dev.PlextorGetVariRec(out plxtBuf, out senseBuf, false, dev.Timeout, out _);
- if(!plxtSense) PlextorFeatures.VariRec = true;
+
+ if(!plxtSense)
+ PlextorFeatures.VariRec = true;
if(plxtDvd)
{
plxtSense = dev.PlextorGetVariRec(out plxtBuf, out senseBuf, true, dev.Timeout,
out _);
- if(!plxtSense) PlextorFeatures.VariRecDvd = true;
+
+ if(!plxtSense)
+ PlextorFeatures.VariRecDvd = true;
plxtSense = dev.PlextorGetBitsetting(out plxtBuf, out senseBuf, false, dev.Timeout,
out _);
- if(!plxtSense) PlextorFeatures.BitSetting = true;
+
+ if(!plxtSense)
+ PlextorFeatures.BitSetting = true;
+
plxtSense = dev.PlextorGetBitsetting(out plxtBuf, out senseBuf, true, dev.Timeout,
out _);
- if(!plxtSense) PlextorFeatures.BitSettingDl = true;
+
+ if(!plxtSense)
+ PlextorFeatures.BitSettingDl = true;
+
plxtSense = dev.PlextorGetTestWriteDvdPlus(out plxtBuf, out senseBuf, dev.Timeout,
out _);
- if(!plxtSense) PlextorFeatures.DvdPlusWriteTest = true;
+
+ if(!plxtSense)
+ PlextorFeatures.DvdPlusWriteTest = true;
}
}
#endregion Plextor
@@ -420,17 +495,21 @@ namespace DiscImageChef.Core.Devices.Info
if(!dev.KreonGetFeatureList(out senseBuf, out KreonFeatures krFeatures, dev.Timeout,
out _))
KreonFeatures = krFeatures;
+
break;
}
case PeripheralDeviceTypes.SequentialAccess:
{
sense = dev.ReadBlockLimits(out byte[] seqBuf, out senseBuf, dev.Timeout, out _);
+
if(sense)
DicConsole.ErrorWriteLine("READ BLOCK LIMITS:\n{0}", Sense.PrettifySense(senseBuf));
- else BlockLimits = seqBuf;
+ else
+ BlockLimits = seqBuf;
sense = dev.ReportDensitySupport(out seqBuf, out senseBuf, dev.Timeout, out _);
+
if(sense)
DicConsole.ErrorWriteLine("REPORT DENSITY SUPPORT:\n{0}",
Sense.PrettifySense(senseBuf));
@@ -441,6 +520,7 @@ namespace DiscImageChef.Core.Devices.Info
}
sense = dev.ReportDensitySupport(out seqBuf, out senseBuf, true, false, dev.Timeout, out _);
+
if(sense)
DicConsole.ErrorWriteLine("REPORT DENSITY SUPPORT (MEDIUM):\n{0}",
Sense.PrettifySense(senseBuf));
@@ -459,36 +539,55 @@ namespace DiscImageChef.Core.Devices.Info
case DeviceType.MMC:
{
- bool sense = dev.ReadCid(out byte[] mmcBuf, out _, dev.Timeout, out _);
- if(!sense) CID = mmcBuf;
+ bool sense = dev.ReadCid(out byte[] mmcBuf, out _, dev.Timeout, out _);
+
+ if(!sense)
+ CID = mmcBuf;
sense = dev.ReadCsd(out mmcBuf, out _, dev.Timeout, out _);
- if(!sense) CSD = mmcBuf;
+
+ if(!sense)
+ CSD = mmcBuf;
sense = dev.ReadOcr(out mmcBuf, out _, dev.Timeout, out _);
- if(!sense) OCR = mmcBuf;
+
+ if(!sense)
+ OCR = mmcBuf;
sense = dev.ReadExtendedCsd(out mmcBuf, out _, dev.Timeout, out _);
- if(!sense) ExtendedCSD = mmcBuf;
+
+ if(!sense)
+ ExtendedCSD = mmcBuf;
}
+
break;
case DeviceType.SecureDigital:
{
- bool sense = dev.ReadCid(out byte[] sdBuf, out _, dev.Timeout, out _);
- if(!sense) CID = sdBuf;
+ bool sense = dev.ReadCid(out byte[] sdBuf, out _, dev.Timeout, out _);
+
+ if(!sense)
+ CID = sdBuf;
sense = dev.ReadCsd(out sdBuf, out _, dev.Timeout, out _);
- if(!sense) CSD = sdBuf;
+
+ if(!sense)
+ CSD = sdBuf;
sense = dev.ReadSdocr(out sdBuf, out _, dev.Timeout, out _);
- if(!sense) OCR = sdBuf;
+
+ if(!sense)
+ OCR = sdBuf;
sense = dev.ReadScr(out sdBuf, out _, dev.Timeout, out _);
- if(!sense) SCR = sdBuf;
+
+ if(!sense)
+ SCR = sdBuf;
}
+
break;
default:
DicConsole.ErrorWriteLine("Unknown device type {0}, cannot get information.", dev.Type);
+
break;
}
}
diff --git a/DiscImageChef.Core/Devices/Info/Properties.cs b/DiscImageChef.Core/Devices/Info/Properties.cs
index e27549109..3dd78b0cc 100644
--- a/DiscImageChef.Core/Devices/Info/Properties.cs
+++ b/DiscImageChef.Core/Devices/Info/Properties.cs
@@ -66,7 +66,7 @@ namespace DiscImageChef.Core.Devices.Info
public DeviceType Type { get; }
public string Manufacturer { get; }
public string Model { get; }
- public string Revision { get; }
+ public string FirmwareRevision { get; }
public string Serial { get; }
public PeripheralDeviceTypes ScsiType { get; }
public bool IsRemovable { get; }
diff --git a/DiscImageChef.Core/Logging/DumpLog.cs b/DiscImageChef.Core/Logging/DumpLog.cs
index 4260bf9a5..c73d64519 100644
--- a/DiscImageChef.Core/Logging/DumpLog.cs
+++ b/DiscImageChef.Core/Logging/DumpLog.cs
@@ -36,61 +36,67 @@ using System.Reflection;
using System.Runtime.InteropServices;
using DiscImageChef.CommonTypes.Interop;
using DiscImageChef.Devices;
+using PlatformID = DiscImageChef.CommonTypes.Interop.PlatformID;
using Version = DiscImageChef.CommonTypes.Interop.Version;
namespace DiscImageChef.Core.Logging
{
- ///
- /// Creates a dump log
- ///
+ /// Creates a dump log
public class DumpLog
{
- private readonly StreamWriter logSw;
+ readonly StreamWriter logSw;
- ///
- /// Initializes the dump log
- ///
+ /// Initializes the dump log
/// Output log file
/// Device
public DumpLog(string outputFile, Device dev)
{
- if (string.IsNullOrEmpty(outputFile)) return;
+ if(string.IsNullOrEmpty(outputFile))
+ return;
logSw = new StreamWriter(outputFile, true);
logSw.WriteLine("Start logging at {0}", DateTime.Now);
- var platId = DetectOS.GetRealPlatformID();
- var platVer = DetectOS.GetVersion();
+ PlatformID platId = DetectOS.GetRealPlatformID();
+ string platVer = DetectOS.GetVersion();
+
var assemblyVersion =
Attribute.GetCustomAttribute(typeof(DumpLog).Assembly, typeof(AssemblyInformationalVersionAttribute)) as
AssemblyInformationalVersionAttribute;
logSw.WriteLine("################# System information #################");
+
logSw.WriteLine("{0} {1} ({2}-bit)", DetectOS.GetPlatformName(platId, platVer), platVer,
- Environment.Is64BitOperatingSystem ? 64 : 32);
- if (DetectOS.IsMono) logSw.WriteLine("Mono {0}", Version.GetMonoVersion());
- else if (DetectOS.IsNetCore) logSw.WriteLine(".NET Core {0}", Version.GetNetCoreVersion());
- else logSw.WriteLine(RuntimeInformation.FrameworkDescription);
+ Environment.Is64BitOperatingSystem ? 64 : 32);
+
+ if(DetectOS.IsMono)
+ logSw.WriteLine("Mono {0}", Version.GetMonoVersion());
+ else if(DetectOS.IsNetCore)
+ logSw.WriteLine(".NET Core {0}", Version.GetNetCoreVersion());
+ else
+ logSw.WriteLine(RuntimeInformation.FrameworkDescription);
logSw.WriteLine();
logSw.WriteLine("################# Program information ################");
logSw.WriteLine("DiscImageChef {0}", assemblyVersion?.InformationalVersion);
logSw.WriteLine("Running in {0}-bit", Environment.Is64BitProcess ? 64 : 32);
-#if DEBUG
+ #if DEBUG
logSw.WriteLine("DEBUG version");
-#endif
+ #endif
logSw.WriteLine("Command line: {0}", Environment.CommandLine);
logSw.WriteLine();
- if (dev.IsRemote)
+ if(dev.IsRemote)
{
logSw.WriteLine("################# Remote information #################");
logSw.WriteLine("Server: {0}", dev.RemoteApplication);
logSw.WriteLine("Version: {0}", dev.RemoteVersion);
+
logSw.WriteLine("Operating system: {0} {1}", dev.RemoteOperatingSystem,
- dev.RemoteOperatingSystemVersion);
+ dev.RemoteOperatingSystemVersion);
+
logSw.WriteLine("Architecture: {0}", dev.RemoteArchitecture);
logSw.WriteLine("Protocol version: {0}", dev.RemoteProtocolVersion);
logSw.WriteLine("######################################################");
@@ -99,14 +105,15 @@ namespace DiscImageChef.Core.Logging
logSw.WriteLine("################# Device information #################");
logSw.WriteLine("Manufacturer: {0}", dev.Manufacturer);
logSw.WriteLine("Model: {0}", dev.Model);
- logSw.WriteLine("Firmware revision: {0}", dev.Revision);
+ logSw.WriteLine("Firmware revision: {0}", dev.FirmwareRevision);
logSw.WriteLine("Serial number: {0}", dev.Serial);
logSw.WriteLine("Removable device: {0}", dev.IsRemovable);
logSw.WriteLine("Device type: {0}", dev.Type);
logSw.WriteLine("CompactFlash device: {0}", dev.IsCompactFlash);
logSw.WriteLine("PCMCIA device: {0}", dev.IsPcmcia);
logSw.WriteLine("USB device: {0}", dev.IsUsb);
- if (dev.IsUsb)
+
+ if(dev.IsUsb)
{
logSw.WriteLine("USB manufacturer: {0}", dev.UsbManufacturerString);
logSw.WriteLine("USB product: {0}", dev.UsbProductString);
@@ -116,7 +123,8 @@ namespace DiscImageChef.Core.Logging
}
logSw.WriteLine("FireWire device: {0}", dev.IsFireWire);
- if (dev.IsFireWire)
+
+ if(dev.IsFireWire)
{
logSw.WriteLine("FireWire vendor: {0}", dev.FireWireVendorName);
logSw.WriteLine("FireWire model: {0}", dev.FireWireModelName);
@@ -132,23 +140,20 @@ namespace DiscImageChef.Core.Logging
logSw.Flush();
}
- ///
- /// Adds a new line to the dump log
- ///
+ /// Adds a new line to the dump log
/// Format string
/// Arguments
public void WriteLine(string format, params object[] args)
{
- if (logSw == null) return;
+ if(logSw == null)
+ return;
- var text = string.Format(format, args);
+ string text = string.Format(format, args);
logSw.WriteLine("{0:s} {1}", DateTime.Now, text);
logSw.Flush();
}
- ///
- /// Finishes and closes the dump log
- ///
+ /// Finishes and closes the dump log
public void Close()
{
logSw?.WriteLine("######################################################");
diff --git a/DiscImageChef.Core/Logging/IBGLog.cs b/DiscImageChef.Core/Logging/IBGLog.cs
index fc41b4fe4..63b36e061 100644
--- a/DiscImageChef.Core/Logging/IBGLog.cs
+++ b/DiscImageChef.Core/Logging/IBGLog.cs
@@ -38,33 +38,30 @@ using DiscImageChef.Devices;
namespace DiscImageChef.Core.Logging
{
- ///
- /// Implements a log in the format used by IMGBurn
- ///
- class IbgLog
+ /// Implements a log in the format used by IMGBurn
+ internal class IbgLog
{
readonly CultureInfo ibgCulture;
- DateTime ibgDatePoint;
readonly double ibgDivider;
+ readonly string ibgMediaType;
+ readonly StringBuilder ibgSb;
+ readonly string logFile;
+ DateTime ibgDatePoint;
ulong ibgIntSector;
double ibgIntSpeed;
double ibgMaxSpeed;
- readonly string ibgMediaType;
int ibgSampleRate;
- readonly StringBuilder ibgSb;
int ibgSnaps;
bool ibgStartSet;
double ibgStartSpeed;
- readonly string logFile;
- ///
- /// Initializes the IMGBurn log
- ///
+ /// Initializes the IMGBurn log
/// Log file
/// Profile as defined by SCSI MultiMedia Commands specification
internal IbgLog(string outputFile, ushort currentProfile)
{
- if(string.IsNullOrEmpty(outputFile)) return;
+ if(string.IsNullOrEmpty(outputFile))
+ return;
logFile = outputFile;
ibgSb = new StringBuilder();
@@ -81,153 +78,186 @@ namespace DiscImageChef.Core.Logging
case 0x0001:
ibgMediaType = "HDD";
ibgDivider = 1353;
+
break;
case 0x0002:
ibgMediaType = "PD-650";
ibgDivider = 150;
+
break;
case 0x0005:
ibgMediaType = "CD-MO";
ibgDivider = 150;
+
break;
case 0x0008:
ibgMediaType = "CD-ROM";
ibgDivider = 150;
+
break;
case 0x0009:
ibgMediaType = "CD-R";
ibgDivider = 150;
+
break;
case 0x000A:
ibgMediaType = "CD-RW";
ibgDivider = 150;
+
break;
case 0x0010:
ibgMediaType = "DVD-ROM";
ibgDivider = 1353;
+
break;
case 0x0011:
ibgMediaType = "DVD-R";
ibgDivider = 1353;
+
break;
case 0x0012:
ibgMediaType = "DVD-RAM";
ibgDivider = 1353;
+
break;
case 0x0013:
case 0x0014:
ibgMediaType = "DVD-RW";
ibgDivider = 1353;
+
break;
case 0x0015:
case 0x0016:
ibgMediaType = "DVD-R DL";
ibgDivider = 1353;
+
break;
case 0x0017:
ibgMediaType = "DVD-RW DL";
ibgDivider = 1353;
+
break;
case 0x0018:
ibgMediaType = "DVD-Download";
ibgDivider = 1353;
+
break;
case 0x001A:
ibgMediaType = "DVD+RW";
ibgDivider = 1353;
+
break;
case 0x001B:
ibgMediaType = "DVD+R";
ibgDivider = 1353;
+
break;
case 0x0020:
ibgMediaType = "DDCD-ROM";
ibgDivider = 150;
+
break;
case 0x0021:
ibgMediaType = "DDCD-R";
ibgDivider = 150;
+
break;
case 0x0022:
ibgMediaType = "DDCD-RW";
ibgDivider = 150;
+
break;
case 0x002A:
ibgMediaType = "DVD+RW DL";
ibgDivider = 1353;
+
break;
case 0x002B:
ibgMediaType = "DVD+R DL";
ibgDivider = 1353;
+
break;
case 0x0040:
ibgMediaType = "BD-ROM";
ibgDivider = 4500;
+
break;
case 0x0041:
case 0x0042:
ibgMediaType = "BD-R";
ibgDivider = 4500;
+
break;
case 0x0043:
ibgMediaType = "BD-RE";
ibgDivider = 4500;
+
break;
case 0x0050:
ibgMediaType = "HD DVD-ROM";
ibgDivider = 4500;
+
break;
case 0x0051:
ibgMediaType = "HD DVD-R";
ibgDivider = 4500;
+
break;
case 0x0052:
ibgMediaType = "HD DVD-RAM";
ibgDivider = 4500;
+
break;
case 0x0053:
ibgMediaType = "HD DVD-RW";
ibgDivider = 4500;
+
break;
case 0x0058:
ibgMediaType = "HD DVD-R DL";
ibgDivider = 4500;
+
break;
case 0x005A:
ibgMediaType = "HD DVD-RW DL";
ibgDivider = 4500;
+
break;
default:
ibgMediaType = "Unknown";
ibgDivider = 1353;
+
break;
}
}
- ///
- /// Adds a new speed snapshot to the log
- ///
+ /// Adds a new speed snapshot to the log
/// Sector for the snapshot
/// Current speed at the snapshot
internal void Write(ulong sector, double currentSpeed)
{
- if(logFile == null) return;
+ if(logFile == null)
+ return;
ibgIntSpeed += currentSpeed;
ibgSampleRate += (int)Math.Floor((DateTime.Now - ibgDatePoint).TotalMilliseconds);
ibgSnaps++;
- if(ibgSampleRate < 100) return;
+ if(ibgSampleRate < 100)
+ return;
- if(ibgIntSpeed > 0 && !ibgStartSet)
+ if(ibgIntSpeed > 0 &&
+ !ibgStartSet)
{
ibgStartSpeed = ibgIntSpeed / ibgSnaps / ibgDivider;
ibgStartSet = true;
}
- ibgSb.AppendFormat("{0:0.00},{1},{2:0},0", ibgIntSpeed / ibgSnaps / ibgDivider, ibgIntSector, ibgSampleRate)
- .AppendLine();
- if(ibgIntSpeed / ibgSnaps / ibgDivider > ibgMaxSpeed) ibgMaxSpeed = ibgIntSpeed / ibgDivider;
+ ibgSb.AppendFormat("{0:0.00},{1},{2:0},0", ibgIntSpeed / ibgSnaps / ibgDivider, ibgIntSector,
+ ibgSampleRate).AppendLine();
+
+ if(ibgIntSpeed / ibgSnaps / ibgDivider > ibgMaxSpeed)
+ ibgMaxSpeed = ibgIntSpeed / ibgDivider;
ibgDatePoint = DateTime.Now;
ibgIntSpeed = 0;
@@ -236,9 +266,7 @@ namespace DiscImageChef.Core.Logging
ibgIntSector = sector;
}
- ///
- /// Closes the IMGBurn log
- ///
+ /// Closes the IMGBurn log
/// Device
/// Media blocks
/// Bytes per block
@@ -246,19 +274,22 @@ namespace DiscImageChef.Core.Logging
/// Speed at the end
/// Average speed
/// Device path
- internal void Close(Device dev, ulong blocks, ulong blockSize, double totalSeconds,
- double currentSpeed,
+ internal void Close(Device dev, ulong blocks, ulong blockSize, double totalSeconds, double currentSpeed,
double averageSpeed, string devicePath)
{
- if(logFile == null) return;
+ if(logFile == null)
+ return;
- FileStream ibgFs = new FileStream(logFile, FileMode.Create);
- StringBuilder ibgHeader = new StringBuilder();
- string ibgBusType;
+ var ibgFs = new FileStream(logFile, FileMode.Create);
+ var ibgHeader = new StringBuilder();
+ string ibgBusType;
- if(dev.IsUsb) ibgBusType = "USB";
- else if(dev.IsFireWire) ibgBusType = "FireWire";
- else ibgBusType = dev.Type.ToString();
+ if(dev.IsUsb)
+ ibgBusType = "USB";
+ else if(dev.IsFireWire)
+ ibgBusType = "FireWire";
+ else
+ ibgBusType = dev.Type.ToString();
ibgHeader.AppendLine("IBGD");
ibgHeader.AppendLine();
@@ -270,11 +301,13 @@ namespace DiscImageChef.Core.Logging
ibgHeader.AppendFormat("SAMPLE_RATE={0}", 100).AppendLine();
ibgHeader.AppendLine();
+
ibgHeader.AppendFormat("DEVICE=[0:0:0] {0} {1} ({2}) ({3})", dev.Manufacturer, dev.Model, devicePath,
ibgBusType).AppendLine();
+
ibgHeader.AppendLine("DEVICE_ADDRESS=0:0:0");
ibgHeader.AppendFormat("DEVICE_MAKEMODEL={0} {1}", dev.Manufacturer, dev.Model).AppendLine();
- ibgHeader.AppendFormat("DEVICE_FIRMWAREVERSION={0}", dev.Revision).AppendLine();
+ ibgHeader.AppendFormat("DEVICE_FIRMWAREVERSION={0}", dev.FirmwareRevision).AppendLine();
ibgHeader.AppendFormat("DEVICE_DRIVELETTER={0}", devicePath).AppendLine();
ibgHeader.AppendFormat("DEVICE_BUSTYPE={0}", ibgBusType).AppendLine();
ibgHeader.AppendLine();
@@ -307,7 +340,7 @@ namespace DiscImageChef.Core.Logging
ibgHeader.AppendLine();
ibgHeader.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n");
- StreamWriter sr = new StreamWriter(ibgFs);
+ var sr = new StreamWriter(ibgFs);
sr.Write(ibgHeader);
sr.Close();
ibgFs.Close();
diff --git a/DiscImageChef.Core/Logging/MHDDLog.cs b/DiscImageChef.Core/Logging/MHDDLog.cs
index 789144903..7cd2c4a0c 100644
--- a/DiscImageChef.Core/Logging/MHDDLog.cs
+++ b/DiscImageChef.Core/Logging/MHDDLog.cs
@@ -39,17 +39,13 @@ using DiscImageChef.Devices;
namespace DiscImageChef.Core.Logging
{
- ///
- /// Implements a log in the format used by MHDD
- ///
- class MhddLog
+ /// Implements a log in the format used by MHDD
+ internal class MhddLog
{
- string logFile;
- MemoryStream mhddFs;
+ readonly string logFile;
+ readonly MemoryStream mhddFs;
- ///
- /// Initializes the MHDD log
- ///
+ /// Initializes the MHDD log
/// Log file
/// Device
/// Blocks in media
@@ -57,7 +53,9 @@ namespace DiscImageChef.Core.Logging
/// How many blocks read at once
internal MhddLog(string outputFile, Device dev, ulong blocks, ulong blockSize, ulong blocksToRead)
{
- if(dev == null || string.IsNullOrEmpty(outputFile)) return;
+ if(dev == null ||
+ string.IsNullOrEmpty(outputFile))
+ return;
mhddFs = new MemoryStream();
logFile = outputFile;
@@ -69,31 +67,39 @@ namespace DiscImageChef.Core.Logging
case DeviceType.ATA:
case DeviceType.ATAPI:
mode = "MODE: IDE";
+
break;
case DeviceType.SCSI:
mode = "MODE: SCSI";
+
break;
case DeviceType.MMC:
mode = "MODE: MMC";
+
break;
case DeviceType.NVMe:
mode = "MODE: NVMe";
+
break;
case DeviceType.SecureDigital:
mode = "MODE: SD";
+
break;
default:
mode = "MODE: IDE";
+
break;
}
string device = $"DEVICE: {dev.Manufacturer} {dev.Model}";
- string fw = $"F/W: {dev.Revision}";
+ string fw = $"F/W: {dev.FirmwareRevision}";
string sn = $"S/N: {dev.Serial}";
- string sectors = string.Format(new CultureInfo("en-US"), "SECTORS: {0:n0}", blocks);
+ string sectors = string.Format(new CultureInfo("en-US"), "SECTORS: {0:n0}", blocks);
string sectorsize = string.Format(new CultureInfo("en-US"), "SECTOR SIZE: {0:n0} bytes", blockSize);
+
string scanblocksize =
string.Format(new CultureInfo("en-US"), "SCAN BLOCK SIZE: {0:n0} sectors", blocksToRead);
+
const string MHDD_VER = "VER:2 ";
byte[] deviceBytes = Encoding.ASCII.GetBytes(device);
@@ -108,7 +114,7 @@ namespace DiscImageChef.Core.Logging
uint pointer = (uint)(deviceBytes.Length + modeBytes.Length + fwBytes.Length +
snBytes.Length +
sectorsBytes.Length + sectorsizeBytes.Length + scanblocksizeBytes.Length +
- verBytes.Length + 2 * 9 + // New lines
+ verBytes.Length + (2 * 9) + // New lines
4); // Pointer
byte[] newLine = new byte[2];
@@ -116,49 +122,47 @@ namespace DiscImageChef.Core.Logging
newLine[1] = 0x0A;
mhddFs.Write(BitConverter.GetBytes(pointer), 0, 4);
- mhddFs.Write(newLine, 0, 2);
- mhddFs.Write(verBytes, 0, verBytes.Length);
- mhddFs.Write(newLine, 0, 2);
- mhddFs.Write(modeBytes, 0, modeBytes.Length);
- mhddFs.Write(newLine, 0, 2);
- mhddFs.Write(deviceBytes, 0, deviceBytes.Length);
- mhddFs.Write(newLine, 0, 2);
- mhddFs.Write(fwBytes, 0, fwBytes.Length);
- mhddFs.Write(newLine, 0, 2);
- mhddFs.Write(snBytes, 0, snBytes.Length);
- mhddFs.Write(newLine, 0, 2);
- mhddFs.Write(sectorsBytes, 0, sectorsBytes.Length);
- mhddFs.Write(newLine, 0, 2);
- mhddFs.Write(sectorsizeBytes, 0, sectorsizeBytes.Length);
- mhddFs.Write(newLine, 0, 2);
- mhddFs.Write(scanblocksizeBytes, 0, scanblocksizeBytes.Length);
- mhddFs.Write(newLine, 0, 2);
+ mhddFs.Write(newLine, 0, 2);
+ mhddFs.Write(verBytes, 0, verBytes.Length);
+ mhddFs.Write(newLine, 0, 2);
+ mhddFs.Write(modeBytes, 0, modeBytes.Length);
+ mhddFs.Write(newLine, 0, 2);
+ mhddFs.Write(deviceBytes, 0, deviceBytes.Length);
+ mhddFs.Write(newLine, 0, 2);
+ mhddFs.Write(fwBytes, 0, fwBytes.Length);
+ mhddFs.Write(newLine, 0, 2);
+ mhddFs.Write(snBytes, 0, snBytes.Length);
+ mhddFs.Write(newLine, 0, 2);
+ mhddFs.Write(sectorsBytes, 0, sectorsBytes.Length);
+ mhddFs.Write(newLine, 0, 2);
+ mhddFs.Write(sectorsizeBytes, 0, sectorsizeBytes.Length);
+ mhddFs.Write(newLine, 0, 2);
+ mhddFs.Write(scanblocksizeBytes, 0, scanblocksizeBytes.Length);
+ mhddFs.Write(newLine, 0, 2);
}
- ///
- /// Logs a new read
- ///
+ /// Logs a new read
/// Starting sector
/// Duration in milliseconds
internal void Write(ulong sector, double duration)
{
- if(logFile == null) return;
+ if(logFile == null)
+ return;
byte[] sectorBytes = BitConverter.GetBytes(sector);
byte[] durationBytes = BitConverter.GetBytes((ulong)(duration * 1000));
- mhddFs.Write(sectorBytes, 0, 8);
+ mhddFs.Write(sectorBytes, 0, 8);
mhddFs.Write(durationBytes, 0, 8);
}
- ///
- /// Closes and writes to file the MHDD log
- ///
+ /// Closes and writes to file the MHDD log
internal void Close()
{
- if(logFile == null) return;
+ if(logFile == null)
+ return;
- FileStream fs = new FileStream(logFile, FileMode.Create);
+ var fs = new FileStream(logFile, FileMode.Create);
mhddFs.WriteTo(fs);
mhddFs.Close();
fs.Close();
diff --git a/DiscImageChef.Core/Statistics.cs b/DiscImageChef.Core/Statistics.cs
index 3d7b6c2f4..c37874646 100644
--- a/DiscImageChef.Core/Statistics.cs
+++ b/DiscImageChef.Core/Statistics.cs
@@ -1272,7 +1272,8 @@ namespace DiscImageChef.Core
ctx.SeenDevices.Add(new DeviceStat
{
- Bus = deviceBus, Manufacturer = dev.Manufacturer, Model = dev.Model, Revision = dev.Revision,
+ Bus = deviceBus, Manufacturer = dev.Manufacturer, Model = dev.Model,
+ Revision = dev.FirmwareRevision,
Synchronized = false
});
diff --git a/DiscImageChef.Devices/Device/Constructor.cs b/DiscImageChef.Devices/Device/Constructor.cs
index 94676f848..2e1041f0f 100644
--- a/DiscImageChef.Devices/Device/Constructor.cs
+++ b/DiscImageChef.Devices/Device/Constructor.cs
@@ -40,6 +40,7 @@ using DiscImageChef.CommonTypes.Interop;
using DiscImageChef.Decoders.ATA;
using DiscImageChef.Decoders.SCSI;
using DiscImageChef.Decoders.SCSI.MMC;
+using DiscImageChef.Decoders.SecureDigital;
using DiscImageChef.Devices.FreeBSD;
using DiscImageChef.Devices.Windows;
using Microsoft.Win32.SafeHandles;
@@ -56,43 +57,41 @@ namespace DiscImageChef.Devices
{
public partial class Device
{
- ///
- /// Opens the device for sending direct commands
- ///
+ /// Opens the device for sending direct commands
/// Device path
public Device(string devicePath)
{
- PlatformId = DetectOS.GetRealPlatformID();
- Timeout = 15;
- Error = false;
+ PlatformId = DetectOS.GetRealPlatformID();
+ Timeout = 15;
+ Error = false;
IsRemovable = false;
- if (devicePath.StartsWith("dic://"))
+ if(devicePath.StartsWith("dic://"))
{
devicePath = devicePath.Substring(6);
- var pieces = devicePath.Split('/');
- var host = pieces[0];
+ string[] pieces = devicePath.Split('/');
+ string host = pieces[0];
devicePath = devicePath.Substring(host.Length);
_remote = new Remote.Remote(host);
- Error = !_remote.Open(devicePath, out var errno);
+ Error = !_remote.Open(devicePath, out int errno);
LastError = errno;
}
else
{
- switch (PlatformId)
+ switch(PlatformId)
{
case PlatformID.Win32NT:
{
FileHandle = Extern.CreateFile(devicePath, FileAccess.GenericRead | FileAccess.GenericWrite,
- FileShare.Read | FileShare.Write, IntPtr.Zero,
- FileMode.OpenExisting,
- FileAttributes.Normal, IntPtr.Zero);
+ FileShare.Read | FileShare.Write,
+ IntPtr.Zero,
+ FileMode.OpenExisting, FileAttributes.Normal, IntPtr.Zero);
- if (((SafeFileHandle) FileHandle).IsInvalid)
+ if(((SafeFileHandle)FileHandle).IsInvalid)
{
- Error = true;
+ Error = true;
LastError = Marshal.GetLastWin32Error();
}
@@ -102,18 +101,20 @@ namespace DiscImageChef.Devices
{
FileHandle =
Linux.Extern.open(devicePath,
- FileFlags.ReadWrite | FileFlags.NonBlocking | FileFlags.CreateNew);
+ FileFlags.ReadWrite | FileFlags.NonBlocking | FileFlags.CreateNew);
- if ((int) FileHandle < 0)
+ if((int)FileHandle < 0)
{
LastError = Marshal.GetLastWin32Error();
- if (LastError == 13 || LastError == 30) // EACCES or EROFS
+ if(LastError == 13 ||
+ LastError == 30) // EACCES or EROFS
{
FileHandle = Linux.Extern.open(devicePath, FileFlags.Readonly | FileFlags.NonBlocking);
- if ((int) FileHandle < 0)
+
+ if((int)FileHandle < 0)
{
- Error = true;
+ Error = true;
LastError = Marshal.GetLastWin32Error();
}
}
@@ -131,18 +132,17 @@ namespace DiscImageChef.Devices
{
FileHandle = FreeBSD.Extern.cam_open_device(devicePath, FreeBSD.FileFlags.ReadWrite);
- if (((IntPtr) FileHandle).ToInt64() == 0)
+ if(((IntPtr)FileHandle).ToInt64() == 0)
{
- Error = true;
+ Error = true;
LastError = Marshal.GetLastWin32Error();
}
- var camDevice = (CamDevice) Marshal.PtrToStructure((IntPtr) FileHandle, typeof(CamDevice));
+ var camDevice = (CamDevice)Marshal.PtrToStructure((IntPtr)FileHandle, typeof(CamDevice));
- if (StringHandlers.CToString(camDevice.SimName) == "ata")
+ if(StringHandlers.CToString(camDevice.SimName) == "ata")
throw new
- DeviceException(
- "Parallel ATA devices are not supported on FreeBSD due to upstream bug #224250.");
+ DeviceException("Parallel ATA devices are not supported on FreeBSD due to upstream bug #224250.");
break;
}
@@ -150,66 +150,74 @@ namespace DiscImageChef.Devices
}
}
- if (Error) throw new DeviceException(LastError);
+ if(Error)
+ throw new DeviceException(LastError);
- Type = DeviceType.Unknown;
+ Type = DeviceType.Unknown;
ScsiType = PeripheralDeviceTypes.UnknownDevice;
byte[] ataBuf;
byte[] inqBuf = null;
- if (Error) throw new DeviceException(LastError);
+ if(Error)
+ throw new DeviceException(LastError);
- var scsiSense = true;
+ bool scsiSense = true;
- if (_remote is null)
+ if(_remote is null)
{
// Windows is answering SCSI INQUIRY for all device types so it needs to be detected first
- switch (PlatformId)
+ switch(PlatformId)
{
case PlatformID.Win32NT:
var query = new StoragePropertyQuery();
- query.PropertyId = StoragePropertyId.Device;
- query.QueryType = StorageQueryType.Standard;
+ query.PropertyId = StoragePropertyId.Device;
+ query.QueryType = StorageQueryType.Standard;
query.AdditionalParameters = new byte[1];
- var descriptorPtr = Marshal.AllocHGlobal(1000);
- var descriptorB = new byte[1000];
+ IntPtr descriptorPtr = Marshal.AllocHGlobal(1000);
+ byte[] descriptorB = new byte[1000];
uint returned = 0;
- var error = 0;
+ int error = 0;
- var hasError = !Extern.DeviceIoControlStorageQuery((SafeFileHandle) FileHandle,
- WindowsIoctl.IoctlStorageQueryProperty,
- ref query, (uint) Marshal.SizeOf(query),
- descriptorPtr, 1000, ref returned, IntPtr.Zero);
+ bool hasError = !Extern.DeviceIoControlStorageQuery((SafeFileHandle)FileHandle,
+ WindowsIoctl.IoctlStorageQueryProperty,
+ ref query, (uint)Marshal.SizeOf(query),
+ descriptorPtr, 1000, ref returned,
+ IntPtr.Zero);
- if (hasError) error = Marshal.GetLastWin32Error();
+ if(hasError)
+ error = Marshal.GetLastWin32Error();
Marshal.Copy(descriptorPtr, descriptorB, 0, 1000);
- if (!hasError && error == 0)
+ if(!hasError &&
+ error == 0)
{
var descriptor = new StorageDeviceDescriptor
{
- Version = BitConverter.ToUInt32(descriptorB, 0),
- Size = BitConverter.ToUInt32(descriptorB, 4),
- DeviceType = descriptorB[8],
+ Version = BitConverter.ToUInt32(descriptorB, 0),
+ Size = BitConverter.ToUInt32(descriptorB, 4),
+ DeviceType = descriptorB[8],
DeviceTypeModifier = descriptorB[9],
- RemovableMedia = descriptorB[10] > 0,
- CommandQueueing = descriptorB[11] > 0,
- VendorIdOffset = BitConverter.ToInt32(descriptorB, 12),
- ProductIdOffset = BitConverter.ToInt32(descriptorB, 16),
+ RemovableMedia = descriptorB[10] > 0,
+ CommandQueueing =
+ descriptorB[11] > 0,
+ VendorIdOffset = BitConverter.ToInt32(descriptorB, 12),
+ ProductIdOffset = BitConverter.ToInt32(descriptorB, 16),
ProductRevisionOffset = BitConverter.ToInt32(descriptorB, 20),
- SerialNumberOffset = BitConverter.ToInt32(descriptorB, 24),
- BusType = (StorageBusType) BitConverter.ToUInt32(descriptorB, 28),
- RawPropertiesLength = BitConverter.ToUInt32(descriptorB, 32)
+ SerialNumberOffset = BitConverter.ToInt32(descriptorB, 24),
+ BusType = (StorageBusType)BitConverter.ToUInt32(descriptorB, 28),
+ RawPropertiesLength = BitConverter.ToUInt32(descriptorB, 32)
};
- descriptor.RawDeviceProperties = new byte[descriptor.RawPropertiesLength];
- Array.Copy(descriptorB, 36, descriptor.RawDeviceProperties, 0,
- descriptor.RawPropertiesLength);
- switch (descriptor.BusType)
+ descriptor.RawDeviceProperties = new byte[descriptor.RawPropertiesLength];
+
+ Array.Copy(descriptorB, 36, descriptor.RawDeviceProperties, 0,
+ descriptor.RawPropertiesLength);
+
+ switch(descriptor.BusType)
{
case StorageBusType.SCSI:
case StorageBusType.SSA:
@@ -217,48 +225,58 @@ namespace DiscImageChef.Devices
case StorageBusType.iSCSI:
case StorageBusType.SAS:
Type = DeviceType.SCSI;
+
break;
case StorageBusType.FireWire:
IsFireWire = true;
- Type = DeviceType.SCSI;
+ Type = DeviceType.SCSI;
+
break;
case StorageBusType.USB:
IsUsb = true;
- Type = DeviceType.SCSI;
+ Type = DeviceType.SCSI;
+
break;
case StorageBusType.ATAPI:
Type = DeviceType.ATAPI;
+
break;
case StorageBusType.ATA:
case StorageBusType.SATA:
Type = DeviceType.ATA;
+
break;
case StorageBusType.MultiMediaCard:
Type = DeviceType.MMC;
+
break;
case StorageBusType.SecureDigital:
Type = DeviceType.SecureDigital;
+
break;
case StorageBusType.NVMe:
Type = DeviceType.NVMe;
+
break;
}
- switch (Type)
+ switch(Type)
{
case DeviceType.SCSI:
case DeviceType.ATAPI:
scsiSense = ScsiInquiry(out inqBuf, out _);
+
break;
case DeviceType.ATA:
- var atapiSense = AtapiIdentify(out ataBuf, out _);
+ bool atapiSense = AtapiIdentify(out ataBuf, out _);
- if (!atapiSense)
+ if(!atapiSense)
{
Type = DeviceType.ATAPI;
- var ataid = Identify.Decode(ataBuf);
+ Identify.IdentifyDevice? ataid = Identify.Decode(ataBuf);
- if (ataid.HasValue) scsiSense = ScsiInquiry(out inqBuf, out _);
+ if(ataid.HasValue)
+ scsiSense = ScsiInquiry(out inqBuf, out _);
}
else
{
@@ -271,17 +289,17 @@ namespace DiscImageChef.Devices
Marshal.FreeHGlobal(descriptorPtr);
- if (Windows.Command.IsSdhci((SafeFileHandle) FileHandle))
+ if(Windows.Command.IsSdhci((SafeFileHandle)FileHandle))
{
- var sdBuffer = new byte[16];
+ byte[] sdBuffer = new byte[16];
- LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle, MmcCommands.SendCsd,
- false, false,
- MmcFlags.ResponseSpiR2 | MmcFlags.ResponseR2 |
- MmcFlags.CommandAc, 0, 16, 1, ref sdBuffer, out _,
- out _, out var sense);
+ LastError = Windows.Command.SendMmcCommand((SafeFileHandle)FileHandle, MmcCommands.SendCsd,
+ false, false,
+ MmcFlags.ResponseSpiR2 | MmcFlags.ResponseR2 |
+ MmcFlags.CommandAc, 0, 16, 1, ref sdBuffer,
+ out _, out _, out bool sense);
- if (!sense)
+ if(!sense)
{
cachedCsd = new byte[16];
Array.Copy(sdBuffer, 0, cachedCsd, 0, 16);
@@ -289,13 +307,13 @@ namespace DiscImageChef.Devices
sdBuffer = new byte[16];
- LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle, MmcCommands.SendCid,
- false, false,
- MmcFlags.ResponseSpiR2 | MmcFlags.ResponseR2 |
- MmcFlags.CommandAc, 0, 16, 1, ref sdBuffer, out _,
- out _, out sense);
+ LastError = Windows.Command.SendMmcCommand((SafeFileHandle)FileHandle, MmcCommands.SendCid,
+ false, false,
+ MmcFlags.ResponseSpiR2 | MmcFlags.ResponseR2 |
+ MmcFlags.CommandAc, 0, 16, 1, ref sdBuffer,
+ out _, out _, out sense);
- if (!sense)
+ if(!sense)
{
cachedCid = new byte[16];
Array.Copy(sdBuffer, 0, cachedCid, 0, 16);
@@ -303,14 +321,14 @@ namespace DiscImageChef.Devices
sdBuffer = new byte[8];
- LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle,
- (MmcCommands) SecureDigitalCommands.SendScr, false,
- true,
- MmcFlags.ResponseSpiR1 | MmcFlags.ResponseR1 |
- MmcFlags.CommandAdtc, 0, 8, 1, ref sdBuffer, out _,
- out _, out sense);
+ LastError = Windows.Command.SendMmcCommand((SafeFileHandle)FileHandle,
+ (MmcCommands)SecureDigitalCommands.SendScr,
+ false, true,
+ MmcFlags.ResponseSpiR1 | MmcFlags.ResponseR1 |
+ MmcFlags.CommandAdtc, 0, 8, 1, ref sdBuffer,
+ out _, out _, out sense);
- if (!sense)
+ if(!sense)
{
cachedScr = new byte[8];
Array.Copy(sdBuffer, 0, cachedScr, 0, 8);
@@ -318,16 +336,16 @@ namespace DiscImageChef.Devices
sdBuffer = new byte[4];
- LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle,
- cachedScr != null
- ? (MmcCommands) SecureDigitalCommands
- .SendOperatingCondition
- : MmcCommands.SendOpCond, false, true,
- MmcFlags.ResponseSpiR3 | MmcFlags.ResponseR3 |
- MmcFlags.CommandBcr, 0, 4, 1, ref sdBuffer,
- out _, out _, out sense);
+ LastError = Windows.Command.SendMmcCommand((SafeFileHandle)FileHandle,
+ cachedScr != null
+ ? (MmcCommands)SecureDigitalCommands.
+ SendOperatingCondition
+ : MmcCommands.SendOpCond, false, true,
+ MmcFlags.ResponseSpiR3 | MmcFlags.ResponseR3 |
+ MmcFlags.CommandBcr, 0, 4, 1, ref sdBuffer,
+ out _, out _, out sense);
- if (!sense)
+ if(!sense)
{
cachedScr = new byte[4];
Array.Copy(sdBuffer, 0, cachedScr, 0, 4);
@@ -336,48 +354,55 @@ namespace DiscImageChef.Devices
break;
case PlatformID.Linux:
- if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) ||
- devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) ||
- devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
+ if(devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) ||
+ devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) ||
+ devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
{
scsiSense = ScsiInquiry(out inqBuf, out _);
}
+
// MultiMediaCard and SecureDigital go here
- else if (devicePath.StartsWith("/dev/mmcblk", StringComparison.Ordinal))
+ else if(devicePath.StartsWith("/dev/mmcblk", StringComparison.Ordinal))
{
- var devPath = devicePath.Substring(5);
- if (File.Exists("/sys/block/" + devPath + "/device/csd"))
+ string devPath = devicePath.Substring(5);
+
+ if(File.Exists("/sys/block/" + devPath + "/device/csd"))
{
- var len =
- ConvertFromHexAscii("/sys/block/" + devPath + "/device/csd", out cachedCsd);
- if (len == 0) cachedCsd = null;
+ int len = ConvertFromHexAscii("/sys/block/" + devPath + "/device/csd", out cachedCsd);
+
+ if(len == 0)
+ cachedCsd = null;
}
- if (File.Exists("/sys/block/" + devPath + "/device/cid"))
+ if(File.Exists("/sys/block/" + devPath + "/device/cid"))
{
- var len =
- ConvertFromHexAscii("/sys/block/" + devPath + "/device/cid", out cachedCid);
- if (len == 0) cachedCid = null;
+ int len = ConvertFromHexAscii("/sys/block/" + devPath + "/device/cid", out cachedCid);
+
+ if(len == 0)
+ cachedCid = null;
}
- if (File.Exists("/sys/block/" + devPath + "/device/scr"))
+ if(File.Exists("/sys/block/" + devPath + "/device/scr"))
{
- var len =
- ConvertFromHexAscii("/sys/block/" + devPath + "/device/scr", out cachedScr);
- if (len == 0) cachedScr = null;
+ int len = ConvertFromHexAscii("/sys/block/" + devPath + "/device/scr", out cachedScr);
+
+ if(len == 0)
+ cachedScr = null;
}
- if (File.Exists("/sys/block/" + devPath + "/device/ocr"))
+ if(File.Exists("/sys/block/" + devPath + "/device/ocr"))
{
- var len =
- ConvertFromHexAscii("/sys/block/" + devPath + "/device/ocr", out cachedOcr);
- if (len == 0) cachedOcr = null;
+ int len = ConvertFromHexAscii("/sys/block/" + devPath + "/device/ocr", out cachedOcr);
+
+ if(len == 0)
+ cachedOcr = null;
}
}
break;
default:
scsiSense = ScsiInquiry(out inqBuf, out _);
+
break;
}
}
@@ -385,17 +410,18 @@ namespace DiscImageChef.Devices
{
Type = _remote.GetDeviceType();
- switch (Type)
+ switch(Type)
{
case DeviceType.ATAPI:
case DeviceType.SCSI:
scsiSense = ScsiInquiry(out inqBuf, out _);
+
break;
case DeviceType.SecureDigital:
case DeviceType.MMC:
- if (!_remote.GetSdhciRegisters(out cachedCsd, out cachedCid, out cachedOcr, out cachedScr))
+ if(!_remote.GetSdhciRegisters(out cachedCsd, out cachedCid, out cachedOcr, out cachedScr))
{
- Type = DeviceType.SCSI;
+ Type = DeviceType.SCSI;
ScsiType = PeripheralDeviceTypes.DirectAccess;
}
@@ -404,103 +430,115 @@ namespace DiscImageChef.Devices
}
#region SecureDigital / MultiMediaCard
-
- if (cachedCid != null)
+ if(cachedCid != null)
{
- ScsiType = PeripheralDeviceTypes.DirectAccess;
+ ScsiType = PeripheralDeviceTypes.DirectAccess;
IsRemovable = false;
- if (cachedScr != null)
+ if(cachedScr != null)
{
Type = DeviceType.SecureDigital;
- var decoded = Decoders.SecureDigital.Decoders.DecodeCID(cachedCid);
+ CID decoded = Decoders.SecureDigital.Decoders.DecodeCID(cachedCid);
Manufacturer = VendorString.Prettify(decoded.Manufacturer);
- Model = decoded.ProductName;
- Revision = $"{(decoded.ProductRevision & 0xF0) >> 4:X2}.{decoded.ProductRevision & 0x0F:X2}";
+ Model = decoded.ProductName;
+
+ FirmwareRevision =
+ $"{(decoded.ProductRevision & 0xF0) >> 4:X2}.{decoded.ProductRevision & 0x0F:X2}";
+
Serial = $"{decoded.ProductSerialNumber}";
}
else
{
Type = DeviceType.MMC;
- var decoded = Decoders.MMC.Decoders.DecodeCID(cachedCid);
+ Decoders.MMC.CID decoded = Decoders.MMC.Decoders.DecodeCID(cachedCid);
Manufacturer = Decoders.MMC.VendorString.Prettify(decoded.Manufacturer);
- Model = decoded.ProductName;
- Revision = $"{(decoded.ProductRevision & 0xF0) >> 4:X2}.{decoded.ProductRevision & 0x0F:X2}";
+ Model = decoded.ProductName;
+
+ FirmwareRevision =
+ $"{(decoded.ProductRevision & 0xF0) >> 4:X2}.{decoded.ProductRevision & 0x0F:X2}";
+
Serial = $"{decoded.ProductSerialNumber}";
}
}
-
#endregion SecureDigital / MultiMediaCard
#region USB
-
- if (_remote is null)
+ if(_remote is null)
{
- switch (PlatformId)
+ switch(PlatformId)
{
case PlatformID.Linux:
- if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) ||
- devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) ||
- devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
+ if(devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) ||
+ devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) ||
+ devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
{
- var devPath = devicePath.Substring(5);
- if (Directory.Exists("/sys/block/" + devPath))
+ string devPath = devicePath.Substring(5);
+
+ if(Directory.Exists("/sys/block/" + devPath))
{
- var resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath);
- if (!string.IsNullOrEmpty(resolvedLink))
+ string resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath);
+
+ if(!string.IsNullOrEmpty(resolvedLink))
{
resolvedLink = "/sys" + resolvedLink.Substring(2);
- while (resolvedLink.Contains("usb"))
+ while(resolvedLink.Contains("usb"))
{
resolvedLink = Path.GetDirectoryName(resolvedLink);
- if (!File.Exists(resolvedLink + "/descriptors") ||
- !File.Exists(resolvedLink + "/idProduct") ||
- !File.Exists(resolvedLink + "/idVendor")) continue;
+
+ if(!File.Exists(resolvedLink + "/descriptors") ||
+ !File.Exists(resolvedLink + "/idProduct") ||
+ !File.Exists(resolvedLink + "/idVendor"))
+ continue;
var usbFs = new FileStream(resolvedLink + "/descriptors",
- System.IO.FileMode.Open,
- System.IO.FileAccess.Read);
- var usbBuf = new byte[65536];
- var usbCount = usbFs.Read(usbBuf, 0, 65536);
+ System.IO.FileMode.Open, System.IO.FileAccess.Read);
+
+ byte[] usbBuf = new byte[65536];
+ int usbCount = usbFs.Read(usbBuf, 0, 65536);
UsbDescriptors = new byte[usbCount];
Array.Copy(usbBuf, 0, UsbDescriptors, 0, usbCount);
usbFs.Close();
- var usbSr = new StreamReader(resolvedLink + "/idProduct");
- var usbTemp = usbSr.ReadToEnd();
+ var usbSr = new StreamReader(resolvedLink + "/idProduct");
+ string usbTemp = usbSr.ReadToEnd();
+
ushort.TryParse(usbTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
- out usbProduct);
+ out usbProduct);
+
usbSr.Close();
- usbSr = new StreamReader(resolvedLink + "/idVendor");
+ usbSr = new StreamReader(resolvedLink + "/idVendor");
usbTemp = usbSr.ReadToEnd();
+
ushort.TryParse(usbTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
- out usbVendor);
+ out usbVendor);
+
usbSr.Close();
- if (File.Exists(resolvedLink + "/manufacturer"))
+ if(File.Exists(resolvedLink + "/manufacturer"))
{
- usbSr = new StreamReader(resolvedLink + "/manufacturer");
+ usbSr = new StreamReader(resolvedLink + "/manufacturer");
UsbManufacturerString = usbSr.ReadToEnd().Trim();
usbSr.Close();
}
- if (File.Exists(resolvedLink + "/product"))
+ if(File.Exists(resolvedLink + "/product"))
{
- usbSr = new StreamReader(resolvedLink + "/product");
+ usbSr = new StreamReader(resolvedLink + "/product");
UsbProductString = usbSr.ReadToEnd().Trim();
usbSr.Close();
}
- if (File.Exists(resolvedLink + "/serial"))
+ if(File.Exists(resolvedLink + "/serial"))
{
- usbSr = new StreamReader(resolvedLink + "/serial");
+ usbSr = new StreamReader(resolvedLink + "/serial");
UsbSerialString = usbSr.ReadToEnd().Trim();
usbSr.Close();
}
IsUsb = true;
+
break;
}
}
@@ -512,177 +550,199 @@ namespace DiscImageChef.Devices
Usb.UsbDevice usbDevice = null;
// I have to search for USB disks, floppies and CD-ROMs as separate device types
- foreach (var devGuid in new[]
+ foreach(string devGuid in new[]
{
Usb.GuidDevinterfaceFloppy, Usb.GuidDevinterfaceCdrom, Usb.GuidDevinterfaceDisk,
Usb.GuidDevinterfaceTape
})
{
usbDevice = Usb.FindDrivePath(devicePath, devGuid);
- if (usbDevice != null) break;
+
+ if(usbDevice != null)
+ break;
}
- if (usbDevice != null)
+ if(usbDevice != null)
{
- UsbDescriptors = usbDevice.BinaryDescriptors;
- usbVendor = (ushort) usbDevice.DeviceDescriptor.idVendor;
- usbProduct = (ushort) usbDevice.DeviceDescriptor.idProduct;
+ UsbDescriptors = usbDevice.BinaryDescriptors;
+ usbVendor = (ushort)usbDevice.DeviceDescriptor.idVendor;
+ usbProduct = (ushort)usbDevice.DeviceDescriptor.idProduct;
UsbManufacturerString = usbDevice.Manufacturer;
- UsbProductString = usbDevice.Product;
+ UsbProductString = usbDevice.Product;
+
UsbSerialString =
- usbDevice
- .SerialNumber; // This is incorrect filled by Windows with SCSI/ATA serial number
+ usbDevice.
+ SerialNumber; // This is incorrect filled by Windows with SCSI/ATA serial number
}
break;
default:
IsUsb = false;
+
break;
}
}
else
{
- if (_remote.GetUsbData(out var remoteUsbDescriptors, out var remoteUsbVendor,
- out var remoteUsbProduct, out var remoteUsbManufacturer, out var remoteUsbProductString,
- out var remoteUsbSerial))
+ if(_remote.GetUsbData(out byte[] remoteUsbDescriptors, out ushort remoteUsbVendor,
+ out ushort remoteUsbProduct, out string remoteUsbManufacturer,
+ out string remoteUsbProductString, out string remoteUsbSerial))
{
- IsUsb = true;
- UsbDescriptors = remoteUsbDescriptors;
- usbVendor = remoteUsbVendor;
- usbProduct = remoteUsbProduct;
+ IsUsb = true;
+ UsbDescriptors = remoteUsbDescriptors;
+ usbVendor = remoteUsbVendor;
+ usbProduct = remoteUsbProduct;
UsbManufacturerString = remoteUsbManufacturer;
- UsbProductString = remoteUsbProductString;
- UsbSerialString = remoteUsbSerial;
+ UsbProductString = remoteUsbProductString;
+ UsbSerialString = remoteUsbSerial;
}
}
-
#endregion USB
#region FireWire
-
- if (!(_remote is null))
+ if(!(_remote is null))
{
- if (_remote.GetFireWireData(out firewireVendor, out firewireModel,
- out firewireGuid, out var remoteFireWireVendorName, out var remoteFireWireModelName))
+ if(_remote.GetFireWireData(out firewireVendor, out firewireModel, out firewireGuid,
+ out string remoteFireWireVendorName, out string remoteFireWireModelName))
{
- IsFireWire = true;
+ IsFireWire = true;
FireWireVendorName = remoteFireWireVendorName;
- FireWireModelName = remoteFireWireModelName;
+ FireWireModelName = remoteFireWireModelName;
}
}
else
{
- if (PlatformId == PlatformID.Linux)
+ if(PlatformId == PlatformID.Linux)
{
- if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) ||
- devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) ||
- devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
+ if(devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) ||
+ devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) ||
+ devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
{
- var devPath = devicePath.Substring(5);
- if (Directory.Exists("/sys/block/" + devPath))
+ string devPath = devicePath.Substring(5);
+
+ if(Directory.Exists("/sys/block/" + devPath))
{
- var resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath);
+ string resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath);
resolvedLink = "/sys" + resolvedLink.Substring(2);
- if (!string.IsNullOrEmpty(resolvedLink))
- while (resolvedLink.Contains("firewire"))
+
+ if(!string.IsNullOrEmpty(resolvedLink))
+ while(resolvedLink.Contains("firewire"))
{
resolvedLink = Path.GetDirectoryName(resolvedLink);
- if (!File.Exists(resolvedLink + "/model") ||
- !File.Exists(resolvedLink + "/vendor") ||
- !File.Exists(resolvedLink + "/guid")) continue;
- var fwSr = new StreamReader(resolvedLink + "/model");
- var fwTemp = fwSr.ReadToEnd();
+ if(!File.Exists(resolvedLink + "/model") ||
+ !File.Exists(resolvedLink + "/vendor") ||
+ !File.Exists(resolvedLink + "/guid"))
+ continue;
+
+ var fwSr = new StreamReader(resolvedLink + "/model");
+ string fwTemp = fwSr.ReadToEnd();
+
uint.TryParse(fwTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
- out firewireModel);
+ out firewireModel);
+
fwSr.Close();
- fwSr = new StreamReader(resolvedLink + "/vendor");
+ fwSr = new StreamReader(resolvedLink + "/vendor");
fwTemp = fwSr.ReadToEnd();
+
uint.TryParse(fwTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
- out firewireVendor);
+ out firewireVendor);
+
fwSr.Close();
- fwSr = new StreamReader(resolvedLink + "/guid");
+ fwSr = new StreamReader(resolvedLink + "/guid");
fwTemp = fwSr.ReadToEnd();
+
ulong.TryParse(fwTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
- out firewireGuid);
+ out firewireGuid);
+
fwSr.Close();
- if (File.Exists(resolvedLink + "/model_name"))
+ if(File.Exists(resolvedLink + "/model_name"))
{
- fwSr = new StreamReader(resolvedLink + "/model_name");
+ fwSr = new StreamReader(resolvedLink + "/model_name");
FireWireModelName = fwSr.ReadToEnd().Trim();
fwSr.Close();
}
- if (File.Exists(resolvedLink + "/vendor_name"))
+ if(File.Exists(resolvedLink + "/vendor_name"))
{
- fwSr = new StreamReader(resolvedLink + "/vendor_name");
+ fwSr = new StreamReader(resolvedLink + "/vendor_name");
FireWireVendorName = fwSr.ReadToEnd().Trim();
fwSr.Close();
}
IsFireWire = true;
+
break;
}
}
}
}
+
// TODO: Implement for other operating systems
else
{
IsFireWire = false;
}
}
-
#endregion FireWire
#region PCMCIA
-
- if (_remote is null)
+ if(_remote is null)
{
- if (PlatformId == PlatformID.Linux)
+ if(PlatformId == PlatformID.Linux)
{
- if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) ||
- devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) ||
- devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
+ if(devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) ||
+ devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) ||
+ devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
{
- var devPath = devicePath.Substring(5);
- if (Directory.Exists("/sys/block/" + devPath))
+ string devPath = devicePath.Substring(5);
+
+ if(Directory.Exists("/sys/block/" + devPath))
{
- var resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath);
+ string resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath);
resolvedLink = "/sys" + resolvedLink.Substring(2);
- if (!string.IsNullOrEmpty(resolvedLink))
- while (resolvedLink.Contains("/sys/devices"))
+
+ if(!string.IsNullOrEmpty(resolvedLink))
+ while(resolvedLink.Contains("/sys/devices"))
{
resolvedLink = Path.GetDirectoryName(resolvedLink);
- if (!Directory.Exists(resolvedLink + "/pcmcia_socket")) continue;
- var subdirs = Directory.GetDirectories(resolvedLink + "/pcmcia_socket",
- "pcmcia_socket*",
- SearchOption.TopDirectoryOnly);
+ if(!Directory.Exists(resolvedLink + "/pcmcia_socket"))
+ continue;
- if (subdirs.Length <= 0) continue;
+ string[] subdirs = Directory.GetDirectories(resolvedLink + "/pcmcia_socket",
+ "pcmcia_socket*",
+ SearchOption.TopDirectoryOnly);
- var possibleDir = Path.Combine(resolvedLink, "pcmcia_socket", subdirs[0]);
- if (!File.Exists(possibleDir + "/card_type") || !File.Exists(possibleDir + "/cis"))
+ if(subdirs.Length <= 0)
+ continue;
+
+ string possibleDir = Path.Combine(resolvedLink, "pcmcia_socket", subdirs[0]);
+
+ if(!File.Exists(possibleDir + "/card_type") ||
+ !File.Exists(possibleDir + "/cis"))
continue;
var cisFs = new FileStream(possibleDir + "/cis", System.IO.FileMode.Open,
- System.IO.FileAccess.Read);
- var cisBuf = new byte[65536];
- var cisCount = cisFs.Read(cisBuf, 0, 65536);
+ System.IO.FileAccess.Read);
+
+ byte[] cisBuf = new byte[65536];
+ int cisCount = cisFs.Read(cisBuf, 0, 65536);
Cis = new byte[cisCount];
Array.Copy(cisBuf, 0, Cis, 0, cisCount);
cisFs.Close();
IsPcmcia = true;
+
break;
}
}
}
}
+
// TODO: Implement for other operating systems
else
{
@@ -691,143 +751,173 @@ namespace DiscImageChef.Devices
}
else
{
- if (_remote.GetPcmciaData(out var cisBuf))
+ if(_remote.GetPcmciaData(out byte[] cisBuf))
{
IsPcmcia = true;
- Cis = cisBuf;
+ Cis = cisBuf;
}
}
-
#endregion PCMCIA
- if (!scsiSense)
+ if(!scsiSense)
{
- var inquiry = Inquiry.Decode(inqBuf);
+ Inquiry.SCSIInquiry? inquiry = Inquiry.Decode(inqBuf);
Type = DeviceType.SCSI;
- var serialSense = ScsiInquiry(out inqBuf, out _, 0x80);
- if (!serialSense) Serial = EVPD.DecodePage80(inqBuf);
+ bool serialSense = ScsiInquiry(out inqBuf, out _, 0x80);
- if (inquiry.HasValue)
+ if(!serialSense)
+ Serial = EVPD.DecodePage80(inqBuf);
+
+ if(inquiry.HasValue)
{
- var tmp = StringHandlers.CToString(inquiry.Value.ProductRevisionLevel);
- if (tmp != null) Revision = tmp.Trim();
+ string tmp = StringHandlers.CToString(inquiry.Value.ProductRevisionLevel);
+
+ if(tmp != null)
+ FirmwareRevision = tmp.Trim();
+
tmp = StringHandlers.CToString(inquiry.Value.ProductIdentification);
- if (tmp != null) Model = tmp.Trim();
+
+ if(tmp != null)
+ Model = tmp.Trim();
+
tmp = StringHandlers.CToString(inquiry.Value.VendorIdentification);
- if (tmp != null) Manufacturer = tmp.Trim();
+
+ if(tmp != null)
+ Manufacturer = tmp.Trim();
+
IsRemovable = inquiry.Value.RMB;
- ScsiType = (PeripheralDeviceTypes) inquiry.Value.PeripheralDeviceType;
+ ScsiType = (PeripheralDeviceTypes)inquiry.Value.PeripheralDeviceType;
}
- var atapiSense = AtapiIdentify(out ataBuf, out _);
+ bool atapiSense = AtapiIdentify(out ataBuf, out _);
- if (!atapiSense)
+ if(!atapiSense)
{
Type = DeviceType.ATAPI;
- var ataId = Identify.Decode(ataBuf);
+ Identify.IdentifyDevice? ataId = Identify.Decode(ataBuf);
- if (ataId.HasValue) Serial = ataId.Value.SerialNumber;
+ if(ataId.HasValue)
+ Serial = ataId.Value.SerialNumber;
}
LastError = 0;
- Error = false;
+ Error = false;
}
- if (scsiSense && (IsUsb || IsFireWire) || Manufacturer == "ATA")
+ if((scsiSense && (IsUsb || IsFireWire)) ||
+ Manufacturer == "ATA")
{
- var ataSense = AtaIdentify(out ataBuf, out _);
- if (!ataSense)
+ bool ataSense = AtaIdentify(out ataBuf, out _);
+
+ if(!ataSense)
{
Type = DeviceType.ATA;
- var ataid = Identify.Decode(ataBuf);
+ Identify.IdentifyDevice? ataid = Identify.Decode(ataBuf);
- if (ataid.HasValue)
+ if(ataid.HasValue)
{
- var separated = ataid.Value.Model.Split(' ');
+ string[] separated = ataid.Value.Model.Split(' ');
- if (separated.Length == 1)
+ if(separated.Length == 1)
{
Model = separated[0];
}
else
{
Manufacturer = separated[0];
- Model = separated[separated.Length - 1];
+ Model = separated[separated.Length - 1];
}
- Revision = ataid.Value.FirmwareRevision;
- Serial = ataid.Value.SerialNumber;
+ FirmwareRevision = ataid.Value.FirmwareRevision;
+ Serial = ataid.Value.SerialNumber;
ScsiType = PeripheralDeviceTypes.DirectAccess;
- if ((ushort) ataid.Value.GeneralConfiguration != 0x848A)
+ if((ushort)ataid.Value.GeneralConfiguration != 0x848A)
IsRemovable |=
(ataid.Value.GeneralConfiguration & Identify.GeneralConfigurationBit.Removable) ==
Identify.GeneralConfigurationBit.Removable;
- else IsCompactFlash = true;
+ else
+ IsCompactFlash = true;
}
}
}
- if (Type == DeviceType.Unknown)
+ if(Type == DeviceType.Unknown)
{
- Manufacturer = null;
- Model = null;
- Revision = null;
- Serial = null;
+ Manufacturer = null;
+ Model = null;
+ FirmwareRevision = null;
+ Serial = null;
}
- if (IsUsb)
+ if(IsUsb)
{
- if (string.IsNullOrEmpty(Manufacturer)) Manufacturer = UsbManufacturerString;
- if (string.IsNullOrEmpty(Model)) Model = UsbProductString;
- if (string.IsNullOrEmpty(Serial)) Serial = UsbSerialString;
+ if(string.IsNullOrEmpty(Manufacturer))
+ Manufacturer = UsbManufacturerString;
+
+ if(string.IsNullOrEmpty(Model))
+ Model = UsbProductString;
+
+ if(string.IsNullOrEmpty(Serial))
+ Serial = UsbSerialString;
else
- foreach (var c in Serial.Where(char.IsControl))
+ foreach(char c in Serial.Where(char.IsControl))
Serial = UsbSerialString;
}
- if (IsFireWire)
+ if(IsFireWire)
{
- if (string.IsNullOrEmpty(Manufacturer)) Manufacturer = FireWireVendorName;
- if (string.IsNullOrEmpty(Model)) Model = FireWireModelName;
- if (string.IsNullOrEmpty(Serial)) Serial = $"{firewireGuid:X16}";
+ if(string.IsNullOrEmpty(Manufacturer))
+ Manufacturer = FireWireVendorName;
+
+ if(string.IsNullOrEmpty(Model))
+ Model = FireWireModelName;
+
+ if(string.IsNullOrEmpty(Serial))
+ Serial = $"{firewireGuid:X16}";
else
- foreach (var c in Serial.Where(char.IsControl))
+ foreach(char c in Serial.Where(char.IsControl))
Serial = $"{firewireGuid:X16}";
}
// Some optical drives are not getting the correct serial, and IDENTIFY PACKET DEVICE is blocked without
// administrator privileges
- if (ScsiType != PeripheralDeviceTypes.MultiMediaDevice) return;
+ if(ScsiType != PeripheralDeviceTypes.MultiMediaDevice)
+ return;
- var featureSense = GetConfiguration(out var featureBuffer, out _, 0x0108, MmcGetConfigurationRt.Single,
- Timeout, out _);
+ bool featureSense = GetConfiguration(out byte[] featureBuffer, out _, 0x0108, MmcGetConfigurationRt.Single,
+ Timeout, out _);
- if (featureSense) return;
+ if(featureSense)
+ return;
- var features = Features.Separate(featureBuffer);
- if (features.Descriptors?.Length != 1 || features.Descriptors[0].Code != 0x0108) return;
+ Features.SeparatedFeatures features = Features.Separate(featureBuffer);
- var serialFeature = Features.Decode_0108(features.Descriptors[0].Data);
+ if(features.Descriptors?.Length != 1 ||
+ features.Descriptors[0].Code != 0x0108)
+ return;
- if (serialFeature is null) return;
+ Feature_0108? serialFeature = Features.Decode_0108(features.Descriptors[0].Data);
+
+ if(serialFeature is null)
+ return;
Serial = serialFeature.Value.Serial;
}
- private static int ConvertFromHexAscii(string file, out byte[] outBuf)
+ static int ConvertFromHexAscii(string file, out byte[] outBuf)
{
- var sr = new StreamReader(file);
- var ins = sr.ReadToEnd().Trim();
+ var sr = new StreamReader(file);
+ string ins = sr.ReadToEnd().Trim();
outBuf = new byte[ins.Length / 2];
- var count = 0;
+ int count = 0;
try
{
- for (var i = 0; i < ins.Length; i += 2)
+ for(int i = 0; i < ins.Length; i += 2)
{
outBuf[i / 2] = Convert.ToByte(ins.Substring(i, 2), 16);
count++;
@@ -839,6 +929,7 @@ namespace DiscImageChef.Devices
}
sr.Close();
+
return count;
}
}
diff --git a/DiscImageChef.Devices/Device/Variables.cs b/DiscImageChef.Devices/Device/Variables.cs
index 1da5149ee..3afe926fc 100644
--- a/DiscImageChef.Devices/Device/Variables.cs
+++ b/DiscImageChef.Devices/Device/Variables.cs
@@ -100,10 +100,10 @@ namespace DiscImageChef.Devices
public string Model { get; }
///
- /// Gets the device's revision.
+ /// Gets the device's firmware version.
///
- /// The revision.
- public string Revision { get; }
+ /// The firmware version.
+ public string FirmwareRevision { get; }
///
/// Gets the device's serial number.
diff --git a/DiscImageChef.Gui/Panels/pnlDeviceInfo.xeto.cs b/DiscImageChef.Gui/Panels/pnlDeviceInfo.xeto.cs
index 91956bbec..b57e7c95e 100644
--- a/DiscImageChef.Gui/Panels/pnlDeviceInfo.xeto.cs
+++ b/DiscImageChef.Gui/Panels/pnlDeviceInfo.xeto.cs
@@ -43,7 +43,7 @@ namespace DiscImageChef.Gui.Panels
{
public class pnlDeviceInfo : Panel
{
- DeviceInfo devInfo;
+ readonly DeviceInfo devInfo;
public pnlDeviceInfo(DeviceInfo devInfo)
{
@@ -54,7 +54,7 @@ namespace DiscImageChef.Gui.Panels
txtType.Text = devInfo.Type.ToString();
txtManufacturer.Text = devInfo.Manufacturer;
txtModel.Text = devInfo.Model;
- txtRevision.Text = devInfo.Revision;
+ txtRevision.Text = devInfo.FirmwareRevision;
txtSerial.Text = devInfo.Serial;
txtScsiType.Text = devInfo.ScsiType.ToString();
chkRemovable.Checked = devInfo.IsRemovable;
@@ -83,14 +83,15 @@ namespace DiscImageChef.Gui.Panels
if(devInfo.IsPcmcia)
{
- tabPcmciaInfo tabPcmciaInfo = new tabPcmciaInfo();
+ var tabPcmciaInfo = new tabPcmciaInfo();
tabPcmciaInfo.LoadData(devInfo.Cis);
tabInfos.Pages.Add(tabPcmciaInfo);
}
- if(devInfo.AtaIdentify != null || devInfo.AtapiIdentify != null)
+ if(devInfo.AtaIdentify != null ||
+ devInfo.AtapiIdentify != null)
{
- tabAtaInfo tabAtaInfo = new tabAtaInfo();
+ var tabAtaInfo = new tabAtaInfo();
tabAtaInfo.LoadData(devInfo.AtaIdentify, devInfo.AtapiIdentify, devInfo.AtaMcptError);
tabInfos.Pages.Add(tabAtaInfo);
@@ -98,7 +99,8 @@ namespace DiscImageChef.Gui.Panels
if(devInfo.ScsiInquiryData != null)
{
- tabScsiInfo tabScsiInfo = new tabScsiInfo();
+ var tabScsiInfo = new tabScsiInfo();
+
tabScsiInfo.LoadData(devInfo.ScsiInquiryData, devInfo.ScsiInquiry, devInfo.ScsiEvpdPages,
devInfo.ScsiMode, devInfo.ScsiType, devInfo.ScsiModeSense6,
devInfo.ScsiModeSense10, devInfo.MmcConfiguration);
@@ -108,18 +110,23 @@ namespace DiscImageChef.Gui.Panels
if(devInfo.PlextorFeatures != null)
{
tabPlextor.Visible = true;
+
if(devInfo.PlextorFeatures.Eeprom != null)
{
stkPlextorEeprom.Visible = true;
txtPlextorDiscs.Text = $"{devInfo.PlextorFeatures.Discs}";
txtPlextorCdReadTime.Text = TimeSpan.FromSeconds(devInfo.PlextorFeatures.CdReadTime).ToString();
+
txtPlextorCdWriteTime.Text =
TimeSpan.FromSeconds(devInfo.PlextorFeatures.CdWriteTime).ToString();
+
if(devInfo.PlextorFeatures.IsDvd)
{
stkPlextorDvdTimes.Visible = true;
+
txtPlextorDvdReadTime.Text =
TimeSpan.FromSeconds(devInfo.PlextorFeatures.DvdReadTime).ToString();
+
txtPlextorDvdWriteTime.Text =
TimeSpan.FromSeconds(devInfo.PlextorFeatures.DvdWriteTime).ToString();
}
@@ -139,6 +146,7 @@ namespace DiscImageChef.Gui.Panels
if(devInfo.PlextorFeatures.PoweRecRecommendedSpeed > 0)
{
stkPlextorPoweRecRecommended.Visible = true;
+
txtPlextorPoweRecRecommended.Text =
$"{devInfo.PlextorFeatures.PoweRecRecommendedSpeed} Kb/sec.";
}
@@ -146,6 +154,7 @@ namespace DiscImageChef.Gui.Panels
if(devInfo.PlextorFeatures.PoweRecSelected > 0)
{
stkPlextorPoweRecSelected.Visible = true;
+
txtPlextorPoweRecSelected.Text =
$"{devInfo.PlextorFeatures.PoweRecSelected} Kb/sec.";
}
@@ -179,21 +188,19 @@ namespace DiscImageChef.Gui.Panels
txtPlextorSilentModeCdReadSpeedLimit.Text =
devInfo.PlextorFeatures.CdReadSpeedLimit > 0
- ? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x"
- : "unlimited";
+ ? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x" : "unlimited";
txtPlextorSilentModeCdWriteSpeedLimit.Text =
devInfo.PlextorFeatures.CdWriteSpeedLimit > 0
- ? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x"
- : "unlimited";
+ ? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x" : "unlimited";
if(devInfo.PlextorFeatures.IsDvd)
{
stkPlextorSilentModeDvdReadSpeedLimit.Visible = true;
+
txtPlextorSilentModeDvdReadSpeedLimit.Text =
devInfo.PlextorFeatures.DvdReadSpeedLimit > 0
- ? $"{devInfo.PlextorFeatures.DvdReadSpeedLimit}x"
- : "unlimited";
+ ? $"{devInfo.PlextorFeatures.DvdReadSpeedLimit}x" : "unlimited";
}
}
}
@@ -209,6 +216,7 @@ namespace DiscImageChef.Gui.Panels
}
chkPlextorHiding.Checked = devInfo.PlextorFeatures.Hiding;
+
if(devInfo.PlextorFeatures.Hiding)
{
stkPlextorHiding.Visible = true;
@@ -235,8 +243,10 @@ namespace DiscImageChef.Gui.Panels
chkKreonDecryptSs.Checked = devInfo.KreonFeatures.HasFlag(KreonFeatures.DecryptSs);
chkKreonXtremeUnlock.Checked = devInfo.KreonFeatures.HasFlag(KreonFeatures.XtremeUnlock);
chkKreonWxripperUnlock.Checked = devInfo.KreonFeatures.HasFlag(KreonFeatures.WxripperUnlock);
+
chkKreonChallengeResponse360.Checked =
devInfo.KreonFeatures.HasFlag(KreonFeatures.ChallengeResponse360);
+
chkKreonDecryptSs360.Checked = devInfo.KreonFeatures.HasFlag(KreonFeatures.DecryptSs360);
chkKreonXtremeUnlock360.Checked = devInfo.KreonFeatures.HasFlag(KreonFeatures.XtremeUnlock360);
chkKreonWxripperUnlock360.Checked = devInfo.KreonFeatures.HasFlag(KreonFeatures.WxripperUnlock360);
@@ -251,9 +261,11 @@ namespace DiscImageChef.Gui.Panels
if(blockLimits.HasValue)
{
tabSsc.Visible = true;
+
if(blockLimits.Value.minBlockLen == blockLimits.Value.maxBlockLen)
{
lblMinBlockSize.Visible = true;
+
lblMinBlockSize.Text =
$"Device's block size is fixed at {blockLimits.Value.minBlockLen} bytes";
}
@@ -265,12 +277,14 @@ namespace DiscImageChef.Gui.Panels
lblMaxBlockSize.Text = blockLimits.Value.maxBlockLen > 0
? $"Device's maximum block size is {blockLimits.Value.maxBlockLen} bytes"
: "Device does not specify a maximum block size";
+
lblMinBlockSize.Text =
$"Device's minimum block size is {blockLimits.Value.minBlockLen} bytes";
if(blockLimits.Value.granularity > 0)
{
lblBlockSizeGranularity.Visible = true;
+
lblBlockSizeGranularity.Text =
$"Device's needs a block size granularity of 2^{blockLimits.Value.granularity} ({Math.Pow(2, blockLimits.Value.granularity)}) bytes";
}
@@ -298,7 +312,8 @@ namespace DiscImageChef.Gui.Panels
}
}
- tabSdMmcInfo tabSdMmcInfo = new tabSdMmcInfo();
+ var tabSdMmcInfo = new tabSdMmcInfo();
+
tabSdMmcInfo.LoadData(devInfo.Type, devInfo.CID, devInfo.CSD, devInfo.OCR, devInfo.ExtendedCSD,
devInfo.SCR);
@@ -307,13 +322,23 @@ namespace DiscImageChef.Gui.Panels
protected void OnBtnSaveUsbDescriptors(object sender, EventArgs e)
{
- SaveFileDialog dlgSaveBinary = new SaveFileDialog();
- dlgSaveBinary.Filters.Add(new FileFilter {Extensions = new[] {"*.bin"}, Name = "Binary"});
+ var dlgSaveBinary = new SaveFileDialog();
+
+ dlgSaveBinary.Filters.Add(new FileFilter
+ {
+ Extensions = new[]
+ {
+ "*.bin"
+ },
+ Name = "Binary"
+ });
+
DialogResult result = dlgSaveBinary.ShowDialog(this);
- if(result != DialogResult.Ok) return;
+ if(result != DialogResult.Ok)
+ return;
- FileStream saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create);
+ var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create);
saveFs.Write(devInfo.UsbDescriptors, 0, devInfo.UsbDescriptors.Length);
saveFs.Close();
diff --git a/DiscImageChef/Commands/Device/DeviceReport.cs b/DiscImageChef/Commands/Device/DeviceReport.cs
index 2ab8d5e8c..70f4e1f63 100644
--- a/DiscImageChef/Commands/Device/DeviceReport.cs
+++ b/DiscImageChef/Commands/Device/DeviceReport.cs
@@ -129,19 +129,19 @@ namespace DiscImageChef.Commands.Device
var report = new DeviceReportV2
{
- Manufacturer = dev.Manufacturer, Model = dev.Model, Revision = dev.Revision, Type = dev.Type
+ Manufacturer = dev.Manufacturer, Model = dev.Model, Revision = dev.FirmwareRevision, Type = dev.Type
};
bool removable = false;
string jsonFile;
if(!string.IsNullOrWhiteSpace(dev.Manufacturer) &&
- !string.IsNullOrWhiteSpace(dev.Revision))
- jsonFile = dev.Manufacturer + "_" + dev.Model + "_" + dev.Revision + ".json";
+ !string.IsNullOrWhiteSpace(dev.FirmwareRevision))
+ jsonFile = dev.Manufacturer + "_" + dev.Model + "_" + dev.FirmwareRevision + ".json";
else if(!string.IsNullOrWhiteSpace(dev.Manufacturer))
jsonFile = dev.Manufacturer + "_" + dev.Model + ".json";
- else if(!string.IsNullOrWhiteSpace(dev.Revision))
- jsonFile = dev.Model + "_" + dev.Revision + ".json";
+ else if(!string.IsNullOrWhiteSpace(dev.FirmwareRevision))
+ jsonFile = dev.Model + "_" + dev.FirmwareRevision + ".json";
else
jsonFile = dev.Model + ".json";
diff --git a/DiscImageChef/Commands/Device/Info.cs b/DiscImageChef/Commands/Device/Info.cs
index 7e2bee24c..dcb30c047 100644
--- a/DiscImageChef/Commands/Device/Info.cs
+++ b/DiscImageChef/Commands/Device/Info.cs
@@ -1078,7 +1078,7 @@ namespace DiscImageChef.Commands.Device
// Search for device in master database
Database.Models.Device dbDev =
ctx.Devices.FirstOrDefault(d => d.Manufacturer == dev.Manufacturer && d.Model == dev.Model &&
- d.Revision == dev.Revision);
+ d.Revision == dev.FirmwareRevision);
if(dbDev is null)
DicConsole.WriteLine("Device not in database, please create a device report and attach it to a Github issue.");
diff --git a/DiscImageChef/Commands/Media/Info.cs b/DiscImageChef/Commands/Media/Info.cs
index ff32784e6..19e9f0854 100644
--- a/DiscImageChef/Commands/Media/Info.cs
+++ b/DiscImageChef/Commands/Media/Info.cs
@@ -557,7 +557,7 @@ namespace DiscImageChef.Commands.Media
// Search for device in master database
Database.Models.Device dbDev =
ctx.Devices.FirstOrDefault(d => d.Manufacturer == dev.Manufacturer && d.Model == dev.Model &&
- d.Revision == dev.Revision);
+ d.Revision == dev.FirmwareRevision);
Dump.SolveTrackPregaps(dev, null, null, tracks, supportsPqSubchannel, supportsRwSubchannel, dbDev,
out bool inexactPositioning);