* 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:
2015-10-12 06:25:49 +01:00
parent 7fa4c3fbeb
commit 115bf5030f
15 changed files with 612 additions and 11 deletions

View File

@@ -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>
* DiscImageChef.sln:

View File

@@ -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>
* Linux/Enums.cs:

View File

@@ -0,0 +1,12 @@
using System;
namespace DiscImageChef.Devices
{
public class Command
{
public Command()
{
}
}
}

View File

@@ -42,6 +42,9 @@
<Compile Include="Windows\Extern.cs" />
<Compile Include="Windows\Structs.cs" />
<Compile Include="Windows\Enums.cs" />
<Compile Include="Windows\Command.cs" />
<Compile Include="Linux\Command.cs" />
<Compile Include="Command.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
@@ -57,4 +60,10 @@
</Properties>
</MonoDevelop>
</ProjectExtensions>
<ItemGroup>
<ProjectReference Include="..\DiscImageChef.Interop\DiscImageChef.Interop.csproj">
<Project>{9183F2E0-A879-4F23-9EE3-C6908F1332B2}</Project>
<Name>DiscImageChef.Interop</Name>
</ProjectReference>
</ItemGroup>
</Project>

View 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;
}
}
}

View File

@@ -14,16 +14,16 @@ namespace DiscImageChef.Devices.Linux
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);
internal static extern int ioctlInt(int fd, LinuxIoctl request, out int value);
[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)]
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)]
internal static extern int ioctlHdTask(int fd, ulong request, ref byte[] value);
internal static extern int ioctlHdTask(int fd, LinuxIoctl request, ref byte[] value);
}
}

View File

@@ -10,11 +10,11 @@ namespace DiscImageChef.Devices.Linux
/// Always 'S' for SG v3
/// </summary>
public int interface_id; /* [i] 'S' (required) */
public int dxfer_direction; /* [i] */
public ScsiIoctlDirection dxfer_direction; /* [i] */
public byte cmd_len; /* [i] */
public byte mx_sb_len; /* [i] */
public ushort iovec_count; /* [i] */
public ScsiIoctlDirection dxfer_len; /* [i] */
public uint dxfer_len; /* [i] */
public IntPtr dxferp; /* [i], [*io] */
public IntPtr cmdp; /* [i], [*i] */
public IntPtr sbp; /* [i], [*o] */

View 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;
}
}
}

View File

@@ -17,9 +17,9 @@ namespace DiscImageChef.Devices.Windows
IntPtr templateFile);
[DllImport("Kernel32.dll", SetLastError = true, EntryPoint="ioctl", CharSet = CharSet.Auto)]
public static extern bool DeviceIoControlScsi(
internal static extern bool DeviceIoControlScsi(
SafeFileHandle hDevice,
uint IoControlCode,
WindowsIoctl IoControlCode,
ref ScsiPassThroughDirectAndSenseBuffer InBuffer,
uint nInBufferSize,
ref ScsiPassThroughDirectAndSenseBuffer OutBuffer,
@@ -29,9 +29,9 @@ namespace DiscImageChef.Devices.Windows
);
[DllImport("Kernel32.dll", SetLastError = true, EntryPoint="ioctl", CharSet = CharSet.Auto)]
public static extern bool DeviceIoControlAta(
internal static extern bool DeviceIoControlAta(
SafeFileHandle hDevice,
uint IoControlCode,
WindowsIoctl IoControlCode,
ref AtaPassThroughDirect InBuffer,
uint nInBufferSize,
ref AtaPassThroughDirect OutBuffer,
@@ -41,7 +41,7 @@ namespace DiscImageChef.Devices.Windows
);
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool CloseHandle(SafeFileHandle hDevice);
internal static extern bool CloseHandle(SafeFileHandle hDevice);
}
}

View 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.

View 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;
}
}
}
}
}

View 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>

View 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
}
}

View 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("")]

View File

@@ -23,6 +23,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Decoders", "D
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Devices", "DiscImageChef.Devices\DiscImageChef.Devices.csproj", "{57BB2341-AB62-48FD-91B8-46F5A2F9ED51}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Interop", "DiscImageChef.Interop\DiscImageChef.Interop.csproj", "{9183F2E0-A879-4F23-9EE3-C6908F1332B2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
@@ -51,6 +53,10 @@ Global
{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}.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.Build.0 = Debug|Any CPU
{CC48B324-A532-4A45-87A6-6F91F7141E8D}.Release|x86.ActiveCfg = Release|Any CPU