Что нового в Windows 7: изменения в Wow64.
Наконец-то обновилась документация в 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:
Хмм, первая мысль была – Wow64: 64 битную версию World of Warcraft что-ли выпустили?
Что такое Wow?
Wow64 – это подсистема, позволяющая запускать 32-х разрадные приложения на 64-х разрядных версиях Windows.
а к multi-touch (wm_touch и wm_gesture) ты никакого отношения не имеешь? было бы интересно услышать информацию о причинах имеющейся реализации и возможно о планах (реализовывая поддержку multitouch&gestures в Qt появились некоторые идеи.
Ни малейшего.
Ураааа!!! отличная новость, спасибо!
завтра покажу нашему разработчику регклинера и регсканера! Надо сказать, что мы поддерживали и 64-х битные версии этих программ, но отладка превращалась в один сплошной вокэраунд и think different
Я может чуть позже еще с вопросами отпишу, если таковые будут иметься, а пока все понятно на первый взгляд.
Зато есть вопрос немного в сторону – не поменяется ли в ближайшем обозримом будущем raw-формат реестра (самого файла реестра)? Для некоторых операций мы, бывает, используем чтение этого файла напрямую.
У меня нет никаких сведений на этот счет.
День добрый!
А не могли бы вы что-нибудь рассказать про появившиеся в 7-ке стаб DLL (api-ms-*.dll)?
Судя по названиям и наличию версии (?) в имени файлов похоже, что 8-ка будет а)модульная по самое небалуйся; б) без проблем с совместимостью, т.к. старые приложения будут юзать код из старых версий библиотек.
Я правильно мыслю? Или это вообще что-то другое?
комментарии модерируются или просто мой не отправился?
Я знаю об этой функциональности только понаслышке. Т.е. скорее не знаю, чем знаю. Вот здесь есть небольшое исследование на эту тему: http://www.nirsoft.net/articles/windows_7_kernel_architecture_changes.html. Мне не удалось найти что либо официальное по теме.
Windows 7, так же как и Vista, и так модульные по самое небалуйся. Загляните в %windr%\WinSxS. Возможность слинковаться с конкретной версией библиотеки проблему совместимости полностью не решает, хотя и здорово помогает.
Модерируются. Спаммеры, то-сё…
Спасибо за ответ!
То, о чем говорится на nirsoft, я и сам раскопал. Хотелось бы узнать что с этим MS хочет делать и как это может помочь обычным и не совсем юзерам.
Надеюсь, когда у вас будет информация (да ещё и разрешенная для публикации) вы напиште пост на эту тему.
Спасибо за блог! Очень интересно вас читать, один из немногих стоящих блогов!
У вас отличный и интересный блог. Я так понял вы в команде WOW64. Желаю вам интересного и хеппи хакинга!
Интересует следующий вопрос. Как можно попасть в Kernel Team? Какие нибудь советы/рекомендации/необходимый опыт/знания/умения?
Искать нужно примерно здесь: http://members.microsoft.com/careers/search/default.aspx. Ключевые слова C, ntsd, kernel, Windows internals и т.п. Ничего космического в требованиях, в принципе, нет.