From 53a8a11408ca368e6b5cac03b5b793e91a556f2a Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 13 Oct 2019 23:31:56 +0100 Subject: [PATCH] Add stubs for remote device commands. --- DiscImageChef.Devices/Command.cs | 256 +++++++++++------------ DiscImageChef.Devices/Device/Commands.cs | 138 +++++++----- DiscImageChef.Devices/Remote/Remote.cs | 42 ++++ 3 files changed, 257 insertions(+), 179 deletions(-) diff --git a/DiscImageChef.Devices/Command.cs b/DiscImageChef.Devices/Command.cs index 827e72cf1..b9cdb1f97 100644 --- a/DiscImageChef.Devices/Command.cs +++ b/DiscImageChef.Devices/Command.cs @@ -40,7 +40,7 @@ using PlatformID = DiscImageChef.CommonTypes.Interop.PlatformID; namespace DiscImageChef.Devices { - static class Command + internal static class Command { /// /// Sends a SCSI command @@ -58,15 +58,15 @@ namespace DiscImageChef.Devices /// sense /// /// If the specified platform is not supported - internal static int SendScsiCommand(object fd, byte[] cdb, ref byte[] buffer, - out byte[] senseBuffer, - uint timeout, ScsiDirection direction, out double duration, - out bool sense) + internal static int SendScsiCommand(object fd, byte[] cdb, ref byte[] buffer, + out byte[] senseBuffer, + uint timeout, ScsiDirection direction, out double duration, + out bool sense) { - PlatformID ptId = DetectOS.GetRealPlatformID(); + var ptId = DetectOS.GetRealPlatformID(); return SendScsiCommand(ptId, fd, cdb, ref buffer, out senseBuffer, timeout, direction, out duration, - out sense); + out sense); } /// @@ -87,17 +87,17 @@ namespace DiscImageChef.Devices /// /// If the specified platform is not supported internal static int SendScsiCommand(PlatformID ptId, object fd, byte[] cdb, - ref byte[] buffer, - out byte[] senseBuffer, uint timeout, ScsiDirection direction, - out double duration, out bool sense) + ref byte[] buffer, + out byte[] senseBuffer, uint timeout, ScsiDirection direction, + out double duration, out bool sense) { - switch(ptId) + switch (ptId) { case PlatformID.Win32NT: { ScsiIoctlDirection dir; - switch(direction) + switch (direction) { case ScsiDirection.In: dir = ScsiIoctlDirection.In; @@ -110,14 +110,14 @@ namespace DiscImageChef.Devices break; } - return Windows.Command.SendScsiCommand((SafeFileHandle)fd, cdb, ref buffer, out senseBuffer, - timeout, dir, out duration, out sense); + return Windows.Command.SendScsiCommand((SafeFileHandle) fd, cdb, ref buffer, out senseBuffer, + timeout, dir, out duration, out sense); } case PlatformID.Linux: { Linux.ScsiIoctlDirection dir; - switch(direction) + switch (direction) { case ScsiDirection.In: dir = Linux.ScsiIoctlDirection.In; @@ -136,14 +136,14 @@ namespace DiscImageChef.Devices break; } - return Linux.Command.SendScsiCommand((int)fd, cdb, ref buffer, out senseBuffer, timeout, dir, - out duration, out sense); + return Linux.Command.SendScsiCommand((int) fd, cdb, ref buffer, out senseBuffer, timeout, dir, + out duration, out sense); } case PlatformID.FreeBSD: { CcbFlags flags = 0; - switch(direction) + switch (direction) { case ScsiDirection.In: flags = CcbFlags.CamDirIn; @@ -160,10 +160,10 @@ namespace DiscImageChef.Devices } return IntPtr.Size == 8 - ? FreeBSD.Command.SendScsiCommand64((IntPtr)fd, cdb, ref buffer, out senseBuffer, - timeout, flags, out duration, out sense) - : FreeBSD.Command.SendScsiCommand((IntPtr)fd, cdb, ref buffer, out senseBuffer, timeout, - flags, out duration, out sense); + ? FreeBSD.Command.SendScsiCommand64((IntPtr) fd, cdb, ref buffer, out senseBuffer, + timeout, flags, out duration, out sense) + : FreeBSD.Command.SendScsiCommand((IntPtr) fd, cdb, ref buffer, out senseBuffer, timeout, + flags, out duration, out sense); } default: throw new InvalidOperationException($"Platform {ptId} not yet supported."); } @@ -184,18 +184,18 @@ namespace DiscImageChef.Devices /// What register contains the transfer length /// Set to true if the transfer length is in block, otherwise it is in bytes /// If the specified platform is not supported - internal static int SendAtaCommand(object fd, AtaRegistersChs registers, - out AtaErrorRegistersChs errorRegisters, AtaProtocol protocol, - AtaTransferRegister transferRegister, ref byte[] buffer, - uint timeout, - bool transferBlocks, out double duration, - out bool sense) + internal static int SendAtaCommand(object fd, AtaRegistersChs registers, + out AtaErrorRegistersChs errorRegisters, AtaProtocol protocol, + AtaTransferRegister transferRegister, ref byte[] buffer, + uint timeout, + bool transferBlocks, out double duration, + out bool sense) { - PlatformID ptId = DetectOS.GetRealPlatformID(); + var ptId = DetectOS.GetRealPlatformID(); return SendAtaCommand(ptId, fd, registers, out errorRegisters, protocol, transferRegister, - ref buffer, - timeout, transferBlocks, out duration, out sense); + ref buffer, + timeout, transferBlocks, out duration, out sense); } /// @@ -214,41 +214,41 @@ namespace DiscImageChef.Devices /// What register contains the transfer length /// Set to true if the transfer length is in block, otherwise it is in bytes /// If the specified platform is not supported - internal static int SendAtaCommand(PlatformID ptId, object fd, - AtaRegistersChs registers, - out AtaErrorRegistersChs errorRegisters, AtaProtocol protocol, - AtaTransferRegister transferRegister, ref byte[] buffer, - uint timeout, - bool transferBlocks, out double duration, - out bool sense) + internal static int SendAtaCommand(PlatformID ptId, object fd, + AtaRegistersChs registers, + out AtaErrorRegistersChs errorRegisters, AtaProtocol protocol, + AtaTransferRegister transferRegister, ref byte[] buffer, + uint timeout, + bool transferBlocks, out double duration, + out bool sense) { - switch(ptId) + switch (ptId) { case PlatformID.Win32NT: { - if(Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor == 1 && - (Environment.OSVersion.ServicePack == "Service Pack 1" || - Environment.OSVersion.ServicePack == "") || - Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor == 0) + if (Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor == 1 && + (Environment.OSVersion.ServicePack == "Service Pack 1" || + Environment.OSVersion.ServicePack == "") || + Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor == 0) throw new InvalidOperationException("Windows XP or earlier is not supported."); // Windows NT 4 or earlier, requires special ATA pass thru SCSI. But DiscImageChef cannot run there (or can it?) - if(Environment.OSVersion.Version.Major <= 4) + if (Environment.OSVersion.Version.Major <= 4) throw new InvalidOperationException("Windows NT 4.0 or earlier is not supported."); - return Windows.Command.SendAtaCommand((SafeFileHandle)fd, registers, out errorRegisters, protocol, - ref buffer, timeout, out duration, out sense); + return Windows.Command.SendAtaCommand((SafeFileHandle) fd, registers, out errorRegisters, protocol, + ref buffer, timeout, out duration, out sense); } case PlatformID.Linux: { - return Linux.Command.SendAtaCommand((int)fd, registers, out errorRegisters, protocol, - transferRegister, ref buffer, timeout, transferBlocks, - out duration, out sense); + return Linux.Command.SendAtaCommand((int) fd, registers, out errorRegisters, protocol, + transferRegister, ref buffer, timeout, transferBlocks, + out duration, out sense); } case PlatformID.FreeBSD: { - return FreeBSD.Command.SendAtaCommand((IntPtr)fd, registers, out errorRegisters, protocol, - ref buffer, timeout, out duration, out sense); + return FreeBSD.Command.SendAtaCommand((IntPtr) fd, registers, out errorRegisters, protocol, + ref buffer, timeout, out duration, out sense); } default: throw new InvalidOperationException($"Platform {ptId} not yet supported."); } @@ -269,18 +269,18 @@ namespace DiscImageChef.Devices /// What register contains the transfer length /// Set to true if the transfer length is in block, otherwise it is in bytes /// If the specified platform is not supported - internal static int SendAtaCommand(object fd, AtaRegistersLba28 registers, - out AtaErrorRegistersLba28 errorRegisters, AtaProtocol protocol, - AtaTransferRegister transferRegister, ref byte[] buffer, - uint timeout, - bool transferBlocks, out double duration, - out bool sense) + internal static int SendAtaCommand(object fd, AtaRegistersLba28 registers, + out AtaErrorRegistersLba28 errorRegisters, AtaProtocol protocol, + AtaTransferRegister transferRegister, ref byte[] buffer, + uint timeout, + bool transferBlocks, out double duration, + out bool sense) { - PlatformID ptId = DetectOS.GetRealPlatformID(); + var ptId = DetectOS.GetRealPlatformID(); return SendAtaCommand(ptId, fd, registers, out errorRegisters, protocol, transferRegister, - ref buffer, - timeout, transferBlocks, out duration, out sense); + ref buffer, + timeout, transferBlocks, out duration, out sense); } /// @@ -299,41 +299,41 @@ namespace DiscImageChef.Devices /// What register contains the transfer length /// Set to true if the transfer length is in block, otherwise it is in bytes /// If the specified platform is not supported - internal static int SendAtaCommand(PlatformID ptId, object fd, - AtaRegistersLba28 registers, - out AtaErrorRegistersLba28 errorRegisters, AtaProtocol protocol, - AtaTransferRegister transferRegister, ref byte[] buffer, - uint timeout, - bool transferBlocks, out double duration, - out bool sense) + internal static int SendAtaCommand(PlatformID ptId, object fd, + AtaRegistersLba28 registers, + out AtaErrorRegistersLba28 errorRegisters, AtaProtocol protocol, + AtaTransferRegister transferRegister, ref byte[] buffer, + uint timeout, + bool transferBlocks, out double duration, + out bool sense) { - switch(ptId) + switch (ptId) { case PlatformID.Win32NT: { - if(Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor == 1 && - (Environment.OSVersion.ServicePack == "Service Pack 1" || - Environment.OSVersion.ServicePack == "") || - Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor == 0) + if (Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor == 1 && + (Environment.OSVersion.ServicePack == "Service Pack 1" || + Environment.OSVersion.ServicePack == "") || + Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor == 0) throw new InvalidOperationException("Windows XP or earlier is not supported."); // Windows NT 4 or earlier, requires special ATA pass thru SCSI. But DiscImageChef cannot run there (or can it?) - if(Environment.OSVersion.Version.Major <= 4) + if (Environment.OSVersion.Version.Major <= 4) throw new InvalidOperationException("Windows NT 4.0 or earlier is not supported."); - return Windows.Command.SendAtaCommand((SafeFileHandle)fd, registers, out errorRegisters, protocol, - ref buffer, timeout, out duration, out sense); + return Windows.Command.SendAtaCommand((SafeFileHandle) fd, registers, out errorRegisters, protocol, + ref buffer, timeout, out duration, out sense); } case PlatformID.Linux: { - return Linux.Command.SendAtaCommand((int)fd, registers, out errorRegisters, protocol, - transferRegister, ref buffer, timeout, transferBlocks, - out duration, out sense); + return Linux.Command.SendAtaCommand((int) fd, registers, out errorRegisters, protocol, + transferRegister, ref buffer, timeout, transferBlocks, + out duration, out sense); } case PlatformID.FreeBSD: { - return FreeBSD.Command.SendAtaCommand((IntPtr)fd, registers, out errorRegisters, protocol, - ref buffer, timeout, out duration, out sense); + return FreeBSD.Command.SendAtaCommand((IntPtr) fd, registers, out errorRegisters, protocol, + ref buffer, timeout, out duration, out sense); } default: throw new InvalidOperationException($"Platform {ptId} not yet supported."); } @@ -354,18 +354,18 @@ namespace DiscImageChef.Devices /// What register contains the transfer length /// Set to true if the transfer length is in block, otherwise it is in bytes /// If the specified platform is not supported - internal static int SendAtaCommand(object fd, AtaRegistersLba48 registers, - out AtaErrorRegistersLba48 errorRegisters, AtaProtocol protocol, - AtaTransferRegister transferRegister, ref byte[] buffer, - uint timeout, - bool transferBlocks, out double duration, - out bool sense) + internal static int SendAtaCommand(object fd, AtaRegistersLba48 registers, + out AtaErrorRegistersLba48 errorRegisters, AtaProtocol protocol, + AtaTransferRegister transferRegister, ref byte[] buffer, + uint timeout, + bool transferBlocks, out double duration, + out bool sense) { - PlatformID ptId = DetectOS.GetRealPlatformID(); + var ptId = DetectOS.GetRealPlatformID(); return SendAtaCommand(ptId, fd, registers, out errorRegisters, protocol, transferRegister, - ref buffer, - timeout, transferBlocks, out duration, out sense); + ref buffer, + timeout, transferBlocks, out duration, out sense); } /// @@ -384,32 +384,32 @@ namespace DiscImageChef.Devices /// What register contains the transfer length /// Set to true if the transfer length is in block, otherwise it is in bytes /// If the specified platform is not supported - internal static int SendAtaCommand(PlatformID ptId, object fd, - AtaRegistersLba48 registers, - out AtaErrorRegistersLba48 errorRegisters, AtaProtocol protocol, - AtaTransferRegister transferRegister, ref byte[] buffer, - uint timeout, - bool transferBlocks, out double duration, - out bool sense) + internal static int SendAtaCommand(PlatformID ptId, object fd, + AtaRegistersLba48 registers, + out AtaErrorRegistersLba48 errorRegisters, AtaProtocol protocol, + AtaTransferRegister transferRegister, ref byte[] buffer, + uint timeout, + bool transferBlocks, out double duration, + out bool sense) { - switch(ptId) + switch (ptId) { case PlatformID.Win32NT: { // No check for Windows version. A 48-bit ATA disk simply does not work on earlier systems - return Windows.Command.SendAtaCommand((SafeFileHandle)fd, registers, out errorRegisters, protocol, - ref buffer, timeout, out duration, out sense); + return Windows.Command.SendAtaCommand((SafeFileHandle) fd, registers, out errorRegisters, protocol, + ref buffer, timeout, out duration, out sense); } case PlatformID.Linux: { - return Linux.Command.SendAtaCommand((int)fd, registers, out errorRegisters, protocol, - transferRegister, ref buffer, timeout, transferBlocks, - out duration, out sense); + return Linux.Command.SendAtaCommand((int) fd, registers, out errorRegisters, protocol, + transferRegister, ref buffer, timeout, transferBlocks, + out duration, out sense); } case PlatformID.FreeBSD: { - return FreeBSD.Command.SendAtaCommand((IntPtr)fd, registers, out errorRegisters, protocol, - ref buffer, timeout, out duration, out sense); + return FreeBSD.Command.SendAtaCommand((IntPtr) fd, registers, out errorRegisters, protocol, + ref buffer, timeout, out duration, out sense); } default: throw new InvalidOperationException($"Platform {ptId} not yet supported."); } @@ -433,19 +433,19 @@ namespace DiscImageChef.Devices /// Response registers /// Size of block in bytes /// If the specified platform is not supported - internal static int SendMmcCommand(object fd, MmcCommands command, bool write, - bool isApplication, - MmcFlags flags, uint argument, uint blockSize, - uint blocks, - ref byte[] buffer, out uint[] response, out double duration, - out bool sense, - uint timeout = 0) + internal static int SendMmcCommand(object fd, MmcCommands command, bool write, + bool isApplication, + MmcFlags flags, uint argument, uint blockSize, + uint blocks, + ref byte[] buffer, out uint[] response, out double duration, + out bool sense, + uint timeout = 0) { - PlatformID ptId = DetectOS.GetRealPlatformID(); + var ptId = DetectOS.GetRealPlatformID(); - return SendMmcCommand(ptId, (int)fd, command, write, isApplication, flags, argument, - blockSize, blocks, - ref buffer, out response, out duration, out sense, timeout); + return SendMmcCommand(ptId, (int) fd, command, write, isApplication, flags, argument, + blockSize, blocks, + ref buffer, out response, out duration, out sense, timeout); } /// @@ -468,26 +468,26 @@ namespace DiscImageChef.Devices /// Size of block in bytes /// If the specified platform is not supported internal static int SendMmcCommand(PlatformID ptId, object fd, MmcCommands command, - bool write, - bool isApplication, MmcFlags flags, uint argument, - uint blockSize, - uint blocks, ref byte[] buffer, out uint[] response, - out double duration, - out bool sense, uint timeout = 0) + bool write, + bool isApplication, MmcFlags flags, uint argument, + uint blockSize, + uint blocks, ref byte[] buffer, out uint[] response, + out double duration, + out bool sense, uint timeout = 0) { - switch(ptId) + switch (ptId) { case PlatformID.Win32NT: { - return Windows.Command.SendMmcCommand((SafeFileHandle)fd, command, write, isApplication, flags, - argument, blockSize, blocks, ref buffer, out response, - out duration, out sense, timeout); + return Windows.Command.SendMmcCommand((SafeFileHandle) fd, command, write, isApplication, flags, + argument, blockSize, blocks, ref buffer, out response, + out duration, out sense, timeout); } case PlatformID.Linux: { - return Linux.Command.SendMmcCommand((int)fd, command, write, isApplication, flags, argument, - blockSize, blocks, ref buffer, out response, out duration, - out sense, timeout); + return Linux.Command.SendMmcCommand((int) fd, command, write, isApplication, flags, argument, + blockSize, blocks, ref buffer, out response, out duration, + out sense, timeout); } default: throw new InvalidOperationException($"Platform {ptId} not yet supported."); } diff --git a/DiscImageChef.Devices/Device/Commands.cs b/DiscImageChef.Devices/Device/Commands.cs index 7cc6ec043..0bfc131e7 100644 --- a/DiscImageChef.Devices/Device/Commands.cs +++ b/DiscImageChef.Devices/Device/Commands.cs @@ -53,10 +53,16 @@ namespace DiscImageChef.Devices /// True if SCSI command returned non-OK status and contains /// SCSI sense /// - public int SendScsiCommand(byte[] cdb, ref byte[] buffer, out byte[] senseBuffer, uint timeout, - ScsiDirection direction, out double duration, out bool sense) => - Command.SendScsiCommand(PlatformId, FileHandle, cdb, ref buffer, out senseBuffer, timeout, direction, - out duration, out sense); + public int SendScsiCommand(byte[] cdb, ref byte[] buffer, out byte[] senseBuffer, uint timeout, + ScsiDirection direction, out double duration, out bool sense) + { + if (!(remote is null)) + return remote.SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, + direction, out duration, out sense); + + return Command.SendScsiCommand(PlatformId, FileHandle, cdb, ref buffer, out senseBuffer, timeout, direction, + out duration, out sense); + } /// /// Sends an ATA/ATAPI command to this device using CHS addressing @@ -75,12 +81,17 @@ namespace DiscImageChef.Devices /// Time it took to execute the command in milliseconds /// True if ATA/ATAPI command returned non-OK status public int SendAtaCommand(AtaRegistersChs registers, out AtaErrorRegistersChs errorRegisters, - AtaProtocol protocol, AtaTransferRegister transferRegister, - ref byte[] buffer, - uint timeout, bool transferBlocks, - out double duration, out bool sense) => - Command.SendAtaCommand(PlatformId, FileHandle, registers, out errorRegisters, protocol, transferRegister, - ref buffer, timeout, transferBlocks, out duration, out sense); + AtaProtocol protocol, AtaTransferRegister transferRegister, + ref byte[] buffer, + uint timeout, bool transferBlocks, + out double duration, out bool sense) + { + if (!(remote is null)) throw new NotImplementedException("Remote CHS ATA commands not yet implemented..."); + + return Command.SendAtaCommand(PlatformId, FileHandle, registers, out errorRegisters, protocol, + transferRegister, + ref buffer, timeout, transferBlocks, out duration, out sense); + } /// /// Sends an ATA/ATAPI command to this device using 28-bit LBA addressing @@ -99,12 +110,22 @@ namespace DiscImageChef.Devices /// Time it took to execute the command in milliseconds /// True if ATA/ATAPI command returned non-OK status public int SendAtaCommand(AtaRegistersLba28 registers, out AtaErrorRegistersLba28 errorRegisters, - AtaProtocol protocol, AtaTransferRegister transferRegister, - ref byte[] buffer, - uint timeout, bool transferBlocks, - out double duration, out bool sense) => - Command.SendAtaCommand(PlatformId, FileHandle, registers, out errorRegisters, protocol, transferRegister, - ref buffer, timeout, transferBlocks, out duration, out sense); + AtaProtocol protocol, AtaTransferRegister transferRegister, + ref byte[] buffer, + uint timeout, bool transferBlocks, + out double duration, out bool sense) + { + if (!(remote is null)) + remote.SendAtaCommand(registers, out errorRegisters, + protocol, transferRegister, + ref buffer, + timeout, transferBlocks, + out duration, out sense); + + return Command.SendAtaCommand(PlatformId, FileHandle, registers, out errorRegisters, protocol, + transferRegister, + ref buffer, timeout, transferBlocks, out duration, out sense); + } /// /// Sends an ATA/ATAPI command to this device using 48-bit LBA addressing @@ -123,12 +144,22 @@ namespace DiscImageChef.Devices /// Time it took to execute the command in milliseconds /// True if ATA/ATAPI command returned non-OK status public int SendAtaCommand(AtaRegistersLba48 registers, out AtaErrorRegistersLba48 errorRegisters, - AtaProtocol protocol, AtaTransferRegister transferRegister, - ref byte[] buffer, - uint timeout, bool transferBlocks, - out double duration, out bool sense) => - Command.SendAtaCommand(PlatformId, FileHandle, registers, out errorRegisters, protocol, transferRegister, - ref buffer, timeout, transferBlocks, out duration, out sense); + AtaProtocol protocol, AtaTransferRegister transferRegister, + ref byte[] buffer, + uint timeout, bool transferBlocks, + out double duration, out bool sense) + { + if (!(remote is null)) + remote.SendAtaCommand(registers, out errorRegisters, + protocol, transferRegister, + ref buffer, + timeout, transferBlocks, + out duration, out sense); + + return Command.SendAtaCommand(PlatformId, FileHandle, registers, out errorRegisters, protocol, + transferRegister, + ref buffer, timeout, transferBlocks, out duration, out sense); + } /// /// Sends a MMC/SD command to this device @@ -147,63 +178,68 @@ namespace DiscImageChef.Devices /// Response registers /// Size of block in bytes public int SendMmcCommand(MmcCommands command, bool write, bool isApplication, MmcFlags flags, - uint argument, - uint blockSize, uint blocks, ref byte[] buffer, out uint[] response, - out double duration, out bool sense, uint timeout = 0) + uint argument, + uint blockSize, uint blocks, ref byte[] buffer, out uint[] response, + out double duration, out bool sense, uint timeout = 0) { - switch(command) + switch (command) { case MmcCommands.SendCid when cachedCid != null: { - DateTime start = DateTime.Now; + var start = DateTime.Now; buffer = new byte[cachedCid.Length]; Array.Copy(cachedCid, buffer, buffer.Length); response = new uint[4]; - sense = false; - DateTime end = DateTime.Now; + sense = false; + var end = DateTime.Now; duration = (end - start).TotalMilliseconds; return 0; } case MmcCommands.SendCsd when cachedCid != null: { - DateTime start = DateTime.Now; + var start = DateTime.Now; buffer = new byte[cachedCsd.Length]; Array.Copy(cachedCsd, buffer, buffer.Length); response = new uint[4]; - sense = false; - DateTime end = DateTime.Now; + sense = false; + var end = DateTime.Now; duration = (end - start).TotalMilliseconds; return 0; } - case (MmcCommands)SecureDigitalCommands.SendScr when cachedScr != null: + case (MmcCommands) SecureDigitalCommands.SendScr when cachedScr != null: { - DateTime start = DateTime.Now; + var start = DateTime.Now; buffer = new byte[cachedScr.Length]; Array.Copy(cachedScr, buffer, buffer.Length); response = new uint[4]; - sense = false; - DateTime end = DateTime.Now; + sense = false; + var end = DateTime.Now; + duration = (end - start).TotalMilliseconds; + return 0; + } + case (MmcCommands) SecureDigitalCommands.SendOperatingCondition when cachedOcr != null: + case MmcCommands.SendOpCond when cachedOcr != null: + { + var start = DateTime.Now; + buffer = new byte[cachedOcr.Length]; + Array.Copy(cachedOcr, buffer, buffer.Length); + response = new uint[4]; + sense = false; + var end = DateTime.Now; duration = (end - start).TotalMilliseconds; return 0; } } - if(command != (MmcCommands)SecureDigitalCommands.SendOperatingCondition && - command != MmcCommands.SendOpCond || cachedOcr == null) - return Command.SendMmcCommand(PlatformId, FileHandle, command, write, isApplication, flags, argument, - blockSize, blocks, ref buffer, out response, out duration, out sense, - timeout); + if (!(remote is null)) + remote.SendMmcCommand(command, write, isApplication, flags, + argument, + blockSize, blocks, ref buffer, out response, + out duration, out sense, timeout); - { - DateTime start = DateTime.Now; - buffer = new byte[cachedOcr.Length]; - Array.Copy(cachedOcr, buffer, buffer.Length); - response = new uint[4]; - sense = false; - DateTime end = DateTime.Now; - duration = (end - start).TotalMilliseconds; - return 0; - } + return Command.SendMmcCommand(PlatformId, FileHandle, command, write, isApplication, flags, argument, + blockSize, blocks, ref buffer, out response, out duration, out sense, + timeout); } } } \ No newline at end of file diff --git a/DiscImageChef.Devices/Remote/Remote.cs b/DiscImageChef.Devices/Remote/Remote.cs index c472ba39a..523f61140 100644 --- a/DiscImageChef.Devices/Remote/Remote.cs +++ b/DiscImageChef.Devices/Remote/Remote.cs @@ -7,6 +7,7 @@ using System.Net.Sockets; using System.Runtime.InteropServices; using DiscImageChef.CommonTypes.Interop; using DiscImageChef.Console; +using DiscImageChef.Decoders.ATA; using Marshal = DiscImageChef.Helpers.Marshal; using Version = DiscImageChef.CommonTypes.Interop.Version; @@ -325,5 +326,46 @@ namespace DiscImageChef.Devices.Remote LastError = nop.errno; return false; } + + public int SendScsiCommand(byte[] cdb, ref byte[] buffer, out byte[] senseBuffer, uint timeout, + ScsiDirection direction, out double duration, out bool sense) + { + throw new NotImplementedException("Remote SCSI commands not yet implemented..."); + } + + public int SendAtaCommand(AtaRegistersChs registers, out AtaErrorRegistersChs errorRegisters, + AtaProtocol protocol, AtaTransferRegister transferRegister, + ref byte[] buffer, + uint timeout, bool transferBlocks, + out double duration, out bool sense) + { + throw new NotImplementedException("Remote CHS ATA commands not yet implemented..."); + } + + public int SendAtaCommand(AtaRegistersLba28 registers, out AtaErrorRegistersLba28 errorRegisters, + AtaProtocol protocol, AtaTransferRegister transferRegister, + ref byte[] buffer, + uint timeout, bool transferBlocks, + out double duration, out bool sense) + { + throw new NotImplementedException("Remote 28-bit ATA commands not yet implemented..."); + } + + public int SendAtaCommand(AtaRegistersLba48 registers, out AtaErrorRegistersLba48 errorRegisters, + AtaProtocol protocol, AtaTransferRegister transferRegister, + ref byte[] buffer, + uint timeout, bool transferBlocks, + out double duration, out bool sense) + { + throw new NotImplementedException("Remote 48-bit ATA commands not yet implemented..."); + } + + public int SendMmcCommand(MmcCommands command, bool write, bool isApplication, MmcFlags flags, + uint argument, + uint blockSize, uint blocks, ref byte[] buffer, out uint[] response, + out double duration, out bool sense, uint timeout = 0) + { + throw new NotImplementedException("Remote SDHCI commands not yet implemented..."); + } } } \ No newline at end of file