diff --git a/DiscImageChef.Devices/Device/Constructor.cs b/DiscImageChef.Devices/Device/Constructor.cs index 3519f9257..5ee6e8439 100644 --- a/DiscImageChef.Devices/Device/Constructor.cs +++ b/DiscImageChef.Devices/Device/Constructor.cs @@ -40,7 +40,6 @@ 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; @@ -63,23 +62,35 @@ namespace DiscImageChef.Devices /// Device path public Device(string devicePath) { - PlatformId = DetectOS.GetRealPlatformID(); - Timeout = 15; - Error = false; + PlatformId = DetectOS.GetRealPlatformID(); + Timeout = 15; + Error = false; IsRemovable = false; - switch(PlatformId) + if (devicePath.StartsWith("dic://")) + { + devicePath = devicePath.Substring(6); + var pieces = devicePath.Split('/'); + var host = pieces[0]; + devicePath = devicePath.Substring(host.Length); + + remote = new Remote.Remote(host); + + throw new NotImplementedException("Remote devices not yet implemented..."); + } + + 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(); } @@ -89,22 +100,25 @@ 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(); } } - else Error = true; + else + { + Error = true; + } LastError = Marshal.GetLastWin32Error(); } @@ -115,80 +129,81 @@ 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(); } - CamDevice 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 - InvalidOperationException("Parallel ATA devices are not supported on FreeBSD due to upstream bug #224250."); + InvalidOperationException( + "Parallel ATA devices are not supported on FreeBSD due to upstream bug #224250."); break; } default: throw new InvalidOperationException($"Platform {PlatformId} not yet supported."); } - if(Error) throw new SystemException($"Error {LastError} opening device."); + if (Error) throw new SystemException($"Error {LastError} opening device."); - Type = DeviceType.Unknown; + Type = DeviceType.Unknown; ScsiType = PeripheralDeviceTypes.UnknownDevice; byte[] ataBuf; byte[] inqBuf = null; - if(Error) throw new SystemException($"Error {LastError} trying device."); + if (Error) throw new SystemException($"Error {LastError} trying device."); - bool scsiSense = true; + var scsiSense = true; // Windows is answering SCSI INQUIRY for all device types so it needs to be detected first - switch(PlatformId) + switch (PlatformId) { case PlatformID.Win32NT: - StoragePropertyQuery query = new StoragePropertyQuery(); - query.PropertyId = StoragePropertyId.Device; - query.QueryType = StorageQueryType.Standard; + var query = new StoragePropertyQuery(); + query.PropertyId = StoragePropertyId.Device; + query.QueryType = StorageQueryType.Standard; query.AdditionalParameters = new byte[1]; - IntPtr descriptorPtr = Marshal.AllocHGlobal(1000); - byte[] descriptorB = new byte[1000]; + var descriptorPtr = Marshal.AllocHGlobal(1000); + var descriptorB = new byte[1000]; uint returned = 0; - int error = 0; + var error = 0; - bool hasError = !Extern.DeviceIoControlStorageQuery((SafeFileHandle)FileHandle, - WindowsIoctl.IoctlStorageQueryProperty, - ref query, (uint)Marshal.SizeOf(query), - descriptorPtr, 1000, ref returned, IntPtr.Zero); + var 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) { - StorageDeviceDescriptor descriptor = new StorageDeviceDescriptor + var descriptor = new StorageDeviceDescriptor { - 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), + 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), 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) + switch (descriptor.BusType) { case StorageBusType.SCSI: case StorageBusType.SSA: @@ -199,11 +214,11 @@ namespace DiscImageChef.Devices 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; @@ -223,23 +238,26 @@ namespace DiscImageChef.Devices break; } - switch(Type) + switch (Type) { case DeviceType.SCSI: case DeviceType.ATAPI: scsiSense = ScsiInquiry(out inqBuf, out _); break; case DeviceType.ATA: - bool atapiSense = AtapiIdentify(out ataBuf, out _); + var atapiSense = AtapiIdentify(out ataBuf, out _); - if(!atapiSense) + if (!atapiSense) { Type = DeviceType.ATAPI; - Identify.IdentifyDevice? ataid = Identify.Decode(ataBuf); + var ataid = Identify.Decode(ataBuf); - if(ataid.HasValue) scsiSense = ScsiInquiry(out inqBuf, out _); + if (ataid.HasValue) scsiSense = ScsiInquiry(out inqBuf, out _); + } + else + { + Manufacturer = "ATA"; } - else Manufacturer = "ATA"; break; } @@ -247,17 +265,17 @@ namespace DiscImageChef.Devices Marshal.FreeHGlobal(descriptorPtr); - if(Windows.Command.IsSdhci((SafeFileHandle)FileHandle)) + if (Windows.Command.IsSdhci((SafeFileHandle) FileHandle)) { - byte[] sdBuffer = new byte[16]; + var 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 bool 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 var sense); - if(!sense) + if (!sense) { cachedCsd = new byte[16]; Array.Copy(sdBuffer, 0, cachedCsd, 0, 16); @@ -265,13 +283,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); @@ -279,31 +297,31 @@ 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); } - if(cachedScr != null) + if (cachedScr != null) { sdBuffer = new byte[4]; - LastError = Windows.Command.SendMmcCommand((SafeFileHandle)FileHandle, - (MmcCommands)SecureDigitalCommands - .SendOperatingCondition, false, true, - MmcFlags.ResponseSpiR3 | MmcFlags.ResponseR3 | - MmcFlags.CommandBcr, 0, 4, 1, ref sdBuffer, - out _, out _, out sense); + LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle, + (MmcCommands) SecureDigitalCommands + .SendOperatingCondition, 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); @@ -313,13 +331,13 @@ namespace DiscImageChef.Devices { sdBuffer = new byte[4]; - LastError = Windows.Command.SendMmcCommand((SafeFileHandle)FileHandle, - 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, + 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); @@ -329,40 +347,42 @@ 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)) - scsiSense = ScsiInquiry(out inqBuf, out _); - // MultiMediaCard and SecureDigital go here - else if(devicePath.StartsWith("/dev/mmcblk", StringComparison.Ordinal)) + if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) || + devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) || + devicePath.StartsWith("/dev/st", StringComparison.Ordinal)) { - string devPath = devicePath.Substring(5); - if(File.Exists("/sys/block/" + devPath + "/device/csd")) + scsiSense = ScsiInquiry(out inqBuf, out _); + } + // MultiMediaCard and SecureDigital go here + else if (devicePath.StartsWith("/dev/mmcblk", StringComparison.Ordinal)) + { + var devPath = devicePath.Substring(5); + if (File.Exists("/sys/block/" + devPath + "/device/csd")) { - int len = + var len = ConvertFromHexAscii("/sys/block/" + devPath + "/device/csd", out cachedCsd); - if(len == 0) cachedCsd = null; + if (len == 0) cachedCsd = null; } - if(File.Exists("/sys/block/" + devPath + "/device/cid")) + if (File.Exists("/sys/block/" + devPath + "/device/cid")) { - int len = + var len = ConvertFromHexAscii("/sys/block/" + devPath + "/device/cid", out cachedCid); - if(len == 0) cachedCid = null; + if (len == 0) cachedCid = null; } - if(File.Exists("/sys/block/" + devPath + "/device/scr")) + if (File.Exists("/sys/block/" + devPath + "/device/scr")) { - int len = + var len = ConvertFromHexAscii("/sys/block/" + devPath + "/device/scr", out cachedScr); - if(len == 0) cachedScr = null; + if (len == 0) cachedScr = null; } - if(File.Exists("/sys/block/" + devPath + "/device/ocr")) + if (File.Exists("/sys/block/" + devPath + "/device/ocr")) { - int len = + var len = ConvertFromHexAscii("/sys/block/" + devPath + "/device/ocr", out cachedOcr); - if(len == 0) cachedOcr = null; + if (len == 0) cachedOcr = null; } } @@ -373,91 +393,94 @@ 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; - CID decoded = Decoders.SecureDigital.Decoders.DecodeCID(cachedCid); + var decoded = Decoders.SecureDigital.Decoders.DecodeCID(cachedCid); Manufacturer = VendorString.Prettify(decoded.Manufacturer); - Model = decoded.ProductName; - Revision = $"{(decoded.ProductRevision & 0xF0) >> 4:X2}.{decoded.ProductRevision & 0x0F:X2}"; - Serial = $"{decoded.ProductSerialNumber}"; + Model = decoded.ProductName; + Revision = $"{(decoded.ProductRevision & 0xF0) >> 4:X2}.{decoded.ProductRevision & 0x0F:X2}"; + Serial = $"{decoded.ProductSerialNumber}"; } else { Type = DeviceType.MMC; - Decoders.MMC.CID decoded = Decoders.MMC.Decoders.DecodeCID(cachedCid); + var 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}"; - Serial = $"{decoded.ProductSerialNumber}"; + Model = decoded.ProductName; + Revision = $"{(decoded.ProductRevision & 0xF0) >> 4:X2}.{decoded.ProductRevision & 0x0F:X2}"; + Serial = $"{decoded.ProductSerialNumber}"; } } + #endregion SecureDigital / MultiMediaCard #region USB - 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)) { - string devPath = devicePath.Substring(5); - if(Directory.Exists("/sys/block/" + devPath)) + var devPath = devicePath.Substring(5); + if (Directory.Exists("/sys/block/" + devPath)) { - string resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath); + var resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath); resolvedLink = "/sys" + resolvedLink.Substring(2); - if(!string.IsNullOrEmpty(resolvedLink)) - while(resolvedLink.Contains("usb")) + if (!string.IsNullOrEmpty(resolvedLink)) + 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; - FileStream usbFs = new FileStream(resolvedLink + "/descriptors", - System.IO.FileMode.Open, - System.IO.FileAccess.Read); - byte[] usbBuf = new byte[65536]; - int usbCount = usbFs.Read(usbBuf, 0, 65536); + 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); UsbDescriptors = new byte[usbCount]; Array.Copy(usbBuf, 0, UsbDescriptors, 0, usbCount); usbFs.Close(); - StreamReader usbSr = new StreamReader(resolvedLink + "/idProduct"); - string usbTemp = usbSr.ReadToEnd(); + var usbSr = new StreamReader(resolvedLink + "/idProduct"); + var 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(); } @@ -473,22 +496,22 @@ namespace DiscImageChef.Devices Usb.UsbDevice usbDevice = null; // I have to search for USB disks, floppies and CD-ROMs as separate device types - foreach(string devGuid in new[] + foreach (var devGuid in new[] { Usb.GuidDevinterfaceFloppy, Usb.GuidDevinterfaceCdrom, Usb.GuidDevinterfaceDisk }) { 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 } @@ -498,55 +521,57 @@ namespace DiscImageChef.Devices IsUsb = false; break; } + #endregion USB #region FireWire - 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)) { - string devPath = devicePath.Substring(5); - if(Directory.Exists("/sys/block/" + devPath)) + var devPath = devicePath.Substring(5); + if (Directory.Exists("/sys/block/" + devPath)) { - string resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath); + var 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; + if (!File.Exists(resolvedLink + "/model") || !File.Exists(resolvedLink + "/vendor") || + !File.Exists(resolvedLink + "/guid")) continue; - StreamReader fwSr = new StreamReader(resolvedLink + "/model"); - string fwTemp = fwSr.ReadToEnd(); + var fwSr = new StreamReader(resolvedLink + "/model"); + var 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(); } @@ -558,41 +583,46 @@ namespace DiscImageChef.Devices } } // TODO: Implement for other operating systems - else IsFireWire = false; + else + { + IsFireWire = false; + } + #endregion FireWire #region PCMCIA - 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)) { - string devPath = devicePath.Substring(5); - if(Directory.Exists("/sys/block/" + devPath)) + var devPath = devicePath.Substring(5); + if (Directory.Exists("/sys/block/" + devPath)) { - string resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath); + var 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; + if (!Directory.Exists(resolvedLink + "/pcmcia_socket")) continue; - string[] subdirs = Directory.GetDirectories(resolvedLink + "/pcmcia_socket", - "pcmcia_socket*", - SearchOption.TopDirectoryOnly); + var subdirs = Directory.GetDirectories(resolvedLink + "/pcmcia_socket", + "pcmcia_socket*", + SearchOption.TopDirectoryOnly); - if(subdirs.Length <= 0) continue; + if (subdirs.Length <= 0) continue; - string possibleDir = Path.Combine(resolvedLink, "pcmcia_socket", subdirs[0]); - if(!File.Exists(possibleDir + "/card_type") || !File.Exists(possibleDir + "/cis")) + var possibleDir = Path.Combine(resolvedLink, "pcmcia_socket", subdirs[0]); + if (!File.Exists(possibleDir + "/card_type") || !File.Exists(possibleDir + "/cis")) continue; - FileStream cisFs = new FileStream(possibleDir + "/cis", System.IO.FileMode.Open, - System.IO.FileAccess.Read); - byte[] cisBuf = new byte[65536]; - int cisCount = cisFs.Read(cisBuf, 0, 65536); + 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); Cis = new byte[cisCount]; Array.Copy(cisBuf, 0, Cis, 0, cisCount); cisFs.Close(); @@ -604,69 +634,76 @@ namespace DiscImageChef.Devices } } // TODO: Implement for other operating systems - else IsPcmcia = false; + else + { + IsPcmcia = false; + } + #endregion PCMCIA - if(!scsiSense) + if (!scsiSense) { - Inquiry.SCSIInquiry? inquiry = Inquiry.Decode(inqBuf); + var inquiry = Inquiry.Decode(inqBuf); Type = DeviceType.SCSI; - bool serialSense = ScsiInquiry(out inqBuf, out _, 0x80); - if(!serialSense) Serial = EVPD.DecodePage80(inqBuf); + var serialSense = ScsiInquiry(out inqBuf, out _, 0x80); + if (!serialSense) Serial = EVPD.DecodePage80(inqBuf); - if(inquiry.HasValue) + if (inquiry.HasValue) { - string tmp = StringHandlers.CToString(inquiry.Value.ProductRevisionLevel); - if(tmp != null) Revision = tmp.Trim(); + var tmp = StringHandlers.CToString(inquiry.Value.ProductRevisionLevel); + if (tmp != null) Revision = 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; } - bool atapiSense = AtapiIdentify(out ataBuf, out _); + var atapiSense = AtapiIdentify(out ataBuf, out _); - if(!atapiSense) + if (!atapiSense) { Type = DeviceType.ATAPI; - Identify.IdentifyDevice? ataId = Identify.Decode(ataBuf); + var 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") { - bool ataSense = AtaIdentify(out ataBuf, out _); - if(!ataSense) + var ataSense = AtaIdentify(out ataBuf, out _); + if (!ataSense) { Type = DeviceType.ATA; - Identify.IdentifyDevice? ataid = Identify.Decode(ataBuf); + var ataid = Identify.Decode(ataBuf); - if(ataid.HasValue) + if (ataid.HasValue) { - string[] separated = ataid.Value.Model.Split(' '); + var separated = ataid.Value.Model.Split(' '); - if(separated.Length == 1) Model = separated[0]; + 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; + 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; @@ -675,69 +712,72 @@ namespace DiscImageChef.Devices } } - if(Type == DeviceType.Unknown) + if (Type == DeviceType.Unknown) { Manufacturer = null; - Model = null; - Revision = null; - Serial = null; + Model = null; + Revision = 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(char c in Serial.Where(char.IsControl)) + foreach (var 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(char c in Serial.Where(char.IsControl)) + foreach (var 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; - bool featureSense = GetConfiguration(out byte[] featureBuffer, out _, 0x0108, MmcGetConfigurationRt.Single, - Timeout, out _); + var featureSense = GetConfiguration(out var featureBuffer, out _, 0x0108, MmcGetConfigurationRt.Single, + Timeout, out _); - if(featureSense) return; + if (featureSense) return; - Features.SeparatedFeatures features = Features.Separate(featureBuffer); - if(features.Descriptors?.Length != 1 || features.Descriptors[0].Code != 0x0108) return; + var features = Features.Separate(featureBuffer); + if (features.Descriptors?.Length != 1 || features.Descriptors[0].Code != 0x0108) return; - Feature_0108? serialFeature = Features.Decode_0108(features.Descriptors[0].Data); + var serialFeature = Features.Decode_0108(features.Descriptors[0].Data); - if(serialFeature is null) return; + if (serialFeature is null) return; Serial = serialFeature.Value.Serial; } - static int ConvertFromHexAscii(string file, out byte[] outBuf) + private static int ConvertFromHexAscii(string file, out byte[] outBuf) { - StreamReader sr = new StreamReader(file); - string ins = sr.ReadToEnd().Trim(); + var sr = new StreamReader(file); + var ins = sr.ReadToEnd().Trim(); outBuf = new byte[ins.Length / 2]; - int count = 0; + var count = 0; try { - for(int i = 0; i < ins.Length; i += 2) + for (var i = 0; i < ins.Length; i += 2) { outBuf[i / 2] = Convert.ToByte(ins.Substring(i, 2), 16); count++; } } - catch { count = 0; } + catch + { + count = 0; + } sr.Close(); return count; diff --git a/DiscImageChef.Devices/Device/Variables.cs b/DiscImageChef.Devices/Device/Variables.cs index df2253d10..007053a1e 100644 --- a/DiscImageChef.Devices/Device/Variables.cs +++ b/DiscImageChef.Devices/Device/Variables.cs @@ -38,18 +38,18 @@ namespace DiscImageChef.Devices { public partial class Device { - readonly ushort usbVendor; - readonly ushort usbProduct; - readonly ulong firewireGuid; - readonly uint firewireModel; - readonly uint firewireVendor; + private readonly ushort usbVendor; + private readonly ushort usbProduct; + private readonly ulong firewireGuid; + private readonly uint firewireModel; + private readonly uint firewireVendor; // MMC and SecureDigital, values that need to be get with card idle, something that may // not be possible to do but usually is already done by the SDHCI driver. - readonly byte[] cachedCsd; - readonly byte[] cachedCid; - readonly byte[] cachedScr; - readonly byte[] cachedOcr; + private readonly byte[] cachedCsd; + private readonly byte[] cachedCid; + private readonly byte[] cachedScr; + private readonly byte[] cachedOcr; /// /// Gets the Platform ID for this device @@ -217,5 +217,7 @@ namespace DiscImageChef.Devices /// Contains the PCMCIA CIS if applicable /// public byte[] Cis { get; } + + private readonly Remote.Remote remote; } } \ No newline at end of file