Прогресс в работе над
ХД 3.0 можно смотреть здесь:
http://sites.google.com/site/heroes3hd/rus/changelog
Некоторая техническая информация:
HiRez.dll внедряется в экзешник новым способом. В екзе меняется всего 5 байт по адресу 0x25c6dc: "Mss32" на "HiRez"
То есть HiRez.dll притворяется
библиотекой Mss32.dll.
Загрузившись, HiRez.dll может патчить екзе, еще до того как выполнение перейдет к entry point, поэтому обладает приоритетом "before era" ("before before wog"), однако как и раньше вносит практически все изменения after after wog (когда выполнение переходит к WinMain)
HiRez.dll определяет что за процесс ее грузит, и если это не герои хд 3, то она патчить ничего не будет. В перспективе ХД будет экспортировать ряд инфо-функций (понятно - разрешение, и еще чего-нибудь там)...
В ХД 3 будет добавлена запись крэшлога. Кроме стандартной инфы об исключении и контексте, будет писАться специфическая инфа по выполнению хд-кода, версия винды, версия ос режима совместимости.
Что сильно облегчит мне жизнь и скорость исправления багов.
Сейчас бьюсь над новой системой опций. Поскольку теперь ХД будет разделен на несколько модулей, то все "внешние" опции теперь не смогут храниться в одном файле (вообще можно конечно сделать и в 1ом, но не нужно). Возникает проблема управления опциями простым пользователем игры. Хочу сделать следующее: каждый модуль (по сути крупный плагин с опциями, который потенциально сможет работать и с эрой без хд) будет экспортировать единообразный интерфейс своих опций для утилиты Heroes3HDSetup.exe. Таким образом все опции будут как и раньше в одном месте, причем с графическим интерфейсом (таблица по типу таблицы свойств диалогового окна в визуальных редакторах).
В делении ХД на модули я сильно усердствовать не буду. То есть модулей будет не много.
Однако новая платформа ХД, новый подход к кодингу ХД позволяет довольно легко выделить какую-либо мелочь в отдельный плагин, независящий от хд и не конфликтующий с ним, чего не было раньше.
Суть нового подхода в хуках, которые смотрят актуальный на момент патча код ехе, с учетом внесения изменений предыдущими хуками. В ХД 3 реализован дизассемблерный движок (дизасм длин опкодов + детект ряда нужных опкодов). Что позволяет активно использовать сплайсинг и сабклассинг. А сабклассинг и дает нам дружбу между модулями, когда независимые изменения одной и той же функции мирно дополняют друг-друга. Все изменения в коде я стараюсь делать посредством именно сабклассинга (либо сплайсинг, либо call поверх call); низкоуровневых хуков (типа мост, с правкой регистров) – в игре минимум. И их количество я постоянно стараюсь уменьшать.
Правда бин-патч остается основным инструмнтом непосредственно смены разрешений, но не смотря на объем бин-патча в хд, он все же преимущественно не меняет логику в коде. Короче навык “потенциальная совместимость” в ХД 3 уже не хило прокачан и будет совершенствоваться дальше.