Доступ к альтернативным представлениям реестра
Aug 28, 2006 · CommentsWow64
64-битные версии Windows поддерживают два различных представления реестра для 32 и 64-битных приложений. По-умолчанию приложения работают со своим представлением. Также они могут выбирать желаемое представление с помощью флагов KEY_WOW64_32KEY
и KEY_WOW64_64KEY
. Применение этих флагов кажется очевидным и прямолинейным, однако это не совсем так.
Первая сложность – это возможность переключения выбранного представления на лету. Проблема заключается в том, что при переключении путь к ключу меняется по нетривиальному алгоритму. Например, можете ли вы сказать, на какой ключ будет указывать hChild
после выполнения следующего кода?
HKEY hParent = NULL;
RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"SOFTWARE",
0,
KEY_READ | KEY_WOW64_32KEY,
&hParent);
HKEY hChild = NULL;
RegOpenKeyEx(
hParent,
"Microsoft",
0,
KEY_READ | KEY_WOW64_64KEY,
&hChild);
Будет это «HKLM\SOFTWARE\Microsoft» или «HKLM\SOFTWARE\Wow6432Node\Microsoft»? Для предотвращения этой проблемы рекомендуется избегать переключения выбранного представления на лету. Комбинация флагов KEY_WOW64_XXKEY
использованная для открытия или создания родительского ключа должна использоваться и для всех подчиненных ключей.
Вторая сложность – за выбор желаемого представления реестра отвечают разные компоненты в случае 32 и 64-битных приложений. В случае 32-битных приложений wow64.dll перехватывает вызовы функций NtCreateKey
и NtOpenKey
, добавляя необходимую функциональность. 64-битные приложения используют вспомогательные функции из advapi32.dll, которые вызываются 64-битными реализациями функций RegCreateKeyEx
, RegOpenKeyEx
и RegDeleteKeyEx
. Иными словами если 64-битное приложение использует функции Native API напрямую оно должно быть готово к тому, что NtCreateKey
и NtOpenKey
ничего не знают о разных представлениях реестра.