Видеоблогер MattKC, по его собственным словам, перенес «тысячи программ» на Windows 95, с помощью портирования в систему важной функции Windows 98 — .NET Framework. Главное ограничение Windows 95 по сравнению с Windows 98 заключается как раз в отсутствии .NET Framework — в большинстве других аспектов Windows 98 очень близка к своему предшественнику по дизайну и функциям.
В видео продолжительностью 51 минуту MattKC, в частности, выясняет, как заставить .NET Framework работать правильно в Windows 95. Отсутствующих файлов DLL много, но использование инструмента создания дампа позволяет идентифицировать имена отсутствующих файлов, чтобы их можно было заменить или проигнорировать. Даже после переноса всех отсутствующих файлов .NET все еще не работает. В Windows 95 потребовалось больше ключей реестра, чем в этом видео — общее количество необходимых ключей составило 5409.
Даже после переноса .NET не может правильно отладить JIT (Just In Time) в Windows 95. Похоже, что причиной является ndphlpr, загадочный устаревший драйвер Windows, который не используется в Windows 98, но необходим для корректной работы, поскольку .NET аварийно завершает работу без него. MattKC определяет, что обман ПК о наличии ndphlpr срабатывает, но после того, как его исследование показывает, что никто не знает, что это за файл.
Это, в свою очередь, вызывает ошибку исключения машинного кода. Инструмент WinDebug не поддерживает .NET изначально (поскольку он еще не существует), поэтому MattKC все еще приходится иметь дело с некоторыми проблемами совместимости при параллельном тестировании Windows 95 и 98. Обе системы были запущены на WinDebug в течение нескольких дней, чтобы найти проблему.
В конце концов MattKC нашел закрытый блок кода, который WinDebug не мог прочитать. После расшифровки код оказался следующим:
F2 0F 10 10 44 24 24 08 F2 05 2C CO
Этот ошибочный код касался отсутствия API Windows для некоторых функций. Исключением было то, что он не мог найти «NotifyWinEvent в user32.dll», а SSE2 обфускала инструкцию в коде. Пришлось пропатчить .NET, чтобы устранить зависимость от SSE2, но это не исправило совместимость, а только сам дебаггер .NET.
После значительной отладки Lego Island, MattKC в конце концов вручную написал код метода для исключения/сообщения об ошибке для печати в окне, а не там, где он его не видит. Это работает и позволяет исправить последнюю часть совместимости DLL. После этого Rebuilder для Lego Island и специальная, более модернизированная программа для создания скриншотов теперь отлично работали в Windows 95.
Источник: Tom`s Hardware