From 99d115b8dc6df94d8286b67686b10b10cdbd6e54 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 5 Oct 2015 21:20:25 +0100 Subject: [PATCH] Added IOCTL skeletons. --- ChangeLog | 5 ++ DiscImageChef.Devices/ChangeLog | 13 ++++ .../DiscImageChef.Devices.csproj | 60 +++++++++++++++++++ DiscImageChef.Devices/Enums.cs | 13 ++++ DiscImageChef.Devices/Linux/Enums.cs | 20 +++++++ DiscImageChef.Devices/Linux/Extern.cs | 20 +++++++ DiscImageChef.Devices/Linux/Structs.cs | 39 ++++++++++++ .../Properties/AssemblyInfo.cs | 27 +++++++++ DiscImageChef.Devices/Windows/Enums.cs | 24 ++++++++ DiscImageChef.Devices/Windows/Extern.cs | 39 ++++++++++++ DiscImageChef.Devices/Windows/Structs.cs | 35 +++++++++++ DiscImageChef.sln | 6 ++ 12 files changed, 301 insertions(+) create mode 100644 DiscImageChef.Devices/ChangeLog create mode 100644 DiscImageChef.Devices/DiscImageChef.Devices.csproj create mode 100644 DiscImageChef.Devices/Enums.cs create mode 100644 DiscImageChef.Devices/Linux/Enums.cs create mode 100644 DiscImageChef.Devices/Linux/Extern.cs create mode 100644 DiscImageChef.Devices/Linux/Structs.cs create mode 100644 DiscImageChef.Devices/Properties/AssemblyInfo.cs create mode 100644 DiscImageChef.Devices/Windows/Enums.cs create mode 100644 DiscImageChef.Devices/Windows/Extern.cs create mode 100644 DiscImageChef.Devices/Windows/Structs.cs diff --git a/ChangeLog b/ChangeLog index 03de02e3e..40be3365e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-10-05 Natalia Portillo + + * DiscImageChef.sln: + Added IOCTL skeletons. + 2015-10-05 Natalia Portillo * DiscImageChef.sln: diff --git a/DiscImageChef.Devices/ChangeLog b/DiscImageChef.Devices/ChangeLog new file mode 100644 index 000000000..56469d555 --- /dev/null +++ b/DiscImageChef.Devices/ChangeLog @@ -0,0 +1,13 @@ +2015-10-05 Natalia Portillo + + * Enums.cs: + * Linux/Enums.cs: + * Linux/Extern.cs: + * Linux/Structs.cs: + * Windows/Enums.cs: + * Windows/Extern.cs: + * Windows/Structs.cs: + * Properties/AssemblyInfo.cs: + * DiscImageChef.Devices.csproj: + Added IOCTL skeletons. + diff --git a/DiscImageChef.Devices/DiscImageChef.Devices.csproj b/DiscImageChef.Devices/DiscImageChef.Devices.csproj new file mode 100644 index 000000000..3c5e33e9e --- /dev/null +++ b/DiscImageChef.Devices/DiscImageChef.Devices.csproj @@ -0,0 +1,60 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {57BB2341-AB62-48FD-91B8-46F5A2F9ED51} + Library + DiscImageChef.Devices + DiscImageChef.Devices + v4.5 + 2.2 + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + false + + + full + true + bin\Release + prompt + 4 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Devices/Enums.cs b/DiscImageChef.Devices/Enums.cs new file mode 100644 index 000000000..c6a82ba78 --- /dev/null +++ b/DiscImageChef.Devices/Enums.cs @@ -0,0 +1,13 @@ +using System; + +namespace DiscImageChef.Devices +{ + public class Enums + { + public enum ScsiCommands : byte + { + Inquiry = 0x12 + } + } +} + diff --git a/DiscImageChef.Devices/Linux/Enums.cs b/DiscImageChef.Devices/Linux/Enums.cs new file mode 100644 index 000000000..d9e7bb676 --- /dev/null +++ b/DiscImageChef.Devices/Linux/Enums.cs @@ -0,0 +1,20 @@ +using System; + +namespace DiscImageChef.Devices.Linux +{ + static class Enums + { + internal const int O_RDONLY = 0; + internal const int O_RDWR = 2; + + internal const ulong SG_GET_VERSION_NUM = 0x2282; + internal const ulong SG_IO = 0x2285; + + internal const int SG_DXFER_FROM_DEV = -3; + + internal const uint SG_INFO_OK_MASK = 0x1; + internal const uint SG_INFO_OK = 0x0; /* no sense, host nor driver "noise" */ + internal const uint SG_INFO_CHECK = 0x1; + } +} + diff --git a/DiscImageChef.Devices/Linux/Extern.cs b/DiscImageChef.Devices/Linux/Extern.cs new file mode 100644 index 000000000..8aeb659f0 --- /dev/null +++ b/DiscImageChef.Devices/Linux/Extern.cs @@ -0,0 +1,20 @@ +using System.Runtime.InteropServices; + +namespace DiscImageChef.Devices.Linux +{ + static class Extern + { + [DllImport("libc", CharSet = CharSet.Ansi, SetLastError = true)] + internal static extern int open(string pathname, int flags); + + [DllImport("libc")] + internal static extern int close(int fd); + + [DllImport("libc", EntryPoint="ioctl", SetLastError = true)] + internal static extern int ioctlInt(int fd, ulong request, out int value); + + [DllImport("libc", EntryPoint="ioctl", SetLastError = true)] + internal static extern int ioctlSg(int fd, ulong request, ref Structs.sg_io_hdr_t value); + } +} + diff --git a/DiscImageChef.Devices/Linux/Structs.cs b/DiscImageChef.Devices/Linux/Structs.cs new file mode 100644 index 000000000..f98d18d15 --- /dev/null +++ b/DiscImageChef.Devices/Linux/Structs.cs @@ -0,0 +1,39 @@ +using System; +using System.Runtime.InteropServices; + +namespace DiscImageChef.Devices.Linux +{ + static class Structs + { + [StructLayout(LayoutKind.Sequential)] + internal struct sg_io_hdr_t + { + /// + /// Always 'S' for SG v3 + /// + public int interface_id; /* [i] 'S' (required) */ + public int dxfer_direction; /* [i] */ + public byte cmd_len; /* [i] */ + public byte mx_sb_len; /* [i] */ + public ushort iovec_count; /* [i] */ + public uint dxfer_len; /* [i] */ + public IntPtr dxferp; /* [i], [*io] */ + public IntPtr cmdp; /* [i], [*i] */ + public IntPtr sbp; /* [i], [*o] */ + public uint timeout; /* [i] unit: millisecs */ + public uint flags; /* [i] */ + public int pack_id; /* [i->o] */ + public IntPtr usr_ptr; /* [i->o] */ + public byte status; /* [o] */ + public byte masked_status;/* [o] */ + public byte msg_status; /* [o] */ + public byte sb_len_wr; /* [o] */ + public ushort host_status; /* [o] */ + public ushort driver_status;/* [o] */ + public int resid; /* [o] */ + public uint duration; /* [o] */ + public uint info; /* [o] */ + } + } +} + diff --git a/DiscImageChef.Devices/Properties/AssemblyInfo.cs b/DiscImageChef.Devices/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..109d2c3e5 --- /dev/null +++ b/DiscImageChef.Devices/Properties/AssemblyInfo.cs @@ -0,0 +1,27 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("DiscImageChef.Devices")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Claunia.com")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("© Claunia.com")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] + diff --git a/DiscImageChef.Devices/Windows/Enums.cs b/DiscImageChef.Devices/Windows/Enums.cs new file mode 100644 index 000000000..5f9ebc167 --- /dev/null +++ b/DiscImageChef.Devices/Windows/Enums.cs @@ -0,0 +1,24 @@ +using System; + +namespace DiscImageChef.Devices.Windows +{ + static class Enums + { + internal const uint FILE_SHARE_READ = 0x1; + internal const uint FILE_SHARE_WRITE = 0x1; + + internal const uint OPEN_EXISTING = 0x3; + + internal const uint FILE_ATTRIBUTE_NORMAL = 0x80; + + internal const uint GENERIC_READ = 0x80000000; + internal const uint GENERIC_WRITE = 0x40000000; + + internal const byte SCSI_IOCTL_DATA_OUT = 0; //Give data to SCSI device (e.g. for writing) + internal const byte SCSI_IOCTL_DATA_IN = 1; //Get data from SCSI device (e.g. for reading) + internal const byte SCSI_IOCTL_DATA_UNSPECIFIED = 2; //No data (e.g. for ejecting) + + internal const uint IOCTL_SCSI_PASS_THROUGH_DIRECT = 0x4D014; + } +} + diff --git a/DiscImageChef.Devices/Windows/Extern.cs b/DiscImageChef.Devices/Windows/Extern.cs new file mode 100644 index 000000000..f625da69b --- /dev/null +++ b/DiscImageChef.Devices/Windows/Extern.cs @@ -0,0 +1,39 @@ +using System; +using System.Runtime.InteropServices; +using Microsoft.Win32.SafeHandles; + +namespace DiscImageChef.Devices.Windows +{ + static class Extern + { + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + internal static extern SafeFileHandle CreateFile( + [MarshalAs(UnmanagedType.LPTStr)] string filename, + // [MarshalAs(UnmanagedType.U4)] FileAccess access, + uint access, + //[MarshalAs(UnmanagedType.U4)] FileShare share, + uint share, + IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero + //[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, + uint creationDisposition, + //[MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes, + uint flagsAndAttributes, + IntPtr templateFile); + + [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] + public static extern bool DeviceIoControl( + SafeFileHandle hDevice, + uint IoControlCode, + ref Structs.SCSI_PASS_THROUGH_DIRECT_AND_SENSE_BUFFER InBuffer, + uint nInBufferSize, + ref Structs.SCSI_PASS_THROUGH_DIRECT_AND_SENSE_BUFFER OutBuffer, + uint nOutBufferSize, + ref uint pBytesReturned, + IntPtr Overlapped + ); + + [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] + public static extern bool CloseHandle(SafeFileHandle hDevice); + } +} + diff --git a/DiscImageChef.Devices/Windows/Structs.cs b/DiscImageChef.Devices/Windows/Structs.cs new file mode 100644 index 000000000..c620a1845 --- /dev/null +++ b/DiscImageChef.Devices/Windows/Structs.cs @@ -0,0 +1,35 @@ +using System; +using System.Runtime.InteropServices; + +namespace DiscImageChef.Devices.Windows +{ + static class Structs + { + [StructLayout(LayoutKind.Sequential)] + internal struct SCSI_PASS_THROUGH_DIRECT + { + public ushort Length; + public byte ScsiStatus; + public byte PathId; + public byte TargetId; + public byte Lun; + public byte CdbLength; + public byte SenseInfoLength; + public byte DataIn; + public uint DataTransferLength; + public uint TimeOutValue; + public IntPtr DataBuffer; + public uint SenseInfoOffset; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] Cdb; + }; + + [StructLayout(LayoutKind.Sequential)] + internal struct SCSI_PASS_THROUGH_DIRECT_AND_SENSE_BUFFER { + public SCSI_PASS_THROUGH_DIRECT sptd; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] SenseBuf; + } + } +} + diff --git a/DiscImageChef.sln b/DiscImageChef.sln index 0cd3b0843..0eaecf823 100644 --- a/DiscImageChef.sln +++ b/DiscImageChef.sln @@ -21,6 +21,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Filesystems", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Decoders", "DiscImageChef.Decoders\DiscImageChef.Decoders.csproj", "{0BEB3088-B634-4289-AE17-CDF2D25D00D5}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Devices", "DiscImageChef.Devices\DiscImageChef.Devices.csproj", "{57BB2341-AB62-48FD-91B8-46F5A2F9ED51}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 @@ -31,6 +33,10 @@ Global {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Debug|x86.Build.0 = Debug|Any CPU {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Release|x86.ActiveCfg = Release|Any CPU {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Release|x86.Build.0 = Release|Any CPU + {57BB2341-AB62-48FD-91B8-46F5A2F9ED51}.Debug|x86.ActiveCfg = Debug|Any CPU + {57BB2341-AB62-48FD-91B8-46F5A2F9ED51}.Debug|x86.Build.0 = Debug|Any CPU + {57BB2341-AB62-48FD-91B8-46F5A2F9ED51}.Release|x86.ActiveCfg = Release|Any CPU + {57BB2341-AB62-48FD-91B8-46F5A2F9ED51}.Release|x86.Build.0 = Release|Any CPU {5DEA2811-2FFA-4959-830B-CAD3ACACABEB}.Debug|x86.ActiveCfg = Debug|Any CPU {5DEA2811-2FFA-4959-830B-CAD3ACACABEB}.Debug|x86.Build.0 = Debug|Any CPU {5DEA2811-2FFA-4959-830B-CAD3ACACABEB}.Release|x86.ActiveCfg = Release|Any CPU