7
votes

Comment déterminer si un système.Diagnostics.Process est de 32 ou 64 bits?

J'ai essayé: xxx

mais il a jeté une exception pour un processus x64:

Win32Exception: Seulement une partie de la demande ReadProcessMemorory OU DELLEPROCESSMEMORY Demande terminée


5 commentaires

Vous posez la mauvaise question. La vraie question devrait être: "Comment ai-je vis-à-vis de l'appel en lecture-propriété?"


@Hans je m'en fiche du tout à propos de cet appel tant que le titre de la question est répondu. Le problème que j'ai énuméré est juste une méthode de réponse du titre.


Dupliqué possible de Comment connaître un processus est de 32 bits ou 64 bits de manière programmatique


@Jesse La question que vous avez indiquée pose des questions sur le processus en cours, pas un autre processus.


regarde ma réponse. Il prend en compte d'autres processus car l'OP n'était pas clair.


3 Réponses :


1
votes

Ni win32_process ou system.diagnostics.process < / code> offre toute propriété explicite.

Que diriez-vous d'itération via les modules chargés ( < code> processus.modules ), un processus 32 bits aura chargé % windir% \ sswow64 \ kernel32.dll tandis qu'un processus 64 bits l'aura chargé de % Windir% \ system32 \ kernel32.dll (ceci est la DLL qui chaque est chargée de processus Windows).

nb. Ce test échoue, bien sûr, sur une instance X86 OS.


1 commentaires

Également échoue si elle est exécutée dans des procédés 32 bits lors de l'accès aux modules de processus 64 bits avec Win32Exception "Un processus 32 bits ne permet pas d'accéder à des modules d'un processus 64 bits".



0
votes

environnement.is64bacrocess est probablement ce que vous recherchez.


2 commentaires

Qui ne vous dit que si le processus d'appel est 64 bits, je pense que l'OP veut savoir si un autre processus est 64 bits


@Phil: Ouais, je n'étais pas sûr de ce que l'intention de l'OP était. Je pense qu'il peut descendre ou commenter.



12
votes

Vous devez appeler iswow64process via p / invoke:

public static bool Is64BitProcess( this Process process )
{
    if ( !Environment.Is64BitOperatingSystem )
        return false;

    bool isWow64Process;
    if ( !IsWow64Process( process.Handle, out isWow64Process ) )
        throw new Win32Exception( Marshal.GetLastWin32Error() );

    return !isWow64Process;
}


3 commentaires

Cette méthode échouera dans les fenêtres 32 bits


Sur Windows 32 bits, tous les processus sont 32 bits, il n'ya donc aucun besoin de vérifier. J'ai édité IS64BitProcession de refléter cela.


Utilisez Process.SafeHandle Propriété pour empêcher le processus de nettoyage GC.Handle tandis que Winapi est appelé.