﻿# 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\-битных утилитах для работы с реестром, как например, [здесь](https://forums.spybot.info/showthread.php?20326-Bug-RegAlyzer-1-5-5-endless-loop-on-Vista-64bit-in-Wow6432Node)\.

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

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

В качестве примера ошибки, которая связана с WOW6432Node, можно привести дефект в программном комплексе, состоящий из взаимодействующих 32\-битных и 64\-битных модулей, которые используют [различные представления реестра](https://msdn.microsoft.com/en-us/library/aa384129(v=VS.85).aspx)\. В одной из программ следующая строчка в 32\-битном модуле стала неработоспособной:

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

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

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

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

1. MSDN Library\. [is HKLM\\Software\\Wow6432Node\\Wow6432Node\\Wow6432Node not a visual c\+\+ bug?](https://social.msdn.microsoft.com/Forums/vstudio/en-US/f9f2b633-6004-4a6b-85ef-cb0a8108fdda/is-hklmsoftwarewow6432nodewow6432nodewow6432node-not-a-visual-c-bug?forum=vclanguage)
1. MSDN Library\. [32\-bit and 64\-bit Application Data in the Registry](https://msdn.microsoft.com/en-us/library/ms724072(VS.85).aspx)\.