﻿# Как 32\-битной программе узнать, что она запущена в 64\-битной Windows?

64\-разрядные операционные системы семейства Windows могут исполнять 32\-разрядные программы с помощью подсистемы WoW64 \(Windows on Windows 64\), которая эмулирует 32\-битное окружение за счет дополнительной прослойки между 32\-битным приложением и 64\-битным Windows API\.

32\-битная программа может узнать, запущена ли она в WoW64, с помощью функции IsWow64Process\. Дополнительную информацию о процессоре программа может получить через функцию GetNativeSystemInfo\.

Стоит помнить, что функция IsWow64Process включена только в 64\-битные версии Windows\. Узнать, присутствует ли функция IsWow64Process в системе, и получить к ней доступ, можно при помощи функции GetProcAddress и GetModuleHandle\. Пример, демонстрирующий корректное использование функции IsWow64Process \([скачать проект](https://pvs-studio.com/external-pictures/iswow64process_example.7z)\):

```cpp
#include "stdafx.h"

bool IsWow64()
{
  BOOL bIsWow64 = FALSE;

  typedef BOOL (APIENTRY *LPFN_ISWOW64PROCESS)
    (HANDLE, PBOOL);

  LPFN_ISWOW64PROCESS fnIsWow64Process;

  HMODULE module = GetModuleHandle(_T("kernel32"));
  const char funcName[] = "IsWow64Process";
  fnIsWow64Process = (LPFN_ISWOW64PROCESS)
    GetProcAddress(module, funcName);

  if(NULL != fnIsWow64Process)
  {
    if (!fnIsWow64Process(GetCurrentProcess(),
                          &bIsWow64))
      throw std::exception("Unknown error");
  }
  return bIsWow64 != FALSE;
}

void main()
{
  if (IsWow64())
    printf("The process is running under WOW64.\n");
  else
    printf("The process is not running under WOW64.\n");

  printf("\nPress Enter to continue...");
  getchar();
}
```

## Библиографический список

1. The Bereznikers\. [How to detect 64\-bit OS](https://www.berezniker.com/content/pages/visual-foxpro/how-detect-64-bit-os)\.
1. MSDN Library\. [IsWow64Process Function](https://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx)\.