mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
* DiscImageChef.Devices/Command.cs:
Add skeleton for send SCSI command method. * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/Windows/Command.cs: Added per-platform send SCSI command method. * DiscImageChef.sln: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef.Interop/Properties/AssemblyInfo.cs: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Added code to detect OS. * DiscImageChef.Devices/DiscImageChef.Devices.csproj: Added per-platform send SCSI command method. Add skeleton for send SCSI command method. * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Devices/Windows/Extern.cs: Enhanced externs. * DiscImageChef.Devices/Linux/Structs.cs: Typo.
This commit is contained in:
@@ -1,3 +1,8 @@
|
|||||||
|
2015-10-12 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
|
* DiscImageChef.sln:
|
||||||
|
Added code to detect OS.
|
||||||
|
|
||||||
2015-10-05 Natalia Portillo <claunia@claunia.com>
|
2015-10-05 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
* DiscImageChef.sln:
|
* DiscImageChef.sln:
|
||||||
|
|||||||
@@ -1,3 +1,23 @@
|
|||||||
|
2015-10-12 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
|
* Command.cs:
|
||||||
|
Add skeleton for send SCSI command method.
|
||||||
|
|
||||||
|
* Linux/Command.cs:
|
||||||
|
* Windows/Command.cs:
|
||||||
|
Added per-platform send SCSI command method.
|
||||||
|
|
||||||
|
* DiscImageChef.Devices.csproj:
|
||||||
|
Added per-platform send SCSI command method.
|
||||||
|
Add skeleton for send SCSI command method.
|
||||||
|
|
||||||
|
* Linux/Extern.cs:
|
||||||
|
* Windows/Extern.cs:
|
||||||
|
Enhanced externs.
|
||||||
|
|
||||||
|
* Linux/Structs.cs:
|
||||||
|
Typo.
|
||||||
|
|
||||||
2015-10-07 Natalia Portillo <claunia@claunia.com>
|
2015-10-07 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
* Linux/Enums.cs:
|
* Linux/Enums.cs:
|
||||||
|
|||||||
12
DiscImageChef.Devices/Command.cs
Normal file
12
DiscImageChef.Devices/Command.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace DiscImageChef.Devices
|
||||||
|
{
|
||||||
|
public class Command
|
||||||
|
{
|
||||||
|
public Command()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -42,6 +42,9 @@
|
|||||||
<Compile Include="Windows\Extern.cs" />
|
<Compile Include="Windows\Extern.cs" />
|
||||||
<Compile Include="Windows\Structs.cs" />
|
<Compile Include="Windows\Structs.cs" />
|
||||||
<Compile Include="Windows\Enums.cs" />
|
<Compile Include="Windows\Enums.cs" />
|
||||||
|
<Compile Include="Windows\Command.cs" />
|
||||||
|
<Compile Include="Linux\Command.cs" />
|
||||||
|
<Compile Include="Command.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -57,4 +60,10 @@
|
|||||||
</Properties>
|
</Properties>
|
||||||
</MonoDevelop>
|
</MonoDevelop>
|
||||||
</ProjectExtensions>
|
</ProjectExtensions>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\DiscImageChef.Interop\DiscImageChef.Interop.csproj">
|
||||||
|
<Project>{9183F2E0-A879-4F23-9EE3-C6908F1332B2}</Project>
|
||||||
|
<Name>DiscImageChef.Interop</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
52
DiscImageChef.Devices/Linux/Command.cs
Normal file
52
DiscImageChef.Devices/Linux/Command.cs
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace DiscImageChef.Devices.Linux
|
||||||
|
{
|
||||||
|
static class Command
|
||||||
|
{
|
||||||
|
internal static int SendScsiCommand(int fd, byte[] cdb, ref byte[] buffer, out byte[] senseBuffer, uint timeout, ScsiIoctlDirection direction, out double duration, out bool sense)
|
||||||
|
{
|
||||||
|
senseBuffer = null;
|
||||||
|
duration = 0;
|
||||||
|
sense = false;
|
||||||
|
|
||||||
|
if (buffer == null)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
sg_io_hdr_t io_hdr = new sg_io_hdr_t();
|
||||||
|
|
||||||
|
senseBuffer = new byte[32];
|
||||||
|
|
||||||
|
io_hdr.interface_id = 'S';
|
||||||
|
io_hdr.cmd_len = (byte)cdb.Length;
|
||||||
|
io_hdr.mx_sb_len = (byte)senseBuffer.Length;
|
||||||
|
io_hdr.dxfer_direction = direction;
|
||||||
|
io_hdr.dxfer_len = (uint)buffer.Length;
|
||||||
|
io_hdr.dxferp = Marshal.AllocHGlobal(buffer.Length);
|
||||||
|
io_hdr.cmdp = Marshal.AllocHGlobal(cdb.Length);
|
||||||
|
io_hdr.sbp = Marshal.AllocHGlobal(senseBuffer.Length);
|
||||||
|
io_hdr.timeout = timeout * 1000;
|
||||||
|
|
||||||
|
Marshal.Copy(buffer, 0, io_hdr.dxferp, buffer.Length);
|
||||||
|
Marshal.Copy(cdb, 0, io_hdr.cmdp, cdb.Length);
|
||||||
|
Marshal.Copy(senseBuffer, 0, io_hdr.sbp, senseBuffer.Length);
|
||||||
|
|
||||||
|
int error = Extern.ioctlSg(fd, LinuxIoctl.SG_IO, ref io_hdr);
|
||||||
|
|
||||||
|
if (error < 0)
|
||||||
|
error = Marshal.GetLastWin32Error();
|
||||||
|
|
||||||
|
Marshal.Copy(io_hdr.dxferp, buffer, 0, buffer.Length);
|
||||||
|
Marshal.Copy(io_hdr.cmdp, cdb, 0, cdb.Length);
|
||||||
|
Marshal.Copy(io_hdr.sbp, senseBuffer, 0, senseBuffer.Length);
|
||||||
|
|
||||||
|
sense |= (io_hdr.info & SgInfo.OkMask) != SgInfo.Ok;
|
||||||
|
|
||||||
|
duration = (double)io_hdr.duration;
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -14,16 +14,16 @@ namespace DiscImageChef.Devices.Linux
|
|||||||
internal static extern int close(int fd);
|
internal static extern int close(int fd);
|
||||||
|
|
||||||
[DllImport("libc", EntryPoint="ioctl", SetLastError = true)]
|
[DllImport("libc", EntryPoint="ioctl", SetLastError = true)]
|
||||||
internal static extern int ioctlInt(int fd, ulong request, out int value);
|
internal static extern int ioctlInt(int fd, LinuxIoctl request, out int value);
|
||||||
|
|
||||||
[DllImport("libc", EntryPoint="ioctl", SetLastError = true)]
|
[DllImport("libc", EntryPoint="ioctl", SetLastError = true)]
|
||||||
internal static extern int ioctlSg(int fd, ulong request, ref sg_io_hdr_t value);
|
internal static extern int ioctlSg(int fd, LinuxIoctl request, ref sg_io_hdr_t value);
|
||||||
|
|
||||||
[DllImport("libc", EntryPoint="ioctl", SetLastError = true)]
|
[DllImport("libc", EntryPoint="ioctl", SetLastError = true)]
|
||||||
internal static extern int ioctlHdTaskfile(int fd, ulong request, ref hd_drive_task_hdr value);
|
internal static extern int ioctlHdTaskfile(int fd, LinuxIoctl request, ref hd_drive_task_hdr value);
|
||||||
|
|
||||||
[DllImport("libc", EntryPoint="ioctl", SetLastError = true)]
|
[DllImport("libc", EntryPoint="ioctl", SetLastError = true)]
|
||||||
internal static extern int ioctlHdTask(int fd, ulong request, ref byte[] value);
|
internal static extern int ioctlHdTask(int fd, LinuxIoctl request, ref byte[] value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ namespace DiscImageChef.Devices.Linux
|
|||||||
/// Always 'S' for SG v3
|
/// Always 'S' for SG v3
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int interface_id; /* [i] 'S' (required) */
|
public int interface_id; /* [i] 'S' (required) */
|
||||||
public int dxfer_direction; /* [i] */
|
public ScsiIoctlDirection dxfer_direction; /* [i] */
|
||||||
public byte cmd_len; /* [i] */
|
public byte cmd_len; /* [i] */
|
||||||
public byte mx_sb_len; /* [i] */
|
public byte mx_sb_len; /* [i] */
|
||||||
public ushort iovec_count; /* [i] */
|
public ushort iovec_count; /* [i] */
|
||||||
public ScsiIoctlDirection dxfer_len; /* [i] */
|
public uint dxfer_len; /* [i] */
|
||||||
public IntPtr dxferp; /* [i], [*io] */
|
public IntPtr dxferp; /* [i], [*io] */
|
||||||
public IntPtr cmdp; /* [i], [*i] */
|
public IntPtr cmdp; /* [i], [*i] */
|
||||||
public IntPtr sbp; /* [i], [*o] */
|
public IntPtr sbp; /* [i], [*o] */
|
||||||
|
|||||||
56
DiscImageChef.Devices/Windows/Command.cs
Normal file
56
DiscImageChef.Devices/Windows/Command.cs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.Win32.SafeHandles;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace DiscImageChef.Devices.Windows
|
||||||
|
{
|
||||||
|
static class Command
|
||||||
|
{
|
||||||
|
internal static int SendScsiCommand(SafeFileHandle fd, byte[] cdb, ref byte[] buffer, out byte[] senseBuffer, uint timeout, ScsiIoctlDirection direction, out double duration, out bool sense)
|
||||||
|
{
|
||||||
|
senseBuffer = null;
|
||||||
|
duration = 0;
|
||||||
|
sense = false;
|
||||||
|
|
||||||
|
if (buffer == null)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
ScsiPassThroughDirectAndSenseBuffer sptd_sb = new ScsiPassThroughDirectAndSenseBuffer();
|
||||||
|
sptd_sb.sptd = new ScsiPassThroughDirect();
|
||||||
|
sptd_sb.SenseBuf = new byte[32];
|
||||||
|
sptd_sb.sptd.Cdb = new byte[16];
|
||||||
|
Array.Copy(cdb, sptd_sb.sptd.Cdb, cdb.Length);
|
||||||
|
sptd_sb.sptd.Length = (ushort)Marshal.SizeOf(sptd_sb.sptd);
|
||||||
|
sptd_sb.sptd.CdbLength = (byte)cdb.Length;
|
||||||
|
sptd_sb.sptd.SenseInfoLength = (byte)sptd_sb.SenseBuf.Length;
|
||||||
|
sptd_sb.sptd.DataIn = direction;
|
||||||
|
sptd_sb.sptd.DataTransferLength = (uint)buffer.Length;
|
||||||
|
sptd_sb.sptd.TimeOutValue = timeout;
|
||||||
|
sptd_sb.sptd.DataBuffer = Marshal.AllocHGlobal(buffer.Length);
|
||||||
|
sptd_sb.sptd.SenseInfoOffset = (uint)Marshal.SizeOf(sptd_sb.sptd);
|
||||||
|
|
||||||
|
uint k = 0;
|
||||||
|
int error = 0;
|
||||||
|
|
||||||
|
DateTime start = DateTime.Now;
|
||||||
|
bool hasError = Extern.DeviceIoControlScsi(fd, WindowsIoctl.IOCTL_SCSI_PASS_THROUGH_DIRECT, ref sptd_sb, (uint)Marshal.SizeOf(sptd_sb), ref sptd_sb,
|
||||||
|
(uint)Marshal.SizeOf(sptd_sb), ref k, IntPtr.Zero);
|
||||||
|
DateTime end = DateTime.Now;
|
||||||
|
|
||||||
|
if (hasError)
|
||||||
|
error = Marshal.GetLastWin32Error();
|
||||||
|
|
||||||
|
Marshal.Copy(sptd_sb.sptd.DataBuffer, buffer, 0, buffer.Length);
|
||||||
|
|
||||||
|
sense |= sptd_sb.sptd.ScsiStatus != 0;
|
||||||
|
|
||||||
|
senseBuffer = new byte[32];
|
||||||
|
Array.Copy(sptd_sb.SenseBuf, senseBuffer, 32);
|
||||||
|
|
||||||
|
duration = (end - start).TotalMilliseconds;
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -17,9 +17,9 @@ namespace DiscImageChef.Devices.Windows
|
|||||||
IntPtr templateFile);
|
IntPtr templateFile);
|
||||||
|
|
||||||
[DllImport("Kernel32.dll", SetLastError = true, EntryPoint="ioctl", CharSet = CharSet.Auto)]
|
[DllImport("Kernel32.dll", SetLastError = true, EntryPoint="ioctl", CharSet = CharSet.Auto)]
|
||||||
public static extern bool DeviceIoControlScsi(
|
internal static extern bool DeviceIoControlScsi(
|
||||||
SafeFileHandle hDevice,
|
SafeFileHandle hDevice,
|
||||||
uint IoControlCode,
|
WindowsIoctl IoControlCode,
|
||||||
ref ScsiPassThroughDirectAndSenseBuffer InBuffer,
|
ref ScsiPassThroughDirectAndSenseBuffer InBuffer,
|
||||||
uint nInBufferSize,
|
uint nInBufferSize,
|
||||||
ref ScsiPassThroughDirectAndSenseBuffer OutBuffer,
|
ref ScsiPassThroughDirectAndSenseBuffer OutBuffer,
|
||||||
@@ -29,9 +29,9 @@ namespace DiscImageChef.Devices.Windows
|
|||||||
);
|
);
|
||||||
|
|
||||||
[DllImport("Kernel32.dll", SetLastError = true, EntryPoint="ioctl", CharSet = CharSet.Auto)]
|
[DllImport("Kernel32.dll", SetLastError = true, EntryPoint="ioctl", CharSet = CharSet.Auto)]
|
||||||
public static extern bool DeviceIoControlAta(
|
internal static extern bool DeviceIoControlAta(
|
||||||
SafeFileHandle hDevice,
|
SafeFileHandle hDevice,
|
||||||
uint IoControlCode,
|
WindowsIoctl IoControlCode,
|
||||||
ref AtaPassThroughDirect InBuffer,
|
ref AtaPassThroughDirect InBuffer,
|
||||||
uint nInBufferSize,
|
uint nInBufferSize,
|
||||||
ref AtaPassThroughDirect OutBuffer,
|
ref AtaPassThroughDirect OutBuffer,
|
||||||
@@ -41,7 +41,7 @@ namespace DiscImageChef.Devices.Windows
|
|||||||
);
|
);
|
||||||
|
|
||||||
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
||||||
public static extern bool CloseHandle(SafeFileHandle hDevice);
|
internal static extern bool CloseHandle(SafeFileHandle hDevice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
8
DiscImageChef.Interop/ChangeLog
Normal file
8
DiscImageChef.Interop/ChangeLog
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2015-10-12 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
|
* DetectOS.cs:
|
||||||
|
* PlatformID.cs:
|
||||||
|
* Properties/AssemblyInfo.cs:
|
||||||
|
* DiscImageChef.Interop.csproj:
|
||||||
|
Added code to detect OS.
|
||||||
|
|
||||||
188
DiscImageChef.Interop/DetectOS.cs
Normal file
188
DiscImageChef.Interop/DetectOS.cs
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
//
|
||||||
|
// Interop.DetectOS.cs
|
||||||
|
//
|
||||||
|
// Author:
|
||||||
|
// Natalia Portillo <claunia@claunia.com>
|
||||||
|
//
|
||||||
|
// Copyright (c) 2015 © Claunia.com
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace DiscImageChef.Interop
|
||||||
|
{
|
||||||
|
public static class DetectOS
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// POSIX uname structure, size from OSX, big enough to handle extra fields
|
||||||
|
/// </summary>
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
|
||||||
|
struct utsname
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// System name
|
||||||
|
/// </summary>
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
|
||||||
|
public string sysname;
|
||||||
|
/// <summary>
|
||||||
|
/// Node name
|
||||||
|
/// </summary>
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
|
||||||
|
public string nodename;
|
||||||
|
/// <summary>
|
||||||
|
/// Release level
|
||||||
|
/// </summary>
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
|
||||||
|
public string release;
|
||||||
|
/// <summary>
|
||||||
|
/// Version level
|
||||||
|
/// </summary>
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
|
||||||
|
public string version;
|
||||||
|
/// <summary>
|
||||||
|
/// Hardware level
|
||||||
|
/// </summary>
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
|
||||||
|
public string machine;
|
||||||
|
}
|
||||||
|
|
||||||
|
[DllImport("libc", SetLastError = true)]
|
||||||
|
static extern int uname(out utsname name);
|
||||||
|
|
||||||
|
[DllImport("libc", SetLastError = true, EntryPoint = "sysctlbyname", CharSet = CharSet.Ansi)]
|
||||||
|
static extern int OSX_sysctlbyname(string name, IntPtr oldp, IntPtr oldlenp, IntPtr newp, uint newlen);
|
||||||
|
|
||||||
|
public static Interop.PlatformID GetRealPlatformID()
|
||||||
|
{
|
||||||
|
if ((int)Environment.OSVersion.Platform < 4 ||
|
||||||
|
(int)Environment.OSVersion.Platform == 5)
|
||||||
|
{
|
||||||
|
return (Interop.PlatformID)((int)Environment.OSVersion.Platform);
|
||||||
|
}
|
||||||
|
|
||||||
|
utsname unixname;
|
||||||
|
int error = uname(out unixname);
|
||||||
|
if (error != 0)
|
||||||
|
throw new Exception(String.Format("Unhandled exception calling uname: {0}", Marshal.GetLastWin32Error()));
|
||||||
|
|
||||||
|
switch (unixname.sysname)
|
||||||
|
{
|
||||||
|
// TODO: Differentiate Linux, Android, Tizen
|
||||||
|
case "Linux":
|
||||||
|
{
|
||||||
|
#if __ANDROID__
|
||||||
|
return PlatformID.Android;
|
||||||
|
#else
|
||||||
|
return PlatformID.Linux;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
case "Darwin":
|
||||||
|
{
|
||||||
|
int osx_error;
|
||||||
|
|
||||||
|
IntPtr pLen = Marshal.AllocHGlobal(sizeof(int));
|
||||||
|
osx_error = OSX_sysctlbyname("hw.machine", IntPtr.Zero, pLen, IntPtr.Zero, 0);
|
||||||
|
if (osx_error != 0)
|
||||||
|
{
|
||||||
|
Marshal.FreeHGlobal(pLen);
|
||||||
|
|
||||||
|
throw new Exception(String.Format("Unhandled exception calling uname: {0}", Marshal.GetLastWin32Error()));
|
||||||
|
}
|
||||||
|
|
||||||
|
int length = Marshal.ReadInt32(pLen);
|
||||||
|
IntPtr pStr = Marshal.AllocHGlobal(length);
|
||||||
|
osx_error = OSX_sysctlbyname("hw.machine", pStr, pLen, IntPtr.Zero, 0);
|
||||||
|
if (osx_error != 0)
|
||||||
|
{
|
||||||
|
Marshal.FreeHGlobal(pStr);
|
||||||
|
Marshal.FreeHGlobal(pLen);
|
||||||
|
|
||||||
|
throw new Exception(String.Format("Unhandled exception calling uname: {0}", Marshal.GetLastWin32Error()));
|
||||||
|
}
|
||||||
|
|
||||||
|
string machine = Marshal.PtrToStringAnsi(pStr);
|
||||||
|
|
||||||
|
Marshal.FreeHGlobal(pStr);
|
||||||
|
Marshal.FreeHGlobal(pLen);
|
||||||
|
|
||||||
|
if (machine.StartsWith("iPad", StringComparison.Ordinal) ||
|
||||||
|
machine.StartsWith("iPod", StringComparison.Ordinal) ||
|
||||||
|
machine.StartsWith("iPhone", StringComparison.Ordinal))
|
||||||
|
return PlatformID.iOS;
|
||||||
|
|
||||||
|
return PlatformID.MacOSX;
|
||||||
|
}
|
||||||
|
case "GNU":
|
||||||
|
return PlatformID.Hurd;
|
||||||
|
case "FreeBSD":
|
||||||
|
case "GNU/kFreeBSD":
|
||||||
|
return PlatformID.FreeBSD;
|
||||||
|
case "DragonFly":
|
||||||
|
return PlatformID.DragonFly;
|
||||||
|
case "Haiku":
|
||||||
|
return PlatformID.Haiku;
|
||||||
|
case "HP-UX":
|
||||||
|
return PlatformID.HPUX;
|
||||||
|
case "AIX":
|
||||||
|
return PlatformID.AIX;
|
||||||
|
case "OS400":
|
||||||
|
return PlatformID.OS400;
|
||||||
|
case "IRIX":
|
||||||
|
case "IRIX64":
|
||||||
|
return PlatformID.IRIX;
|
||||||
|
case "Minix":
|
||||||
|
return PlatformID.Minix;
|
||||||
|
case "NetBSD":
|
||||||
|
return PlatformID.NetBSD;
|
||||||
|
case "NONSTOP_KERNEL":
|
||||||
|
return PlatformID.NonStop;
|
||||||
|
case "OpenBSD":
|
||||||
|
return PlatformID.OpenBSD;
|
||||||
|
case "QNX":
|
||||||
|
return PlatformID.QNX;
|
||||||
|
case "SINIX-Y":
|
||||||
|
return PlatformID.SINIX;
|
||||||
|
case "SunOS":
|
||||||
|
return PlatformID.Solaris;
|
||||||
|
case "OSF1":
|
||||||
|
return PlatformID.Tru64;
|
||||||
|
case "ULTRIX":
|
||||||
|
return PlatformID.Ultrix;
|
||||||
|
case "SCO_SV":
|
||||||
|
return PlatformID.OpenServer;
|
||||||
|
case "UnixWare":
|
||||||
|
return PlatformID.UnixWare;
|
||||||
|
case "Interix":
|
||||||
|
case "UWIN-W7":
|
||||||
|
return PlatformID.Win32NT;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (unixname.sysname.StartsWith("CYGWIN_NT", StringComparison.Ordinal) ||
|
||||||
|
unixname.sysname.StartsWith("MINGW32_NT", StringComparison.Ordinal) ||
|
||||||
|
unixname.sysname.StartsWith("MSYS_NT", StringComparison.Ordinal) ||
|
||||||
|
unixname.sysname.StartsWith("UWIN", StringComparison.Ordinal))
|
||||||
|
return PlatformID.Win32NT;
|
||||||
|
|
||||||
|
return PlatformID.Unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
41
DiscImageChef.Interop/DiscImageChef.Interop.csproj
Normal file
41
DiscImageChef.Interop/DiscImageChef.Interop.csproj
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>8.0.30703</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{9183F2E0-A879-4F23-9EE3-C6908F1332B2}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>DiscImageChef.Interop</RootNamespace>
|
||||||
|
<AssemblyName>DiscImageChef.Interop</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<ConsolePause>false</ConsolePause>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release</OutputPath>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<ConsolePause>false</ConsolePause>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="DetectOS.cs" />
|
||||||
|
<Compile Include="PlatformID.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
||||||
177
DiscImageChef.Interop/PlatformID.cs
Normal file
177
DiscImageChef.Interop/PlatformID.cs
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
//
|
||||||
|
// Interop.PlatformID.cs
|
||||||
|
//
|
||||||
|
// Author:
|
||||||
|
// Natalia Portillo <claunia@claunia.com>
|
||||||
|
//
|
||||||
|
// Copyright (c) 2015 © Claunia.com
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
namespace DiscImageChef.Interop
|
||||||
|
{
|
||||||
|
public enum PlatformID
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Win32s
|
||||||
|
/// </summary>
|
||||||
|
Win32S = 0,
|
||||||
|
/// <summary>
|
||||||
|
/// Win32 (Windows 9x)
|
||||||
|
/// </summary>
|
||||||
|
Win32Windows = 1,
|
||||||
|
/// <summary>
|
||||||
|
/// Windows NT
|
||||||
|
/// </summary>
|
||||||
|
Win32NT = 2,
|
||||||
|
/// <summary>
|
||||||
|
/// Windows Mobile
|
||||||
|
/// </summary>
|
||||||
|
WinCE = 3,
|
||||||
|
/// <summary>
|
||||||
|
/// UNIX (do not use, too generic)
|
||||||
|
/// </summary>
|
||||||
|
Unix = 4,
|
||||||
|
/// <summary>
|
||||||
|
/// Xbox 360
|
||||||
|
/// </summary>
|
||||||
|
Xbox = 5,
|
||||||
|
/// <summary>
|
||||||
|
/// OS X
|
||||||
|
/// </summary>
|
||||||
|
MacOSX = 6,
|
||||||
|
/// <summary>
|
||||||
|
/// iOS is not OS X
|
||||||
|
/// </summary>
|
||||||
|
iOS = 7,
|
||||||
|
/// <summary>
|
||||||
|
/// Linux
|
||||||
|
/// </summary>
|
||||||
|
Linux = 8,
|
||||||
|
/// <summary>
|
||||||
|
/// Sun Solaris
|
||||||
|
/// </summary>
|
||||||
|
Solaris = 9,
|
||||||
|
/// <summary>
|
||||||
|
/// NetBSD
|
||||||
|
/// </summary>
|
||||||
|
NetBSD = 10,
|
||||||
|
/// <summary>
|
||||||
|
/// OpenBSD
|
||||||
|
/// </summary>
|
||||||
|
OpenBSD = 11,
|
||||||
|
/// <summary>
|
||||||
|
/// FreeBSD
|
||||||
|
/// </summary>
|
||||||
|
FreeBSD = 12,
|
||||||
|
/// <summary>
|
||||||
|
/// DragonFly BSD
|
||||||
|
/// </summary>
|
||||||
|
DragonFly = 13,
|
||||||
|
/// <summary>
|
||||||
|
/// Nintendo Wii
|
||||||
|
/// </summary>
|
||||||
|
Wii = 14,
|
||||||
|
/// <summary>
|
||||||
|
/// Nintendo Wii U
|
||||||
|
/// </summary>
|
||||||
|
WiiU = 15,
|
||||||
|
/// <summary>
|
||||||
|
/// Sony PlayStation 3
|
||||||
|
/// </summary>
|
||||||
|
PlayStation3 = 16,
|
||||||
|
/// <summary>
|
||||||
|
/// Sony Playstation 4
|
||||||
|
/// </summary>
|
||||||
|
PlayStation4 = 17,
|
||||||
|
/// <summary>
|
||||||
|
/// Google Android
|
||||||
|
/// </summary>
|
||||||
|
Android = 18,
|
||||||
|
/// <summary>
|
||||||
|
/// Samsung Tizen
|
||||||
|
/// </summary>
|
||||||
|
Tizen = 19,
|
||||||
|
/// <summary>
|
||||||
|
/// Windows Phone
|
||||||
|
/// </summary>
|
||||||
|
WindowsPhone = 20,
|
||||||
|
/// <summary>
|
||||||
|
/// GNU/Hurd
|
||||||
|
/// </summary>
|
||||||
|
Hurd = 21,
|
||||||
|
/// <summary>
|
||||||
|
/// Haiku
|
||||||
|
/// </summary>
|
||||||
|
Haiku = 22,
|
||||||
|
/// <summary>
|
||||||
|
/// HP-UX
|
||||||
|
/// </summary>
|
||||||
|
HPUX = 23,
|
||||||
|
/// <summary>
|
||||||
|
/// AIX
|
||||||
|
/// </summary>
|
||||||
|
AIX = 24,
|
||||||
|
/// <summary>
|
||||||
|
/// OS/400
|
||||||
|
/// </summary>
|
||||||
|
OS400 = 25,
|
||||||
|
/// <summary>
|
||||||
|
/// IRIX
|
||||||
|
/// </summary>
|
||||||
|
IRIX = 26,
|
||||||
|
/// <summary>
|
||||||
|
/// Minix
|
||||||
|
/// </summary>
|
||||||
|
Minix = 27,
|
||||||
|
/// <summary>
|
||||||
|
/// NonStop
|
||||||
|
/// </summary>
|
||||||
|
NonStop = 28,
|
||||||
|
/// <summary>
|
||||||
|
/// QNX
|
||||||
|
/// </summary>
|
||||||
|
QNX = 29,
|
||||||
|
/// <summary>
|
||||||
|
/// SINIX
|
||||||
|
/// </summary>
|
||||||
|
SINIX = 30,
|
||||||
|
/// <summary>
|
||||||
|
/// Tru64 UNIX
|
||||||
|
/// </summary>
|
||||||
|
Tru64 = 31,
|
||||||
|
/// <summary>
|
||||||
|
/// Ultrix
|
||||||
|
/// </summary>
|
||||||
|
Ultrix = 32,
|
||||||
|
/// <summary>
|
||||||
|
/// SCO OpenServer / SCO UNIX
|
||||||
|
/// </summary>
|
||||||
|
OpenServer = 33,
|
||||||
|
/// <summary>
|
||||||
|
/// SCO UnixWare
|
||||||
|
/// </summary>
|
||||||
|
UnixWare = 34,
|
||||||
|
/// <summary>
|
||||||
|
/// IBM z/OS
|
||||||
|
/// </summary>
|
||||||
|
zOS = 35,
|
||||||
|
Unknown = -1
|
||||||
|
}
|
||||||
|
}
|
||||||
27
DiscImageChef.Interop/Properties/AssemblyInfo.cs
Normal file
27
DiscImageChef.Interop/Properties/AssemblyInfo.cs
Normal file
@@ -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.Interop")]
|
||||||
|
[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("")]
|
||||||
|
|
||||||
@@ -23,6 +23,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Decoders", "D
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Devices", "DiscImageChef.Devices\DiscImageChef.Devices.csproj", "{57BB2341-AB62-48FD-91B8-46F5A2F9ED51}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Devices", "DiscImageChef.Devices\DiscImageChef.Devices.csproj", "{57BB2341-AB62-48FD-91B8-46F5A2F9ED51}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Interop", "DiscImageChef.Interop\DiscImageChef.Interop.csproj", "{9183F2E0-A879-4F23-9EE3-C6908F1332B2}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|x86 = Debug|x86
|
Debug|x86 = Debug|x86
|
||||||
@@ -51,6 +53,10 @@ Global
|
|||||||
{7A4B05BE-73C9-4F34-87FE-E80CCF1F732D}.Release|x86.Build.0 = Release|x86
|
{7A4B05BE-73C9-4F34-87FE-E80CCF1F732D}.Release|x86.Build.0 = Release|x86
|
||||||
{8996EF59-09B9-4920-A3DE-2F8EA2EBBCFF}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{8996EF59-09B9-4920-A3DE-2F8EA2EBBCFF}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{8996EF59-09B9-4920-A3DE-2F8EA2EBBCFF}.Release|x86.ActiveCfg = Release|Any CPU
|
{8996EF59-09B9-4920-A3DE-2F8EA2EBBCFF}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{9183F2E0-A879-4F23-9EE3-C6908F1332B2}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{9183F2E0-A879-4F23-9EE3-C6908F1332B2}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{9183F2E0-A879-4F23-9EE3-C6908F1332B2}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{9183F2E0-A879-4F23-9EE3-C6908F1332B2}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{CC48B324-A532-4A45-87A6-6F91F7141E8D}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{CC48B324-A532-4A45-87A6-6F91F7141E8D}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{CC48B324-A532-4A45-87A6-6F91F7141E8D}.Debug|x86.Build.0 = Debug|Any CPU
|
{CC48B324-A532-4A45-87A6-6F91F7141E8D}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{CC48B324-A532-4A45-87A6-6F91F7141E8D}.Release|x86.ActiveCfg = Release|Any CPU
|
{CC48B324-A532-4A45-87A6-6F91F7141E8D}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
|||||||
Reference in New Issue
Block a user