Теперь стало понятней. Получить вылет так и не получилось, пока что. Идею понял. Есть интересный способ осуществить твою идею. Не нужно постоянно переписывать вызов на string_constructor. Можно изменить сам string_constructor (такой хук часто используется для перехвата различных функций в готовых модулях, называется Jmp detour). Смысл его такой:
1) берем адрес string_constructor
2) Копируем такое количество байт от начала функции, чтобы туда поместился jmp address и эти байты не нарушали инструкции. Обычно это около 5-7 байт, но есть простой код на C для автоопределения его размера.
3) Скопированные байты переносим в любое свободное местов в сегменте кода (если статичный перехват делаем). За ними пишем Jmp На следующую инструкцию после скопированных байт.
4) на место этих байтов пишем Jmp на наш обработчик вызова функции string_constructor, где и проводим манипуляции с любыми параметрами функции string_constructor. Здесь можно добавить простую проверку на размер данных и корректировки их в случае чего.
5) В конце нашего обработчика ставим jmp на адрес содержищий скопированные байты + jmp
Таким образом мы подсовываем свою функцию, перед выполнением любого string_constructor. Сейчас пытаюсь отловить вылет. Без успехов.
Дело в том, что "string_constructor" на самом деле не одна единственная функция. Есть несколько функций, вызывающихся с теми же параметрами (длина в edi, сишная строка в eax, stl строка в esi), работающих схожим образом. В текущей версии trans.txt я отловил порядка десяти-двадцати проблемных строк, и адрес конструктора в них часто различается. Мое решение мне видится более простым.
Вообще во всем DF есть достаточно много разных методов инициализации строк, вплоть до копирования строки несколькими мувам (например пункты меню на титульном экране), в таких случаях мувы заменял на rep movsd.
По поводу свободного места - патч добавляет в экзешник новую секцию, первоначально туда перемещались только длинные строки, но сейчас там есть некоторое количество кода (типа инструкций установки длины строки).
Да, в патче уже есть анализатор длин инструкций, и даже прототип дизассемблера
Единственно, что все писано на малоизвестном в наших краях языке
Euphoria, в общем-то я ССЗБ, но на момент начала работы над русификацией это был наиболее близкий мне язык. С++ я практически не знаю, знаю Си, но изобретать с нуля нужные мне структуры данных меня как-то не радовало. Подумываю переписать на что-то более "конвенциональное" типа Object Pascal, но это скорее мечты