Как определить, является ли System.Diagnostics.Process 32 или 64-разрядным? - PullRequest
5 голосов
/ 26 августа 2010

Я пытался:

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

Но для процесса x64 возникло исключение:

Win32Exception: только часть запроса ReadProcessMemory или WriteProcessMemory завершена

Ответы [ 3 ]

8 голосов
/ 26 августа 2010

Вам нужно позвонить IsWow64Process через 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 );

Вот помощник, чтобы сделать вызов немного проще:

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 голос
/ 26 августа 2010

Ни WMI Win32_Process, ни System.Diagnostics.Process не предлагают никаких явных свойств.

Как насчет перебора загруженных модулей (Process.Modules), 32-битный процесс загрузит %WinDir%\syswow64\kernel32.dll, в то время как 64-битный процесс загрузит его из %WinDir%\system32\kernel32.dll (это одна DLL, которую загружает процесс Windows *).NB.Этот тест, конечно, не пройдет на экземпляре ОС x86.

0 голосов
/ 26 августа 2010

Environment.Is64BitProcess это, вероятно, то, что вы ищете.

...