public enum CPUArchitecture : uint
{
CPU_ARCH_X86 = 0x00000001,
- CPU_ARCH_X64 = 0x00000002
+ CPU_ARCH_X64 = 0x00000002,
+ CPU_ARCH_A64 = 0x00000003
}
[Flags]
{
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;
{
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)]
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();
}
// ------------------------------------------------------------------