22.04.2020, 17:29
XEPOMAHT, таблицы нельзя переносить сами в себя, ты это знаешь. Иначе никакой код работать нормально не будет. Всегда в отдельную, непересекающуюся память.
RedirectMemoryBlock запоминает конкретную физическую область памяти с абсолютным начальным адресом и абсолютной длиной.
Пример: с адреса 6000 длиной 550 байт. Запомнили диапазон [6000..6549]. Это реальные старые адреса.
А новые, например, [100000..100549]. Их преобразование — элементарная задача двоичного поиска и замены.
Херомант, тут смешались в кучу кони, люди.
1) Код игры ты патчишь так, как нужно, чтобы он работал с новыми адресами структур.
2) Ты всегда можешь определить старый абсолютный адрес [под]структуры и новый. С ними и вызывай RedirectMemoryBlock.
2) Код lua/erm скриптов будет использовать UN:C и GetRealAddr. Если есть опасение, что подструктуры перенесены в разные области памяти, то GetRealAddr вызывается для каждой подструктуры. Сперва определяем новый адрес подструктуры, потом к нему прибавляем уже смещение. То, что в коде игры нас не интересует.
RedirectMemoryBlock запоминает конкретную физическую область памяти с абсолютным начальным адресом и абсолютной длиной.
Пример: с адреса 6000 длиной 550 байт. Запомнили диапазон [6000..6549]. Это реальные старые адреса.
А новые, например, [100000..100549]. Их преобразование — элементарная задача двоичного поиска и замены.
Херомант, тут смешались в кучу кони, люди.
1) Код игры ты патчишь так, как нужно, чтобы он работал с новыми адресами структур.
2) Ты всегда можешь определить старый абсолютный адрес [под]структуры и новый. С ними и вызывай RedirectMemoryBlock.
2) Код lua/erm скриптов будет использовать UN:C и GetRealAddr. Если есть опасение, что подструктуры перенесены в разные области памяти, то GetRealAddr вызывается для каждой подструктуры. Сперва определяем новый адрес подструктуры, потом к нему прибавляем уже смещение. То, что в коде игры нас не интересует.