Поделиться через


Перенаправитель реестра

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

Windows 10 в ARM. Помимо 32-разрядного логического представления для приложений x86, Windows 10 в ARM включает отдельное логическое представление для 32-разрядных приложений ARM.

Подмножество ключей в перенаправленных путях реестра являются общими. 32-разрядные вызовы реестра для общих ключей не перенаправляются. Вместо этого одна физическая копия раздела сопоставляется с каждым логическим представлением реестра. Список перенаправленных и общих ключей см. в разделе Разделы реестра, затронутые WOW64.

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: Чтобы обеспечить взаимодействие приложений с помощью COM и других механизмов, также отражается подмножество перенаправленных разделов реестра. Процесс отражения реестра копирует разделы и значения реестра между двумя представлениями реестра, чтобы обеспечить их синхронизацию. Отражение реестра было удалено начиная с Windows 7 и Windows Server 2008 R2. Дополнительные сведения см. в разделе Отражение реестра.

Следующий сценарий демонстрирует использование этих логических представлений:

  • 32-разрядное приложение x86 проверяет наличие следующего раздела реестра: HKEY_LOCAL_MACHINE\Software\Hello. Если ключ не существует, приложение создает его со значением по умолчанию "Hello 32-bit x86 world"; В противном случае он считывает и отображает значение .
  • Это же приложение изменено для записи "Hello 64-разрядный мир" вместо "Hello 32-bit x86 world" и перекомпилируется как 64-разрядное приложение x64 или ARM64.
  • Windows 10 в ARM. Это же приложение изменено для записи "Hello 32-bit ARM world" и перекомпилируется как 32-разрядное приложение ARM.
  • При запуске 32-разрядного приложения x86 в 64-разрядной версии Windows отображается сообщение "Hello 32-bit x86 world". При запуске 64-разрядного приложения отображается сообщение Hello 64-bit world. Windows 10 в ARM. При запуске 32-разрядного приложения ARM в 64-разрядной версии Windows ARM64 отображается сообщение Hello 32-bit ARM world. Все приложения вызывают одни и те же функции реестра с одинаковым предопределенным дескриптором и одинаковым именем ключа; разница заключается в том, что каждое приложение работает со своим логическим представлением реестра, и каждое представление сопоставляется с отдельным физическим расположением реестра, которое сохраняет все версии строки без изменений.

Перенаправленные ключи сопоставляются с физическими расположениями в Wow6432Node. Например, HKEY_LOCAL_MACHINE\Software перенаправляется в HKEY_LOCAL_MACHINE\Software\Wow6432Node. Однако физическое расположение перенаправленных ключей следует считать зарезервированным системой. Приложения не должны обращаться к физическому расположению ключа напрямую, так как это расположение может измениться. Дополнительные сведения см. в разделе Доступ к альтернативному представлению реестра.

Windows 10 в ARM: перенаправленные 32-разрядные ключи ARM сопоставляются с физическими расположениями в WowAA32Node.

Чтобы помочь 32-разрядным приложениям, которые записывают REG_SZ или REG_EXPAND_SZ данные, содержащие %ProgramFiles% или %commonprogramfiles% в реестр, WOW64 перехватывает эти операции записи и заменяет их на "%ProgramFiles(x86)%" и "%commonprogramfiles(x86)%". Например, если каталог Program Files находится на диске C, то "%ProgramFiles(x86)%" разворачивается до "C:\Program Files (x86)". Замена выполняется только при выполнении следующих условий:

  • Строка должна начинаться с %ProgramFiles% или %commonprogramfiles%. Если строка начинается с пробела или любого символа, отличного от %, она не заменяется.
  • Регистр %ProgramFiles% или %commonprogramfiles% должен быть точно таким, как показано, так как при сравнении строк учитывается регистр. Например, если строка начинается с %CommonProgramFiles% вместо %commonprogramfiles%, она не заменяется.
  • Длина строки не может превышать MAX_PATH*2+15 символов. Если длина превышает эту длину, она не заменяется.
  • Ключ нельзя открыть с помощью KEY_WOW64_64KEY. Этот флаг указывает, что операции с разделом должны выполняться в 64-разрядном представлении реестра, поэтому он не заменяется. Дополнительные сведения см. в разделе Доступ к альтернативному представлению реестра.

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: Флаг KEY_WOW_64_64KEY не влияет на замену ключа. Этот флаг влияет на замену, начиная с Windows 7 и Windows Server 2008 R2.

Кроме того, REG_SZ или REG_EXPAND_SZ ключи, содержащие system32, заменяются на syswow64. Строка должна начинаться с пути, указывающего на %windir%\system32 или в ней. Сравнение строк не учитывает регистр. Переменные среды разворачиваются перед сопоставлением пути, поэтому заменяются все следующие пути: %windir%\system32, %SystemRoot%\system32 и C:\windows\system32. Это исправление применяется только к ключам, которые были отражены до Windows 7.

Дополнительные сведения см. в следующих разделах: