Fix 64bit detection, broken since 66e69c4c25. (#34)

This commit restores the previous logic of accepting an 8-byte intptr as evidence
enough for 64bit. It also accepts presence of IsWow64Process as evidence of 64bit.
On 64bit, this may return true or false depending on the process. On 32bit this entry
point is not available and an exception will be raised.
This commit is contained in:
Nicholas Seckar
2018-03-28 09:51:21 +02:00
committed by Phyxion
parent c873b66cd9
commit 9a1088e537
+28 -30
View File
@@ -2,38 +2,36 @@
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace OpenHardwareMonitor.Software
{
public static class OperatingSystem
{
static OperatingSystem()
{
// The operating system doesn't change during execution so let's query it just one time.
var platform = Environment.OSVersion.Platform;
IsLinux = platform == PlatformID.Unix || platform == PlatformID.MacOSX;
namespace OpenHardwareMonitor.Software {
public static class OperatingSystem {
static OperatingSystem() {
// The operating system doesn't change during execution so let's query it just one time.
var platform = Environment.OSVersion.Platform;
IsLinux = platform == PlatformID.Unix || platform == PlatformID.MacOSX;
if (IntPtr.Size == 8)
Is64Bit = true;
try
{
var result = IsWow64Process(Process.GetCurrentProcess().Handle, out bool wow64Process);
Is64Bit = result && wow64Process;
}
catch (EntryPointNotFoundException)
{
Is64Bit = false;
}
if (IntPtr.Size == 8) {
Is64Bit = true;
} else if (!IsLinux) {
try {
var result = IsWow64Process(Process.GetCurrentProcess().Handle, out bool wow64Process);
// If we are still here, this is a 64bit windows; 32bit windows does
// not provide IsWow64Process.
Is64Bit = true;
}
public static bool Is64Bit { get; }
public static bool IsLinux { get; }
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);
catch (EntryPointNotFoundException) {
// IsWow64Process is not present on 32 bit:
Is64Bit = false;
}
}
}
public static bool Is64Bit { get; }
public static bool IsLinux { get; }
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);
}
}