如何确定处理器是否支持32位操作系统上的64位

时间:2012-10-31 17:51:07

标签: c# .net

目前我正在使用:

ManagementObjectSearcher searcher = 
                   new ManagementObjectSearcher("Select * FROM WIN32_Processor");
ManagementObjectCollection mObject = searcher.Get();

foreach (ManagementObject obj in mObject)
{
  var architecture = obj.GetPropertyValue("Architecture");
}

architecture = 0

article表示0表示x86

计算机正在运行的处理器是intel core 2 duo E7500

操作系统是Windows XP 32位

CPU-Z显示

enter image description here

有没有办法确定Windows XP计算机是否有支持64位的处理器?

3 个答案:

答案 0 :(得分:2)

它可能不太理想,但使用VC ++等创建(本机)DLL并直接查询处理器的功能相对简单。然后,可以从C#应用程序中启用此方法。

以下C ++方法在64位处理器上运行时返回true,而在仅32位处理器上运行false(无论操作系统是32位还是64位):

bool __declspec(naked) IsCPU64BitCapable()
{
    __asm
    {
        // Save EBX since it's affected by CPUID
        push ebx
        // Determine whether the CPU supports retrieving extended feature data
        mov eax, 0x80000000
        cpuid
        cmp eax, 0x80000000
        // No extended data => no 64 bit
        jbe no_extended_data
        // Request extended feature data
        mov eax, 0x80000001
        cpuid
        // Bit 29 of EDX will now indicate whether the CPU is 64 bit capable
        mov eax, edx
        shr eax, 29
        and eax, 1
        jmp extended_data
    no_extended_data:
        xor eax,eax
    extended_data:
        // Restore EBX
        pop ebx
        ret
    }
}

然后可以使用以下方法从C#中使用此方法:

[DllImport("Test64Bit.dll")]
private static extern bool IsCPU64BitCapable();

答案 1 :(得分:1)

一个简单但不是万无一失的方法是检查注册表中的CPU,应该在HKLM\HARDWARE\DESCRIPTION\CentralProcessor\0

这样的东西
var rk = Registry.LocalMachine.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");
if (rk.GetValue("Identifier").ToString().IndexOf("64") > 0)
{
   // Is 64 bits
} else {
   // Is 32 bits
}

不确定这是否足够

答案 2 :(得分:1)

kb article可能会描述您所看到的内容。建议的解决方法是使用注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI,其中将有一个处理器友好名称的密钥。您可以根据友好名称是否包含Intel64或x86来推断架构。