Отражение реестра
[Сведения в этом разделе относятся к Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP. Начиная с Windows 7 и Windows Server 2008 R2, WOW64 больше не использует отражение реестра, а ранее отраженные ключи являются общими. Дополнительные сведения см. в разделе Разделы реестра, затронутые WOW64.]
Перенаправитель реестра изолирует 32-разрядные и 64-разрядные приложения, предоставляя отдельные логические представления определенных частей реестра в WOW64. Однако значения некоторых разделов реестра должны быть одинаковыми как в 32-разрядном, так и в 64-разрядном представлениях.
Процесс отражения реестра копирует разделы и значения реестра между двумя представлениями реестра, чтобы обеспечить их синхронизацию. Каждое представление имеет отдельную физическую копию каждого отраженного раздела реестра: одну для 32-разрядного представления реестра, а другую — для 64-разрядного представления реестра.
Отраженный ключ копируется при закрытии ключа путем вызова RegCloseKey. Обратите внимание, что это приводит к возможному состоянию гонки: если несколько процессов изменяет отраженный ключ, последний вызов RegCloseKey определяет окончательное значение ключа.
Отражатель копирует данные активации COM для локальных серверов между представлениями, но не копирует внутрипроцессные данные, так как в 64-разрядной версии Windows не разрешено комбинирование внутрипроцессных данных.
Отражение не включено для общих разделов реестра или разделов реестра, которые не перенаправляются. Например, отражение не включено для ключаHKEY_LOCAL_MACHINE\System . Список перенаправляемых, общих или отраженных разделов реестра см. в разделе Разделы реестра, затронутые WOW64.
Отражение реестра использует политику "Последний модуль записи выигрывает", как показано в следующем примере:
- После чистой установки 64-разрядной версии Windows регистрируется 64-разрядная Wordpad.exe для обработки .doc файлов. Отражатель копирует регистрацию .doc из 64-разрядного представления реестра в 32-разрядное представление реестра.
- Администратор устанавливает 32-разрядную версию Office, которая регистрирует 32-разрядные Winword.exe для обработки .doc файлов в 32-разрядном представлении реестра. Рефлектор реестра копирует эти сведения в 64-разрядное представление реестра, поэтому как 32-разрядные, так и 64-разрядные приложения запускают 32-разрядную версию Winword.exe для .doc файлов.
- Администратор устанавливает 64-разрядную версию Office, которая регистрирует 64-разрядные Winword.exe для обработки .doc файлов в 64-разрядном представлении реестра. Рефлектор реестра копирует эти сведения в 32-разрядный реестр, поэтому как 32-разрядные, так и 64-разрядные приложения запускают 64-разрядную версию Winword.exe для .doc файлов.
Таким образом, сведения о сопоставлении файлов сохраняются для последнего установленного приложения.
Это может быть полезно для 32-разрядных и 64-разрядных приложений для совместного использования определенных значений разделов реестра, которые обычно записываются в отдельные представления реестра. Например, 32-разрядный OLE-сервер, который может обслуживать запросы от 32-разрядных и 64-разрядных клиентов, может сделать 32-разрядные данные реестра доступными для 64-разрядного представления системного реестра.
Когда компонент записывает данные в системный реестр, WOW64 анализирует сведения и при необходимости копирует данные в альтернативном представлении реестра. Как правило, этот процесс сохраняет две отдельные физические копии одних и того же раздела реестра в обоих представлениях реестра и называется отражением реестра или зеркальным отображением реестра.
Большинство ключей в корневом каталоге классов относятся к этой категории. Обновления ключей отражаются при завершении обновления и закрытии дескриптора ключа. В определенных случаях операции записи в ключ не отражаются, если ключ имеет некоторую зависимость разрядности. Например, 32-разрядный ключ InprocServer32 не относится к 64-разрядным приложениям, поэтому ключ InprocServer32 не отражается в 64-разрядном представлении реестра. Однако 64-разрядные приложения могут использовать 32-разрядный ключ LocalServer32, и ключ LocalServer32 будет отражен.
Для HKEY_LOCAL_MACHINE\Software\Classes\CLSID и HKEY_CURRENT_USER\Software\Classes\CLSIDотражаются только идентификаторы CLSID, не указывающие InprocServer32 или InprocHandler32. Отражаются только идентификаторы CLSID LocalServer32, так как они выполняются вне процесса и могут быть активированы 32- или 64-разрядными приложениями. Идентификаторы CLSID InProcServer32 не отражаются, так как невозможно загрузить 32-разрядную библиотеку DLL для выполнения в 64-разрядном процессе или 64-разрядную библиотеку DLL для выполнения в 32-разрядном процессе.
Для HKEY_LOCAL_MACHINE\Software\Classes\Appid и HKEY_CURRENT_USER\Software\Classes\Appidзначения реестра DllSurrogate и DllSurrogateExecutable не отражаются, если их значение является пустой строкой.
Чтобы отключить и включить отражение реестра для определенного отраженного раздела, используйте функции RegDisableReflectionKey и RegEnableReflectionKey . Эти функции не влияют на ключи, которых нет в списке отраженных ключей ранее в этом разделе. Приложения должны отключать отражение только для создаваемых ими разделов реестра и не пытаться отключить отражение для предопределенных ключей, таких как HKEY_LOCAL_MACHINE или HKEY_CURRENT_USER. Чтобы определить, отключены ли ключи в списке отражения, используйте функцию RegQueryReflectionKey .
Отраженные ключи не следует использовать в транзакциях реестра. Запись в отраженные ключи во время транзакции может привести к сбою транзакции. Дополнительные сведения о транзакциях см. в разделе Диспетчер транзакций ядра.
Связанные темы