2010-07-24 2 views

Répondre

3

Oui, IsWow64Process est fâcheusement inutile. Cela signifie vraiment que "l'émulation 32 bits est activée" et que cela renvoie false si vous utilisez un système d'exploitation 32 bits, il n'a besoin d'aucune émulation.

Vous n'en obtiendrez une bonne valeur que si vous savez pertinemment que vous utilisez un système d'exploitation 64 bits. Ce qui est difficile à trouver. Le IntPtr.Size == 8 preuves de test que vous exécutez 64 bits, mais il ne prouve pas qu'il est définitivement pas un système d'exploitation 64 bits. La version 64 bits de l'infrastructure n'a peut-être pas été installée. Ou votre code peut s'exécuter à partir d'un fichier .exe contenant la cible de la plateforme forcée à x86. Lequel est pas peu commun pour le code qui s'intéresse à bitness.

Vous aurez besoin de P/Invoke GetNativeSystemInfo(). Si cela se produit (ou GetProcAddress renvoie IntPtr.Zero), vous savez qu'il s'agit d'un système d'exploitation 32 bits. Si ce n'est pas le cas, inspectez la valeur de SYSTEM_INFO.wProcessorArchitecture. Ce sera 9 pour x64, 6 pour Titanium, 0 pour x86. Donc, si vous obtenez 9, alors utilisez IsWow64Process. Visitez pinvoke.net pour les déclarations. Notez que le nouveau système Environment.Is64BitOperatingSystem .NET 4.0 est défectueux de la même manière.

+0

Le seul problème est que GetNativeSystemInfo selon MSDN est pris en charge à partir de WinXP, indépendamment de l'architecture. De plus, je n'ai pas de machine sans AMD64/EMT64 à la main, mais wProcessorArchitecture ne correspond-il pas au Processor Architecure et non à celui du système installé? éditer: je ne sais pas pourquoi vous faites l'effort de donner des solutions. Net quand je l'ai tagué avec C et WinAPI, juste en disant – metafex

+0

Eh bien, vous n'avez pas besoin de P/Invoke alors. Étant donné que vous avez le bon processeur pour tester cela, vous pouvez répondre à votre propre question dans environ 10 minutes? –

+0

Ok, vérifié SYSTEM_INFO.wProcessorArchitecture et il correspond à l'information du système et non du processeur, donc cette solution fonctionne, merci. – metafex

1

Vous pouvez le tester en utilisant le code suivant:

 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, lien vers le document: http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx –

+1

C'est aussi ce que je pensais au début, mais cette fonction détermine si le processus fonctionne sous WoW64, signifie un processus 32 bits sous un OS 64 bits, j'ai testé avec WinXP SP3 et il m'a donné faux parce que c'était un processus 32 bits qui ne fonctionne pas sous W0W64. – metafex

0

Ceci est C code avec un peu de Python impliqué mais cela vous donne une idée. est ici une version polie:

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; 
} 
Questions connexes