diff --git a/DiscImageChef.Core/Logging/DumpLog.cs b/DiscImageChef.Core/Logging/DumpLog.cs
index 663468d92..f0bb1e6b8 100644
--- a/DiscImageChef.Core/Logging/DumpLog.cs
+++ b/DiscImageChef.Core/Logging/DumpLog.cs
@@ -62,19 +62,12 @@ namespace DiscImageChef.Core.Logging
PlatformID platId = DetectOS.GetRealPlatformID();
string platVer = DetectOS.GetVersion();
- Type monoRunType = Type.GetType("Mono.Runtime");
logSw.WriteLine("################# System information #################");
logSw.WriteLine("{0} {1} ({2}-bit)", DetectOS.GetPlatformName(platId, platVer), platVer,
Environment.Is64BitOperatingSystem ? 64 : 32);
- if(monoRunType != null)
- {
- string monoVer = "unknown version";
- MethodInfo monoDisplayName =
- monoRunType.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
- if(monoDisplayName != null) monoVer = (string)monoDisplayName.Invoke(null, null);
- logSw.WriteLine("Mono {0}", monoVer);
- }
+ if(DetectOS.IsMono)
+ logSw.WriteLine("Mono {0}", Version.GetMonoVersion());
else logSw.WriteLine(".NET Framework {0}", Environment.Version);
logSw.WriteLine();
diff --git a/DiscImageChef.Devices/Linux/Command.cs b/DiscImageChef.Devices/Linux/Command.cs
index 9cdc6cb32..f54f08167 100644
--- a/DiscImageChef.Devices/Linux/Command.cs
+++ b/DiscImageChef.Devices/Linux/Command.cs
@@ -450,7 +450,7 @@ namespace DiscImageChef.Devices.Linux
IntPtr buf = Marshal.AllocHGlobal(4096);
int resultSize;
- if(DetectOS.Is64Bit())
+ if(DetectOS.Is64Bit)
{
long result64 = Extern.readlink64(path, buf, 4096);
if(result64 <= 0) return null;
diff --git a/DiscImageChef.Interop/DetectOS.cs b/DiscImageChef.Interop/DetectOS.cs
index a45bbe5e6..c775412be 100644
--- a/DiscImageChef.Interop/DetectOS.cs
+++ b/DiscImageChef.Interop/DetectOS.cs
@@ -45,6 +45,18 @@ namespace DiscImageChef.Interop
{
public static class DetectOS
{
+ public static readonly bool IsMono = Type.GetType("Mono.Runtime") != null;
+
+ ///
+ /// Checks if the underlying runtime runs in 64-bit mode
+ ///
+ public static readonly bool Is64Bit = IntPtr.Size == 8;
+
+ ///
+ /// Checks if the underlying runtime runs in 32-bit mode
+ ///
+ public static readonly bool Is32Bit = IntPtr.Size == 4;
+
[DllImport("libc", SetLastError = true)]
static extern int uname(out utsname name);
@@ -69,11 +81,11 @@ namespace DiscImageChef.Interop
// TODO: Differentiate Linux, Android, Tizen
case "Linux":
{
-#if __ANDROID__
+ #if __ANDROID__
return PlatformID.Android;
-#else
+ #else
return PlatformID.Linux;
-#endif
+ #endif
}
case "Darwin":
{
@@ -88,8 +100,8 @@ namespace DiscImageChef.Interop
throw new Exception($"Unhandled exception calling uname: {Marshal.GetLastWin32Error()}");
}
- int length = Marshal.ReadInt32(pLen);
- IntPtr pStr = Marshal.AllocHGlobal(length);
+ int length = Marshal.ReadInt32(pLen);
+ IntPtr pStr = Marshal.AllocHGlobal(length);
osxError = OSX_sysctlbyname("hw.machine", pStr, pLen, IntPtr.Zero, 0);
if(osxError != 0)
{
@@ -104,8 +116,8 @@ namespace DiscImageChef.Interop
Marshal.FreeHGlobal(pStr);
Marshal.FreeHGlobal(pLen);
- if(machine != null && (machine.StartsWith("iPad", StringComparison.Ordinal) ||
- machine.StartsWith("iPod", StringComparison.Ordinal) ||
+ if(machine != null && (machine.StartsWith("iPad", StringComparison.Ordinal) ||
+ machine.StartsWith("iPod", StringComparison.Ordinal) ||
machine.StartsWith("iPhone", StringComparison.Ordinal)))
return PlatformID.iOS;
@@ -115,53 +127,37 @@ namespace DiscImageChef.Interop
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 "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 "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 "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) ||
+ 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;
+ unixname.sysname.StartsWith("MSYS_NT", StringComparison.Ordinal) ||
+ unixname.sysname.StartsWith("UWIN", StringComparison.Ordinal)) return PlatformID.Win32NT;
return PlatformID.Unknown;
}
}
}
- ///
- /// Checks if the underlying runtime runs in 64-bit mode
- ///
- public static bool Is64Bit()
- {
- return IntPtr.Size == 8;
- }
-
- ///
- /// Checks if the underlying runtime runs in 32-bit mode
- ///
- public static bool Is32Bit()
- {
- return IntPtr.Size == 4;
- }
-
///
/// Gets a string for the current operating system REAL version (handles Darwin 1.4 and Windows 10 falsifying)
///
@@ -188,8 +184,8 @@ namespace DiscImageChef.Interop
if(Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Major >= 2 ||
Environment.OSVersion.Version.Major > 6)
return FileVersionInfo
- .GetVersionInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System),
- "KERNEL32.DLL")).ProductVersion;
+ .GetVersionInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System),
+ "KERNEL32.DLL")).ProductVersion;
return environ;
default: return environ;
@@ -206,16 +202,16 @@ namespace DiscImageChef.Interop
{
switch(id)
{
- case PlatformID.AIX: return "AIX";
- case PlatformID.Android: return "Android";
+ case PlatformID.AIX: return "AIX";
+ case PlatformID.Android: return "Android";
case PlatformID.DragonFly: return "DragonFly BSD";
- case PlatformID.FreeBSD: return "FreeBSD";
- case PlatformID.Haiku: return "Haiku";
- case PlatformID.HPUX: return "HP/UX";
- case PlatformID.Hurd: return "Hurd";
- case PlatformID.iOS: return "iOS";
- case PlatformID.IRIX: return "IRIX";
- case PlatformID.Linux: return "Linux";
+ case PlatformID.FreeBSD: return "FreeBSD";
+ case PlatformID.Haiku: return "Haiku";
+ case PlatformID.HPUX: return "HP/UX";
+ case PlatformID.Hurd: return "Hurd";
+ case PlatformID.iOS: return "iOS";
+ case PlatformID.IRIX: return "IRIX";
+ case PlatformID.Linux: return "Linux";
case PlatformID.MacOSX:
if(string.IsNullOrEmpty(version)) return "macOS";
@@ -227,52 +223,52 @@ namespace DiscImageChef.Interop
return "Mac OS X";
- case PlatformID.Minix: return "MINIX";
- case PlatformID.NetBSD: return "NetBSD";
- case PlatformID.NonStop: return "NonStop OS";
- case PlatformID.OpenBSD: return "OpenBSD";
- case PlatformID.OpenServer: return "SCO OpenServer";
- case PlatformID.OS400: return "OS/400";
+ case PlatformID.Minix: return "MINIX";
+ case PlatformID.NetBSD: return "NetBSD";
+ case PlatformID.NonStop: return "NonStop OS";
+ case PlatformID.OpenBSD: return "OpenBSD";
+ case PlatformID.OpenServer: return "SCO OpenServer";
+ case PlatformID.OS400: return "OS/400";
case PlatformID.PlayStation3: return "Sony CellOS";
case PlatformID.PlayStation4: return "Sony Orbis OS";
- case PlatformID.QNX: return "QNX";
- case PlatformID.SINIX: return "SINIX";
- case PlatformID.Solaris: return "Sun Solaris";
- case PlatformID.Tizen: return "Samsung Tizen";
- case PlatformID.Tru64: return "Tru64 UNIX";
- case PlatformID.Ultrix: return "Ultrix";
- case PlatformID.Unix: return "UNIX";
- case PlatformID.UnixWare: return "SCO UnixWare";
- case PlatformID.Wii: return "Nintendo Wii";
- case PlatformID.WiiU: return "Nintendo Wii U";
+ case PlatformID.QNX: return "QNX";
+ case PlatformID.SINIX: return "SINIX";
+ case PlatformID.Solaris: return "Sun Solaris";
+ case PlatformID.Tizen: return "Samsung Tizen";
+ case PlatformID.Tru64: return "Tru64 UNIX";
+ case PlatformID.Ultrix: return "Ultrix";
+ case PlatformID.Unix: return "UNIX";
+ case PlatformID.UnixWare: return "SCO UnixWare";
+ case PlatformID.Wii: return "Nintendo Wii";
+ case PlatformID.WiiU: return "Nintendo Wii U";
case PlatformID.Win32NT:
if(string.IsNullOrEmpty(version)) return "Windows NT/2000/XP/Vista/7/10";
if(version.StartsWith("3.", StringComparison.Ordinal) ||
version.StartsWith("4.", StringComparison.Ordinal)) return "Windows NT";
- if(version.StartsWith("5.0", StringComparison.Ordinal)) return "Windows 2000";
- if(version.StartsWith("5.1", StringComparison.Ordinal)) return "Windows XP";
- if(version.StartsWith("5.2", StringComparison.Ordinal)) return "Windows 2003";
- if(version.StartsWith("6.0", StringComparison.Ordinal)) return "Windows Vista";
- if(version.StartsWith("6.1", StringComparison.Ordinal)) return "Windows 7";
- if(version.StartsWith("6.2", StringComparison.Ordinal)) return "Windows 8";
- if(version.StartsWith("6.3", StringComparison.Ordinal)) return "Windows 8.1";
+ if(version.StartsWith("5.0", StringComparison.Ordinal)) return "Windows 2000";
+ if(version.StartsWith("5.1", StringComparison.Ordinal)) return "Windows XP";
+ if(version.StartsWith("5.2", StringComparison.Ordinal)) return "Windows 2003";
+ if(version.StartsWith("6.0", StringComparison.Ordinal)) return "Windows Vista";
+ if(version.StartsWith("6.1", StringComparison.Ordinal)) return "Windows 7";
+ if(version.StartsWith("6.2", StringComparison.Ordinal)) return "Windows 8";
+ if(version.StartsWith("6.3", StringComparison.Ordinal)) return "Windows 8.1";
if(version.StartsWith("10.0", StringComparison.Ordinal)) return "Windows 10";
return "Windows NT/2000/XP/Vista/7/10";
case PlatformID.Win32S: return "Windows 3.x with win32s";
case PlatformID.Win32Windows:
if(string.IsNullOrEmpty(version)) return "Windows 9x/Me";
- if(version.StartsWith("4.0", StringComparison.Ordinal)) return "Windows 95";
+ if(version.StartsWith("4.0", StringComparison.Ordinal)) return "Windows 95";
if(version.StartsWith("4.10.2222", StringComparison.Ordinal)) return "Windows 98 SE";
- if(version.StartsWith("4.1", StringComparison.Ordinal)) return "Windows 98";
- if(version.StartsWith("4.9", StringComparison.Ordinal)) return "Windows Me";
+ if(version.StartsWith("4.1", StringComparison.Ordinal)) return "Windows 98";
+ if(version.StartsWith("4.9", StringComparison.Ordinal)) return "Windows Me";
return "Windows 9x/Me";
- case PlatformID.WinCE: return "Windows CE/Mobile";
+ case PlatformID.WinCE: return "Windows CE/Mobile";
case PlatformID.WindowsPhone: return "Windows Phone";
- case PlatformID.Xbox: return "Xbox OS";
- case PlatformID.zOS: return "z/OS";
- default: return id.ToString();
+ case PlatformID.Xbox: return "Xbox OS";
+ case PlatformID.zOS: return "z/OS";
+ default: return id.ToString();
}
}
@@ -285,23 +281,28 @@ namespace DiscImageChef.Interop
///
/// System name
///
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string sysname;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+ public string sysname;
///
/// Node name
///
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string nodename;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+ public string nodename;
///
/// Release level
///
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string release;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+ public string release;
///
/// Version level
///
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string version;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+ public string version;
///
/// Hardware level
///
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string machine;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+ public string machine;
}
}
}
\ No newline at end of file
diff --git a/DiscImageChef.Interop/Version.cs b/DiscImageChef.Interop/Version.cs
index ba7eff894..1a8c7480b 100644
--- a/DiscImageChef.Interop/Version.cs
+++ b/DiscImageChef.Interop/Version.cs
@@ -36,6 +36,10 @@
// Copyright © 2011-2018 Natalia Portillo
// ****************************************************************************/
+using System;
+using System.Reflection;
+using System.Runtime;
+
namespace DiscImageChef.Interop
{
public static class Version
@@ -48,5 +52,28 @@ namespace DiscImageChef.Interop
{
return typeof(Version).Assembly.GetName().Version.ToString();
}
+
+ public static string GetNetCoreVersion()
+ {
+ Assembly assembly = typeof(GCSettings).Assembly;
+ string[] assemblyPath =
+ assembly.CodeBase.Split(new[] {'/', '\\'}, StringSplitOptions.RemoveEmptyEntries);
+ int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
+ if(netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
+ return assemblyPath[netCoreAppIndex + 1];
+
+ return null;
+ }
+
+ public static string GetMonoVersion()
+ {
+ if(!DetectOS.IsMono) return null;
+
+ MethodInfo monoDisplayName = Type.GetType("Mono.Runtime")
+ ?.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
+ if(monoDisplayName != null) return (string)monoDisplayName.Invoke(null, null);
+
+ return null;
+ }
}
}
\ No newline at end of file