diff --git a/DiscImageChef.Devices/Device/Constructor.cs b/DiscImageChef.Devices/Device/Constructor.cs index 8ff6e2f16..e1d8ab5e9 100644 --- a/DiscImageChef.Devices/Device/Constructor.cs +++ b/DiscImageChef.Devices/Device/Constructor.cs @@ -451,106 +451,125 @@ namespace DiscImageChef.Devices #region USB - switch (PlatformId) + if (remote is null) { - case PlatformID.Linux: - 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)) + switch (PlatformId) + { + case PlatformID.Linux: + if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) || + devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) || + devicePath.StartsWith("/dev/st", StringComparison.Ordinal)) { - var resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath); - if (!string.IsNullOrEmpty(resolvedLink)) + var devPath = devicePath.Substring(5); + if (Directory.Exists("/sys/block/" + devPath)) { - resolvedLink = "/sys" + resolvedLink.Substring(2); - - while (resolvedLink.Contains("usb")) + var resolvedLink = Linux.Command.ReadLink("/sys/block/" + devPath); + if (!string.IsNullOrEmpty(resolvedLink)) { - resolvedLink = Path.GetDirectoryName(resolvedLink); - if (!File.Exists(resolvedLink + "/descriptors") || - !File.Exists(resolvedLink + "/idProduct") || - !File.Exists(resolvedLink + "/idVendor")) continue; + resolvedLink = "/sys" + resolvedLink.Substring(2); - 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(); - - var usbSr = new StreamReader(resolvedLink + "/idProduct"); - var usbTemp = usbSr.ReadToEnd(); - ushort.TryParse(usbTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture, - out usbProduct); - usbSr.Close(); - - usbSr = new StreamReader(resolvedLink + "/idVendor"); - usbTemp = usbSr.ReadToEnd(); - ushort.TryParse(usbTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture, - out usbVendor); - usbSr.Close(); - - if (File.Exists(resolvedLink + "/manufacturer")) + while (resolvedLink.Contains("usb")) { - usbSr = new StreamReader(resolvedLink + "/manufacturer"); - UsbManufacturerString = usbSr.ReadToEnd().Trim(); - usbSr.Close(); - } + resolvedLink = Path.GetDirectoryName(resolvedLink); + if (!File.Exists(resolvedLink + "/descriptors") || + !File.Exists(resolvedLink + "/idProduct") || + !File.Exists(resolvedLink + "/idVendor")) continue; - if (File.Exists(resolvedLink + "/product")) - { - usbSr = new StreamReader(resolvedLink + "/product"); - UsbProductString = usbSr.ReadToEnd().Trim(); - usbSr.Close(); - } + 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(); - if (File.Exists(resolvedLink + "/serial")) - { - usbSr = new StreamReader(resolvedLink + "/serial"); - UsbSerialString = usbSr.ReadToEnd().Trim(); + var usbSr = new StreamReader(resolvedLink + "/idProduct"); + var usbTemp = usbSr.ReadToEnd(); + ushort.TryParse(usbTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture, + out usbProduct); usbSr.Close(); - } - IsUsb = true; - break; + usbSr = new StreamReader(resolvedLink + "/idVendor"); + usbTemp = usbSr.ReadToEnd(); + ushort.TryParse(usbTemp, NumberStyles.HexNumber, CultureInfo.InvariantCulture, + out usbVendor); + usbSr.Close(); + + if (File.Exists(resolvedLink + "/manufacturer")) + { + usbSr = new StreamReader(resolvedLink + "/manufacturer"); + UsbManufacturerString = usbSr.ReadToEnd().Trim(); + usbSr.Close(); + } + + if (File.Exists(resolvedLink + "/product")) + { + usbSr = new StreamReader(resolvedLink + "/product"); + UsbProductString = usbSr.ReadToEnd().Trim(); + usbSr.Close(); + } + + if (File.Exists(resolvedLink + "/serial")) + { + usbSr = new StreamReader(resolvedLink + "/serial"); + UsbSerialString = usbSr.ReadToEnd().Trim(); + usbSr.Close(); + } + + IsUsb = true; + break; + } } } } - } - break; - case PlatformID.Win32NT: - Usb.UsbDevice usbDevice = null; + break; + case PlatformID.Win32NT: + Usb.UsbDevice usbDevice = null; - // I have to search for USB disks, floppies and CD-ROMs as separate device types - foreach (var devGuid in new[] - { - Usb.GuidDevinterfaceFloppy, Usb.GuidDevinterfaceCdrom, Usb.GuidDevinterfaceDisk - }) - { - usbDevice = Usb.FindDrivePath(devicePath, devGuid); - if (usbDevice != null) break; - } + // I have to search for USB disks, floppies and CD-ROMs as separate device types + foreach (var devGuid in new[] + { + Usb.GuidDevinterfaceFloppy, Usb.GuidDevinterfaceCdrom, Usb.GuidDevinterfaceDisk + }) + { + usbDevice = Usb.FindDrivePath(devicePath, devGuid); + if (usbDevice != null) break; + } - if (usbDevice != null) - { - UsbDescriptors = usbDevice.BinaryDescriptors; - usbVendor = (ushort) usbDevice.DeviceDescriptor.idVendor; - usbProduct = (ushort) usbDevice.DeviceDescriptor.idProduct; - UsbManufacturerString = usbDevice.Manufacturer; - UsbProductString = usbDevice.Product; - UsbSerialString = - usbDevice.SerialNumber; // This is incorrect filled by Windows with SCSI/ATA serial number - } + if (usbDevice != null) + { + UsbDescriptors = usbDevice.BinaryDescriptors; + usbVendor = (ushort) usbDevice.DeviceDescriptor.idVendor; + usbProduct = (ushort) usbDevice.DeviceDescriptor.idProduct; + UsbManufacturerString = usbDevice.Manufacturer; + UsbProductString = usbDevice.Product; + UsbSerialString = + usbDevice + .SerialNumber; // This is incorrect filled by Windows with SCSI/ATA serial number + } - break; - default: - IsUsb = false; - break; + 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)) + { + IsUsb = true; + UsbDescriptors = remoteUsbDescriptors; + usbVendor = remoteUsbVendor; + usbProduct = remoteUsbProduct; + UsbManufacturerString = remoteUsbManufacturer; + UsbProductString = remoteUsbProductString; + UsbSerialString = remoteUsbSerial; + } } #endregion USB diff --git a/DiscImageChef.Devices/Remote/Remote.cs b/DiscImageChef.Devices/Remote/Remote.cs index e4ea12631..be903222f 100644 --- a/DiscImageChef.Devices/Remote/Remote.cs +++ b/DiscImageChef.Devices/Remote/Remote.cs @@ -625,7 +625,82 @@ namespace DiscImageChef.Devices.Remote public bool GetUsbData(out byte[] descriptors, out ushort idVendor, out ushort idProduct, out string manufacturer, out string product, out string serial) { - throw new NotImplementedException("Getting USB data not yet implemented..."); + descriptors = null; + idVendor = 0; + idProduct = 0; + manufacturer = null; + product = null; + serial = null; + + var cmdPkt = new DicPacketCmdGetSdhciRegisters + { + hdr = new DicPacketHeader + { + id = Consts.PacketId, + len = (uint) Marshal.SizeOf(), + version = Consts.PacketVersion, + packetType = DicPacketType.CommandGetUsbData + } + }; + + var buf = Marshal.StructureToByteArrayLittleEndian(cmdPkt); + + var len = _socket.Send(buf, SocketFlags.None); + + if (len != buf.Length) + { + DicConsole.ErrorWriteLine("Could not write to the network..."); + return false; + } + + var hdrBuf = new byte[Marshal.SizeOf()]; + + len = _socket.Receive(hdrBuf, hdrBuf.Length, SocketFlags.Peek); + + if (len < hdrBuf.Length) + { + DicConsole.ErrorWriteLine("Could not read from the network..."); + return false; + } + + var hdr = Marshal.ByteArrayToStructureLittleEndian(hdrBuf); + + if (hdr.id != Consts.PacketId) + { + DicConsole.ErrorWriteLine("Received data is not a DIC Remote Packet..."); + return false; + } + + if (hdr.packetType != DicPacketType.ResponseGetUsbData) + { + DicConsole.ErrorWriteLine("Expected USB Data Response Packet, got packet type {0}...", + hdr.packetType); + return false; + } + + buf = new byte[hdr.len]; + len = _socket.Receive(buf, buf.Length, SocketFlags.None); + + if (len < buf.Length) + { + DicConsole.ErrorWriteLine("Could not read from the network..."); + return false; + } + + var res = Marshal.ByteArrayToStructureLittleEndian(buf); + + if (!res.isUsb) + return false; + + descriptors = new byte[res.descLen]; + Array.Copy(res.descriptors, 0, descriptors, 0, res.descLen); + idVendor = res.idVendor; + idProduct = res.idProduct; + manufacturer = res.manufacturer; + product = res.product; + serial = res.serial; + + return true; } public bool GetFirewireData(out uint idVendor, out uint idProduct,