[#] Неожиданное поведение WinAPI-функции IsWow64Process()
habrabot(difrex,1) — All
2016-08-25 13:00:04


Эта заметка пишется для тех, кто когда-нибудь будет гуглить название WinAPI-функции [IsWow64Process()][1] в попытках понять, почему же она иногда работает не так, как это описано в MSDN. Вполне возможно, что это буду я сам через год-другой. Но, возможно, пригодиться и кому-то ещё.

Итак, о чём же идёт речь? Операционная система Windows, как известно, бывает 32-битной или 64-битной. На 32-битной Windows можно запустить только 32-битные приложения — а значит вопрос «это 32-битное приложение или 64-битное?» там попросту не имеет смысла, ответ известен заранее. Жизнь на 64-битном варианте Windows немного веселее — здесь можно запускать как 64-битные приложения (они считаются нативными), так и 32-битные, которые не являются родными для ОС, и выполняются они в специальной подсистеме WoW64 [(Windows-on-Windows 64-bit)][2]. Подсистема эта включает в себя средства запуска 32-битного кода, отдельные ветки реестра и системные папки для работы 32-битных приложений в 64-битной среде.

Иногда бывает важно знать, является ли некоторый процесс, работающий в 64-битной Windows, действительно нативным 64-битным процессом, или WoW64-процессом (то есть 32-битным приложением, работающим в WoW64-подсистеме). Для этих целей Microsoft предлагает использовать функцию [IsWow64Process()][3]. Описание в MSDN достаточно детально, есть пара предупреждений на счёт способа её вызова, но в общём-то всё тривиально. Пример кода даже есть. Беда только в том, что в некоторых случаях эта функция врёт и определяет архитектуру процесса неверно.
[Читать дальше →][4]

[1]: https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms684139(v=vs.85).aspx
[2]: https://ru.wikipedia.org/wiki/WOW64
[3]: https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms684139(v=vs.85).aspx
[4]: https://habrahabr.ru/post/308490/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut