>
>
WOW6432Node и API-функции RegOpenKeyEx …

Андрей Карпов
Статей: 671

WOW6432Node и API-функции RegOpenKeyEx / RegEnumKeyEx

Реестр 64-разрядных версий Windows подразделяется на 32- и 64-разрядные разделы. Большинство 32-разрядных разделов имеют те же имена, что и их аналоги в 64-разрядном разделе, и наоборот. По умолчанию в 64-разрядных версиях Windows используется отображение 32-разрядных разделов в узле WOW6432Node. Процесс отображения прозрачен для 32-разрядных приложений, т.е. они могут получать доступ к разделам реестра так, как будто бы они работали в 32-битном окружении несмотря на то, что данные хранятся в другом месте.

Такое поведение приводит к проблемам в тех случаях, когда 32-разрядные приложения пытаются обратиться к узлу WOW6432Node с помощью функций Windows API (например RegOpenKeyEx и RegEnumKeyEx). При обращении к узлу HKLM\Software\Wow6432Node происходит перенаправление и возникает бесконечная петля вида HKLM\Software\Wow6432Node\Wow6432Node\Wow6432Node\... и т.д. С подобными ошибками часто можно столкнуться в различных 32-битных утилитах для работы с реестром, как например, здесь.

Начиная с Windows Server 2008 узел HKLM\Software\Wow6432Node скрыт от функции RegEnumKeyEx, что правда не гарантирует отсутствия бесконечной рекурсии при попытке прямого доступа к нему.

Если же вы хотите работать с 64-битными разделами реестра из 32-битной программы, то вам следует открывать узел HKLM\Software используя ключ KEY_WOW64_64KEY. Но не пытайтесь получить доступ напрямую к WOW6432Node и избегайте создания новых узлов реестра с таким именем.

В качестве примера ошибки, которая связана с WOW6432Node, можно привести дефект в программном комплексе, состоящий из взаимодействующих 32-битных и 64-битных модулей, которые используют различные представления реестра. В одной из программ следующая строчка в 32-битном модуле стала неработоспособной:

lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  "SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources", 0,
  KEY_QUERY_VALUE,  &hKey);

Чтобы подружить эту программу с другими 64-битными частями, необходимо вписать ключ KEY_WOW64_64KEY:

lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  "SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources", 0,
  KEY_QUERY_VALUE | KEY_WOW64_64KEY,  &hKey);

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