2010-08-26 9 views
5

me trataron:Cómo determinar si un System.Diagnostics.Process es de 32 o 64 bits?

process.MainModule.FileName.Contains("x86") 

Pero inició una excepción para un proceso de 64 bits:

Win32Exception: Sólo una parte de la solicitud ou WriteProcessMemory ReadProcessMemory terminado

+1

Usted está haciendo la pregunta equivocada. La verdadera pregunta debería ser: "¿Cómo metí la llamada a ReadProcessMemory?" –

+1

@Hans No me importa en absoluto esta llamada, siempre que se responda el título de la pregunta. El problema que enumeré es solo un método para responder el título. –

+0

posible duplicado de [Cómo saber que un proceso es de 32 bits o de 64 bits mediante programación] (http://stackoverflow.com/questions/1953377/how-to-know-a-process-is-32-bit-or -64-bit-programmatically) –

Respuesta

8

es necesario llamar a IsWow64Process a través de P/Invoke:

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

Aquí es un ayudante para que sea un poco más fácil para llamar:

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; 
} 
+1

este método fallará en Windows de 32 bits –

+1

En Windows de 32 bits, todos los procesos son de 32 bits, por lo que no es necesario verificarlo. He editado Is64BitProcess para reflejar esto. –

+0

Utilice la propiedad Process.SafeHandle para evitar el proceso de limpieza de GC. Manipule mientras se invoca WinAPI. –

1

Ni WMI Win32_Process o System.Diagnostics.Process ofrecen cualquier propiedad explícita.

¿Qué hay de iteración a través de los módulos cargados (Process.Modules), un proceso de 32 bits se habrá cargado %WinDir%\syswow64\kernel32.dll mientras que un proceso de 64 bits se han cargado desde %WinDir%\system32\kernel32.dll (esta es la DLL que cada cargas de proceso de Windows).

NB. Esta prueba, por supuesto, fallará en una instancia del sistema operativo x86.

0

Environment.Is64BitProcess es probablemente lo que estás buscando.

+2

Eso solo dice que si el proceso de llamada es de 64 bits, creo que OP desea saber si hay otro proceso de 64 bits –

+0

@Phil: Sí, no estaba seguro de cuál era la intención del OP. Me imagino que puede rechazar o comentar. –

+0

Este método que apuntó no está incluido en .NET Fx –

Cuestiones relacionadas