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