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

Средство перенаправления реестра изолирует 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-разрядный мир". 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.

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