diff --git a/DiscImageChef.Devices/Device/Destructor.cs b/DiscImageChef.Devices/Device/Destructor.cs index 79966ab0f..a60b118e5 100644 --- a/DiscImageChef.Devices/Device/Destructor.cs +++ b/DiscImageChef.Devices/Device/Destructor.cs @@ -50,18 +50,25 @@ namespace DiscImageChef.Devices public void Close() { - if(FileHandle == null) return; + if (_remote != null) + { + _remote.Close(); + _remote.Disconnect(); + return; + } - switch(PlatformId) + if (FileHandle == null) return; + + switch (PlatformId) { case PlatformID.Win32NT: (FileHandle as SafeFileHandle)?.Close(); break; case PlatformID.Linux: - Extern.close((int)FileHandle); + Extern.close((int) FileHandle); break; case PlatformID.FreeBSD: - FreeBSD.Extern.cam_close_device((IntPtr)FileHandle); + FreeBSD.Extern.cam_close_device((IntPtr) FileHandle); break; } diff --git a/DiscImageChef.Devices/Remote/Enums.cs b/DiscImageChef.Devices/Remote/Enums.cs index 95fce0c35..9dad26433 100644 --- a/DiscImageChef.Devices/Remote/Enums.cs +++ b/DiscImageChef.Devices/Remote/Enums.cs @@ -26,7 +26,8 @@ namespace DiscImageChef.Devices.Remote CommandGetFireWireData = 21, ResponseGetFireWireData = 22, CommandGetPcmciaData = 23, - ResponseGetPcmciaData = 24 + ResponseGetPcmciaData = 24, + CommandCloseDevice = 25 } public enum DicNopReason : byte diff --git a/DiscImageChef.Devices/Remote/Remote.cs b/DiscImageChef.Devices/Remote/Remote.cs index c38fd514a..03ac78715 100644 --- a/DiscImageChef.Devices/Remote/Remote.cs +++ b/DiscImageChef.Devices/Remote/Remote.cs @@ -1202,5 +1202,23 @@ namespace DiscImageChef.Devices.Remote return offset; } + + public void Close() + { + var cmdPkt = new DicPacketCmdClose + { + hdr = new DicPacketHeader + { + remote_id = Consts.RemoteId, packet_id = Consts.PacketId, + len = (uint) Marshal.SizeOf(), + version = Consts.PacketVersion, + packetType = DicPacketType.CommandCloseDevice + } + }; + + var buf = Marshal.StructureToByteArrayLittleEndian(cmdPkt); + + _socket.Send(buf, SocketFlags.None); + } } } \ No newline at end of file diff --git a/DiscImageChef.Devices/Remote/Structs.cs b/DiscImageChef.Devices/Remote/Structs.cs index 5b7f4a69d..2a2650959 100644 --- a/DiscImageChef.Devices/Remote/Structs.cs +++ b/DiscImageChef.Devices/Remote/Structs.cs @@ -306,4 +306,10 @@ namespace DiscImageChef.Devices.Remote [MarshalAs(UnmanagedType.ByValArray, SizeConst = 65536)] public byte[] cis; } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct DicPacketCmdClose + { + public DicPacketHeader hdr; + } } \ No newline at end of file