Защита в Windows 95 от перезаписи системных библиотек
Заметка Реймонда Чена: Windows 95 defenses against installers that overwrite a file with an older version
Многие библиотеки Windows распространялись как redistributable-компоненты: программы включали их в свои инсталляторы и копировали в систему при установке. В правилах написания инсталляторов говорили о том, что сначала нужно проверить версию библиотеки, установленную в системе, и перезаписать её только если новый файл имеет более свежую версию. Если же в системе уже есть более новая библиотека, ничего делать не надо.
Рассчёт был на то, что все новые версии библиотек обратно совместимы со своими предыдущими копиями. Чего не учли, так это того, что разработчики инсталляторов плевать хотели на эти правила.
Было совершенно в порядке вещей ждать от инсталлятора, что он перезапишет библиотеку от Windows 95 версией из Windows 3.1 и порушит систему.
Проблему решили созданием резервной копии важных файлов в скрытую папку C:\Windows\SYSBCKUP. После того как инсталлятор завершал работу, система проверяла версии важных файлов. И если находила, что новый файл более свежий, чем сохранённый, копировала его в SYSBCKUP. Если же версия оказывалась ниже, то файл восстанавливался из бэкапа.
По сути, Windows 95 ждал завершения работы инсталлятора и затем проверял его работу, исправляя ошибки, которые тот мог наделать.
Первые версии этой фичи блокировали перезапись более новых файлов, но это создало ещё больше проблем. Некоторые инсталляторы сообщали, что не смогли обновить файл и отказывались работать. Другие показывали диалоговое сообщение и спрашивали пользователя, что делать дальше. (Как будто пользователь мог ответить на этот вопрос) Встречались инсталляторы, которые писали: “Так! Я не смог перезаписать файл, поэтому я перезагружаю систему и перезапишу его при старте. Попробуй меня остановить”.
Перенаправить запись в фиктивный файл тоже не сработало, так как некоторые инсталляторы проверяли целостность данных после установки, и если не находили изменений, которые они были должны внести, завершались с ошибкой.
Лучшим способом оказалось позволить инсталляторам перезаписать всё, что им надо, а затем подчистить за ними.
PS: Некоторые компоненты Windows специально выпускались в виде готовых инсталляторов, а не файлов-библиотек, как бы намекая, что их не нужно копировать напрямую: “используйте вот этот, специально подготовленный инсталлятор”. Да, это несколько ломает пользовательский опыт, но это вы, разработчики инсталляторов, доказали, что вам нельзя доверять в деле обновления библиотек. Это исключительно ваша вина!