Как работает режим совместимости в Windows?
4 ответа
Режим совместимости достигается с помощью так называемых прокладок. На TechNet есть хорошая статья, описывающая, как они работают.
Файлы приложений Windows содержат таблицу импорта, которая сообщает загрузчику приложения, какие DLL нужны приложению и какие функции оно использует из них. Например, процесс может ссылаться на GetVersionEx
в kernel32.dll
. Когда программа должна работать в режиме совместимости, тогда между приложением помещается прокладка, а оболочка заменяет функцию GetVersionEx
, так что приложение вызывает не GetVersionEx
из kernel32.dll
а GetVersionEx
в оболочке . Затем функции Shimmed реализуют поведение предыдущих версий Windows. GetVersionEx
- простой пример, каждая версия Windows возвращает свои собственные номера версий в GetVersionEx
, поэтому при фальсификации старой Windows функция GetVersionEx
теперь возвращает не номера версий Windows 7, а, например, номера версий Windows XP. Таким образом, приложение будет считать, что оно работает на Windows XP.
Также были некоторые другие изменения от версии Windows до версии Windows. Например, в более старых версиях, если программа загружала DLL, путь поиска для DLL также включал текущий каталог. Это проблема безопасности, поэтому более новые версии Windows по умолчанию не выполняют поиск в текущем каталоге. С помощью соответствующей прокладки вы можете смоделировать старое поведение.
Так как прокладки - это просто слой между приложением и Windows API, прокладка может просто делать то, что приложение может делать само. Шим не может использоваться, например, для обхода UAC или доступа к защищенным файлам.
Если вы хотите узнать больше, вот несколько ссылок, которые могут вас заинтересовать:
- Использование перенаправления CorrectFilePaths для перенаправления файлов в Windows Vista
- Создание приложения совместимости приложений с помощью Microsoft Application Compatibility Toolkit
- Блог MSDN по внутренним основам прокладок
Особенно стоит обратить внимание на Microsoft Application Compatibility Toolkit. Этот инструмент дает обзор приложений с известными проблемами, всех доступных исправлений и режимов совместимости, а также того, какие исправления применяются к каждому приложению.
Я думаю, что происходит много разных вещей. Прямым примером является то, что программа может проверить вашу версию Windows, но может быть сбит с толку возвращаемым значением новой операционной системы. Поэтому, используя режим совместимости, Windows сообщит о неверной версии. Раймонд Чен упоминает еще несколько вещей:http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45590
Я знаю, что режим совместимости заставляет программу вызывать несколько системных вызовов Windows.
Одним из очевидных примеров являются функции GetVersionEx и GetVersion, которые сообщают указанную версию Windows вместо реальной.
Пути к файлам старого стиля также автоматически переводятся, когда программа в режиме совместимости обращается к файлу в известных системных папках.
Например, C:\Documents and Settings
переводится в C:\Users\<user>\Documents
при запуске в Windows 7 программы в режиме совместимости с XP.
Эта статья хорошо объясняет это.
http://arstechnica.com/information-technology/2010/01/windows-xp-mode/
Однако в Windows 7 Redmond предоставил решение проблемы: режим Windows XP. Режим Windows XP использует технологию виртуализации, позволяющую приложениям, запущенным на виртуализированной копии Windows XP, отображаться в меню «Пуск» Windows 7 и на рабочем столе Windows 7.