Как работает режим совместимости в Windows?
Как работает режим совместимости в Windows?
Ответы:
Режим совместимости достигается с помощью так называемых прокладок. На TechNet есть хорошая статья, описывающая, как они работают.
Файлы приложений Windows содержат таблицу импорта, которая сообщает загрузчику приложения, какие DLL нужны приложению и какие функции оно использует из них. Процесс может, например, ссылаться GetVersionEx
на kernel32.dll
. Когда программа будет работать в режиме совместимости, то прокладка ставится между приложением и регулировочным заменяет GetVersionEx
функцию, так что приложение не вызывает GetVersionEx
из kernel32.dll
но GetVersionEx
в регулировочной шайбе. Затем функции Shimmed реализуют поведение предыдущих версий Windows. GetVersionEx
Это простой пример, каждая версия Windows возвращает свои собственные номера версий GetVersionEx
, поэтому при подделке старой WindowsGetVersionEx
теперь функция возвращает не номера версий Windows 7, а, например, номера версий Windows XP. Таким образом, приложение будет считать, что оно работает на Windows XP.
Также были некоторые другие изменения от версии Windows до версии Windows. Например, в более старых версиях, если программа загружала DLL, путь поиска для DLL также включал текущий каталог. Это проблема безопасности, поэтому более новые версии Windows по умолчанию не выполняют поиск в текущем каталоге. С помощью соответствующей прокладки вы можете смоделировать старое поведение.
Поскольку прокладки - это всего лишь слой между приложением и Windows API, оболочка может делать то же, что и приложение. Шим не может использоваться, например, для обхода UAC или доступа к защищенным файлам.
Если вы хотите узнать больше, вот несколько ссылок, которые могут вас заинтересовать:
Особенно стоит обратить внимание на 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.