OSDN Git Service

GUI: Implemented detection of the ARM64 architecture via IsWow64Process2() function.
[slunkcrypt/SlunkCrypt.git] / gui / Utilities / CPU / CPUCapabilities.cs
index a9df899..bb981c2 100644 (file)
@@ -16,7 +16,8 @@ namespace com.muldersoft.slunkcrypt.gui.utils.cpu
     public enum CPUArchitecture : uint
     {
         CPU_ARCH_X86 = 0x00000001,
-        CPU_ARCH_X64 = 0x00000002
+        CPU_ARCH_X64 = 0x00000002,
+        CPU_ARCH_A64 = 0x00000003
     }
 
     [Flags]
@@ -195,6 +196,23 @@ namespace com.muldersoft.slunkcrypt.gui.utils.cpu
         {
             try
             {
+                ushort processMachine, nativeMachine;
+                if (Internal.IsWow64Process2(Internal.GetCurrentProcess(), out processMachine, out nativeMachine))
+                {
+                    switch(nativeMachine)
+                    {
+                        case 0x8664:
+                            return CPUArchitecture.CPU_ARCH_X64;
+                        case 0xAA64:
+                            return CPUArchitecture.CPU_ARCH_A64;
+                        default:
+                            return CPUArchitecture.CPU_ARCH_X86;
+                    }
+                }
+            }
+            catch { }
+            try
+            {
                 VerifyLibraryVersion();
                 uint value = IsX64Process ? Internal.GetCPUArchitectureX64() : Internal.GetCPUArchitectureX86();
                 return (CPUArchitecture)value;
@@ -309,6 +327,7 @@ namespace com.muldersoft.slunkcrypt.gui.utils.cpu
         {
             const string DLL_NAME_X86 = "cpu-capabilities-x86.dll";
             const string DLL_NAME_X64 = "cpu-capabilities-x64.dll";
+            const string DLL_KERNEL32 = "kernel32.dll";
 
             /* GetCPUArchitecture() */
             [DllImport(DLL_NAME_X64, CallingConvention = CallingConvention.Cdecl)]
@@ -351,6 +370,12 @@ namespace com.muldersoft.slunkcrypt.gui.utils.cpu
             public static extern uint GetCPULibraryVersionX64();
             [DllImport(DLL_NAME_X86, CallingConvention = CallingConvention.Cdecl)]
             public static extern uint GetCPULibraryVersionX86();
+
+            /* IsWow64Process2() */
+            [DllImport(DLL_KERNEL32, SetLastError = true)]
+            public static extern bool IsWow64Process2(IntPtr process, out ushort processMachine, out ushort nativeMachine);
+            [DllImport(DLL_KERNEL32)]
+            public static extern IntPtr GetCurrentProcess();
         }
 
         // ------------------------------------------------------------------