2010-07-24 102 views

回答

3

是,IsWow64Process是烦人没用。这实际上意味着“启用了32位仿真”,并且如果您在32位操作系统上运行,则它不会返回false,它不需要任何仿真。

如果您知道您正在64位操作系统上运行,那么您只会从中获得良好的价值。这是棘手的发现。您运行64位的IntPtr.Size == 8测试证明,但它并不能证明它绝对是而不是的64位操作系统。该框架的64位版本可能尚未安装。或者,您的代码可能是从将Platform Target强制为x86的.exe文件运行的。这是而不是对于比特位感兴趣的代码并不常见。

您将需要P/Invoke GetNativeSystemInfo()。如果抛出(或GetProcAddress返回IntPtr.Zero),你就知道它是一个32位操作系统。如果没有,请检查SYSTEM_INFO.wProcessorArchitecture的值。对于x64,它将是9,对于Titanium是6,对于x86是0。所以,如果你得到9,然后使用IsWow64Process。访问pinvoke.net进行声明。

请注意,新的.NET 4.0 Environment.Is64BitOperatingSystem有同样的缺陷。

+0

它唯一的问题是,无论架构如何,都支持从WinXP向上支持MSDN的GetNativeSystemInfo。另外,我手边没有没有AMD64/EMT64的机器,但是wProcessorArchitecture不对应于Processor Architecure而不是安装的系统之一? 编辑:我不知道为什么你们努力给.net解决方案,当我用C和WinAPI标记它,只是说 – metafex 2010-07-24 14:00:25

+0

那么,你不需要P/Invoke。鉴于你有合适的处理器来测试这个,你可以在大约10分钟内回答你自己的问题吗? – 2010-07-24 14:45:43

+0

好的,检查了SYSTEM_INFO.wProcessorArchitecture,它对应于系统的信息,而不是CPU的信息,所以这个解决方案的工作原理,谢谢。 – metafex 2010-07-24 15:02:49

1

您可以使用下面的代码进行测试:

 bool is64BitProcess = (IntPtr.Size == 8); 
    bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64(); 

    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     public static extern bool IsWow64Process(
     [In] IntPtr hProcess, 
     [Out] out bool wow64Process 
    ); 

    [MethodImpl(MethodImplOptions.NoInlining)] 
     private static bool InternalCheckIsWow64() 
    { 
     if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || 
    Environment.OSVersion.Version.Major >= 6) 
      { 
      using (Process p = Process.GetCurrentProcess()) 
       { 
        bool retVal; 
        if (!IsWow64Process(p.Handle, out retVal)) 
        { 
         return false; 
        } 
        return retVal; 
       } 
      } 
      else 
      { 
        return false; 
     } 
} 
+0

+1,链接到文档:http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx – 2010-07-24 11:05:39

+1

这也是我的想法起初,但是这个函数只是确定该进程是否在WoW64下运行,意味着在64Bit操作系统下的一个32Bit进程,我用WinXP SP3测试了它,并且它给了我一个假,因为它是一个不在W0W64下运行的32Bit进程。 – metafex 2010-07-24 11:45:37

0

这是C code涉及一些Python,但它给你一个想法。 这里有一个抛光版本:

int is64bit(long pid) { 
    SYSTEM_INFO sysinfo; 
    HANDLE hProcess; 
    BOOL isWow64; 

    // if OS is not 64 bit, no process will be either  
    GetNativeSystemInfo(&sysinfo); 
    if (sysinfo.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_AMD64) 
     return 0; 

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);; 
    if (hProcess == NULL) 
     return -1; 

    if (! IsWow64Process(hProcess, &isWow64)) { 
     CloseHandle(hProcess); 
     return -1; 
    } 
    CloseHandle(hProcess); 
    if (isWow64) 
     return 0; 
    else 
     return 1; 
} 
相关问题