Определение архитектуры процессора конкретного процесса в C # - PullRequest
3 голосов
/ 08 января 2011

Я пишу код на C #.Мой код будет работать в режиме Any CPU и с повышенными правами.

Моя цель - перечислить все процессы в машине с Process.GetProcesses(), и для каждого процесса определить его архитектуру ЦП: x86 , x64 или IA64 .

Я внедряю внедрение кода в C #, и мне нужно определить архитектуру целевого процесса, чтобы решить, какие коды операций вводить.

Как это сделать?

Спасибо.

Ответы [ 6 ]

2 голосов
/ 01 марта 2011

Определение:

    [DllImport("kernel32.dll")]
    internal static extern void GetNativeSystemInfo(ref SystemInfo lpSystemInfo);

    [DllImport("kernel32.dll")]
    internal static extern void GetSystemInfo(ref SystemInfo lpSystemInfo);

    [StructLayout(LayoutKind.Sequential)]
    internal struct SystemInfo
    {
        public ushort wProcessorArchitecture;
        public ushort wReserved;
        public uint dwPageSize;
        public IntPtr lpMinimumApplicationAddress;
        public IntPtr lpMaximumApplicationAddress;
        public UIntPtr dwActiveProcessorMask;
        public uint dwNumberOfProcessors;
        public uint dwProcessorType;
        public uint dwAllocationGranularity;
        public ushort wProcessorLevel;
        public ushort wProcessorRevision;
    }

    internal const ushort ProcessorArchitectureIntel = 0;
    internal const ushort ProcessorArchitectureIa64 = 6;
    internal const ushort ProcessorArchitectureAmd64 = 9;
    internal const ushort ProcessorArchitectureUnknown = 0xFFFF;

GetNativeSystemInfo вернет вам информацию о машине, на которой вы работаете. GetSystemInfo вернет вам информацию о виртуализированной среде, в которой вы работаете (которая будет такой же, как GetNativeSystemInfo, если ее нет).

т.е: В 32-битной Windows вы всегда будете иметь wProcessorArchitecture == ProcessorArchitectureIntel.

В 64-битной Windows вы получите wProcessorArchitecture == ProcessorArchitectureIntel для GetSystemInfo, но wProcessorArchitecture == ProcessorArchitectureAmd64 для GetNativeSystemInfo, если вы работаете как 32-битный процесс.

Очевидно, что они оба будут ProcessorArchitectureAmd64, если вы используете 64-битный процесс в 64-битной Windows.

1 голос
/ 07 августа 2011

Alastair прав в том, что вы не можете просто вызвать IsWow64Process, но вам также не нужно напрямую вызывать другую функцию WinApi.Вот более короткое решение.

    /// <summary>
    /// TRUE if the process is running under WOW64. That is if it is a 32 bit process running on 64 bit Windows.
    /// If the process is running under 32-bit Windows, the value is set to FALSE. 
    /// If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.
    /// </summary>
    [DllImport( "kernel32.dll" )]
    static extern bool IsWow64Process( System.IntPtr aProcessHandle, out bool lpSystemInfo );

    /// <summary>
    /// Indicates if the process is 32 or 64 bit.
    /// </summary>
    /// <param name="aProcessHandle">process to query</param>
    /// <returns>true: process is 64 bit; false: process is 32 bit</returns>
    public static bool Is64BitProcess( System.IntPtr aProcessHandle )
    {
        bool lIs64BitProcess = false;
        if ( System.Environment.Is64BitOperatingSystem ) {
            IsWow64Process( aProcessHandle, out lIs64BitProcess );
        }
        return lIs64BitProcess;
    }
1 голос
/ 08 января 2011

Вы можете p / invoke QueryFullProcessImageName или GetProcessImageFileName и затем прочитать PE-заголовок .exe-файла.

1 голос
/ 08 января 2011

Вы должны обратиться к Win32, чтобы получить эту информацию:

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern bool IsWow64Process(System.IntPtr hProcess, out bool lpSystemInfo);

public bool IsWow64Process(System.Diagnostics.Process process)
{
    bool retVal = false;
    IsWow64Process(process.Handle, out retVal);
    return retVal;
}

Вызов IsWow64Process(process) для каждого процесса скажет вам, является ли он 64-битным или нет. Я не сталкивался с методом, чтобы определить, является ли процесс x64 или IA64, только его "битность".

0 голосов
/ 15 октября 2013

Я думаю, вы все на правильном пути, но в возвращаемом значении отсутствует оператор not.Если вы работаете на 64-битной машине, а процесс WOW64, то это 32-битный процесс (см. Комментарии выше IsWow64Process)Кроме того, возможность IsWow64Process возвращать ошибку не обрабатывается.Вот исправленная версия:

/// <summary>
/// TRUE if the process is running under WOW64. That is if it is a 32 bit process running on 64 bit Windows.
/// If the process is running under 32-bit Windows, the value is set to FALSE. 
/// If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.
/// </summary>
[DllImport("kernel32.dll", SetLastError=true)]
static extern bool IsWow64Process(System.IntPtr aProcessHandle, out bool isWow64Process);

/// <summary>
/// Indicates if the process is 32 or 64 bit.
/// </summary>
/// <param name="aProcessHandle">process to query</param>
/// <returns>true: process is 64 bit; false: process is 32 bit</returns>
public static bool Is64BitProcess(System.IntPtr aProcessHandle)
{
    if (!System.Environment.Is64BitOperatingSystem)
        return false;

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

    return !isWow64Process;
}
0 голосов
/ 08 января 2011

Вы можете попробовать P / Invoke:

BOOL WINAPI IsWow64Process(  __in   HANDLE hProcess, __out  PBOOL Wow64Process);
...