Как я могу определить, является ли процесс 32 или 64 бит из дескриптора? - PullRequest
2 голосов
/ 24 июля 2010

Как я могу получить информацию из дескриптора процесса, полученного с помощью OpenProcess, является ли процесс 32- или 64-битным?

Ответы [ 3 ]

3 голосов
/ 24 июля 2010

Да, IsWow64Process досадно бесполезен. Это на самом деле означает «включена 32-битная эмуляция» и возвращает false, если вы работаете в 32-битной операционной системе, эмуляция не требуется.

Вы сможете извлечь из этого выгоду только в том случае, если вы точно знаете, что работаете в 64-битной операционной системе. Что сложно выяснить. IntPtr.Size == 8 проверяет, что вы запускаете 64-разрядную версию, но не доказывает, что она определенно не является 64-разрядной операционной системой. 64-разрядная версия платформы, возможно, не была установлена. Или ваш код может быть запущен из .exe, для которого Platform Target принудительно установлен x86. Что не необычно для кода, который заинтересован в битности.

Вам потребуется P / Invoke GetNativeSystemInfo (). Если это выбрасывает (или GetProcAddress возвращает IntPtr.Zero), вы точно знаете, что это 32-разрядная операционная система. Если это не так, проверьте значение SYSTEM_INFO.wProcessorArchitecture. Это будет 9 для x64, 6 для Titanium, 0 для x86. Так что, если вы получите 9, то используйте IsWow64Process. Посетите pinvoke.net для объявлений.

Обратите внимание, что новая .NET 4.0 Environment.Is64BitOperatingSystem имеет тот же недостаток.

1 голос
/ 24 июля 2010

Вы можете проверить это, используя следующий код:

     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;
         }
 }
0 голосов
/ 02 августа 2017

Это C-код с участием некоторого Python, но он дает вам представление. Вот отполированная версия:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...