Comment puis-je obtenir les informations d'une poignée de processus acquise en utilisant OpenProcess si un processus est 32 ou 64 bits?Comment puis-je déterminer si le processus est 32 ou 64Bit à partir d'un handle?
Répondre
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.
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;
}
}
+1, lien vers le document: http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx –
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
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;
}
- 1. Déterminer par programme si natif .exe est 32 bits ou 64 bits
- 2. Comment puis-je déterminer si une application que j'installe est 32 bits ou 64 bits?
- 3. Win32API - Comment obtenir le nom de fichier du processus à partir du handle de processus?
- 4. Appel code 32 bits à partir de 64 bits Processus
- 5. Vérifiez si le handle appartient au processus en cours?
- 6. Déterminer si ELMAH est activé ou non?
- 7. Comment déterminer si une URL est une image ou non?
- 8. Déterminer si l'application est WinForms ou WebForms
- 9. déterminer si dropdownlist est sélectionné ou non
- 10. Obtenir le processus en cours donné handle de processus
- 11. Déterminer si stdout pour un processus Python est redirigé
- 12. Win32: Détermine si le handle stdout est char ou wchar stream
- 13. Comment déterminer si mon processus est lié à l'UC, lié aux E/S, lié à la mémoire ou
- 14. Comment puis-je déterminer si un descripteur de fichier Perl est un handle de lecture ou d'écriture?
- 15. Comment déterminer si un DIB est ascendant ou descendant?
- 16. comment déterminer si une personne est en ligne ou non
- 17. Comment vérifier si le processus est inactif? C#
- 18. Comment déterminer si le code .NET est en cours d'exécution dans un processus ASP.NET?
- 19. Comment puis-je trouver l'ID de processus à partir du nom de service/handle dans Delphi?
- 20. Comment déterminer si le plugin Wordpress est appelé à partir du widget Wordpress
- 21. Comment déterminer si une demande est le résultat d'une publication?
- 22. Déterminer le chemin vers la clé de registre à partir du handle HKEY en C++
- 23. En cours d'exécution sur matlab 32 ou 64 bits?
- 24. Comment déterminer si le classement MySQL est sensible à la casse ou non?
- 25. Comment déterminer si le moniteur LCD est activé à partir de la ligne de commande Linux
- 26. Déterminer si aujourd'hui est le lundi
- 27. Comment déterminer si l'appareil est inactif ou si l'appareil est branché?
- 28. Comment déterminer si un pthread est actif?
- 29. Comment déterminer si objet est un NSNumber
- 30. Sur Solaris Sparc 64bit, un processus 64 bits peut-il charger une bibliothèque partagée 32 bits?
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
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? –
Ok, vérifié SYSTEM_INFO.wProcessorArchitecture et il correspond à l'information du système et non du processeur, donc cette solution fonctionne, merci. – metafex