Что нового в Windows 7: изменения в Wow64
Jun 9, 2009 · CommentsWindowsWindows 7Wow64
Наконец-то обновилась документация в MSDN. Теперь можно спокойно рассказать, что изменилось в Wow64 с выходом Windows 7.
-
Был полностью переписан механизм перенаправления реестра (Registry Redirection).
-
Была изменена структура реестра. Многие ключи, перенаправляемые ранее в Wow6432Node, теперь совместно используются 32-х и 64-х разрядными приложениями.
-
Механизм синхронизации 32-х и 64-х ключей (Registry Reflection) был с корнем выкорчеван и с позором изгнан из кода Windows. :-)
-
В документацию было внесено множество дополнений и исправлений.
Начну, пожалуй, с перенаправления реестра. Как известно, 64-х битные версии Windows поддерживают два разных представления реестра. Обращения 32-х разрядных приложений к «HKEY_LOCAL_MACHINE\Software» и некоторым другим ключам перенаправляются в «HKEY_LOCAL_MACHINE\Software\Wow6432Node». 64-х разрядные приложения обращаются к «HKEY_LOCAL_MACHINE\Software» напрямую. Таким образом, 32-х битные приложения частично изолируются от 64-х разрядных компонент.
В какой-то момент, разработчики Wow64 столкнулись с проблемой. Некоторые из перенаправляемых ключей должны на самом деле использоваться 32-х и 64-х разрядными приложениями совместно. Для решения этой проблемы был придуман механизм синхронизации (в соответствии со сложными правилами) 32-х и 64-х копий ключей. Он был назван «Registry Reflection».
Почему при этом не было решено отключить перенаправление для этих ключей – загадка. Вероятно, это объясняется особенностями реализации. Никаких разумных «архитектурных» соображений на этот счет нам найти не удалось.
Время показало, что идея использовать Registry Reflection была не слишком хороша. Реестр фундаментально не может обеспечить 100% надежно копирование данных из одного ключа в другой (как и 100% надежность любой другой операции). Но если для «нормальных» операций приложение может получить код ошибки и корректно обработать его, то в случае Registry Reflection приложение решительно ничего не может сделать с кодом ошибки операции копирования.
Помимо этого механизм Registry Reflection:
-
Не определяет метод разрешения конфликтов в случае, когда модифицируются обе копии ключа.
-
Конфликтует с механизмом поддержки транзакций в некоторых сценариях.
-
Создаёт сложности при раздельной установке 32-х и 64-х битных компонент.
-
Плохо справляется с большим количеством одновременно открытых ключей.
-
Создает сложности во время завершения процесса.
-
И т.д. и т.п.
Вдоволь намучавшись с сопровождением этого монстра, мы пришли к заключению, что проблему нужно решать кардинально. Результат – механизм Registry Reflection был полностью убран из Windows 7.
Для обеспечения обратной совместимости с Vista было сделано следующее:
-
Большинство ключей, которые синхронизировались с помощью Registry Reflection, были исключены из списка перенаправляемых ключей. Иными словами вместо раздельных копий ключа, 32-х и 64-х разрядные приложения теперь совместно используют один и тот же ключ. Полный перечень всех ключей можно найти тут: http://msdn.microsoft.com/en-us/library/aa384253(VS.85).aspx
-
Некоторые приложения обращаются к 32-х битным ключам по их «физическому» имени, с использованием Wow6432Node в пути, не смотря на то, что это некорректно. Вместо этого следует использовать флаг KEY_WOW64_32KEY. Тем не менее, в механизм перенаправления был обучен распознавать Wow6432Node в пути и интерпретировать наличие Wow6432Node в пути как попытку открыть 32-х разрядный ключ.
-
COM runtime был основным компонентом завязанным на Registry Reflection. В него были внесены изменения, позволяющие ему обходится без Registry Reflection. Внешние интерфейсы COM runtime при этом затронуты не были.
Тестирование этих изменений показало, что существующие приложения очень хорошо чувствуют себя в новом окружении, не замечая подмены. При этом заметно уменьшилось время, затрачиваемое приложениями на операции с реестром. Так, при установке Microsoft Office 2003 суммарное время всех операций с реестром сократилось примерно на 30%.
По итогам этой работы была пересмотрена и обновлена вся публичная документация, относящаяся к Wow64: