Registry redirector

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

Wow64 поддерживает два различных представления реестра для 32 и 64-битных приложений. 32-битные приложения использует собственные версии следующих веток реестра:

HKEY_CLASSES_ROOT HKEY_CURRENT_USER\Software\Classes HKEY_LOCAL_MACHINE\Software HKEY_USERS*\Software\Classes HKEY_USERS*_Classes

В результате регистрационные данные 32 и 64-битных COM объектов хранятся в разных местах. Этот механизм получил название «registry redirection» (не путать с «registry reflection»).

Как это реализовано? Как я писал ранее, Wow64 перехватывает все функции, экспортируемые из ntdll.dll, в том числе и функции для работы с реестром. В случае, если приложение обращается к одной из ветвей перечисленных выше, Wow64 добавляет «Wow6432Node» к пути. Иными словами все обращения перенаправляются в следующие ветки:

HKEY_CLASSES_ROOT\Wow6432Node HKEY_CURRENT_USER\Software\Classes\Wow6432Node HKEY_LOCAL_MACHINE\Software\Wow6432Node HKEY_USERS*\Software\Classes\Wow6432Node HKEY_USERS*_Classes\Wow6432Node

Подобный механизм имеет несколько побочных эффектов. Во-первых, 32-битные приложения не могут создать ключ, совпадающий с именем любой из вышеперечисленных веток. При попытке создать такой ключ Wow64 вернет ошибку «ключ с таким именем уже существует». Этот результат хотя и идентичен тому, что получит 64-битное приложение, однако в случае 32-битного приложение он выглядит странно – ключ-то не виден.

Во-вторых, добавление дополнительного элемента в путь уменьшает максимальную вложенность имени. В случае Wow64 максимальный уровень вложенности – 31. В случае обычной 32-битной системы максимальный уровень вложенности – 32.

В-третьих, 32-битные приложения не могут напрямую обращаться к 64-битной копии реестра. Чтобы обеспечить эту возможность в список флагов доступа были добавлены два новых флага: KEY_WOW64_32KEY и KEY_WOW64_64KEY. Функции RegCreateKey(Ex) и RegOpenKey(Ex) устанавливают режим доступа в соответствии с переданными флагами.

Статья в MSDN: Registry Redirector

comments powered by Disqus