Я нашёл решение и теперь у меня получилось успешно вызвать функцию - эффект от неё применился и никаких крашей!
Рассказываю и читающему, если ему вдруг тоже интересно
Как я и предполагал ранее, функция не читает ничего из стека. Передача параметров происходит исключительно через регистры. Для нас это значит следующее: не нужно никакой мороки с изучением и воспроизводством состояния стека. Просто забиваем требуемые параметры в регистры и делаем call.
Причины предыдущих неудач
Игра крашилась у меня не из-за того, что я что-то не так передавал, а из-за того, что вызываемая функция (SkipToTime, см.выше код) почему то:
- уничтожает значения регистров edi и esi
Terraria.Main::SkipToTime+3- push edi
Terraria.Main::SkipToTime+4- push esi
Terraria.Main::SkipToTime+5- sub esp,08
- сразу за этим безобразием без бэкапов обнуляет eax
Terraria.Main::SkipToTime+8- xor eax,eax
Ну и соответственно после отработки функции и возвращения в исходный код начинали твориться "чудеса" из-за сбоя состояния регистров.
Найденное решение:
- бэкап всех регистров общего назначения, а также edi и esi (понятное дело ebp и esp бэкапить не нужно)
push eax
push ebx
push ecx
push edx
push edi
push esi
- далее заполняем регистры необходимыми значениями (в моём случае это заполненные нулями ecx и edx)
xor ecx,ecx
xor edx,edx
- собственно сам вызов
call Terraria.Main::SkipToTime
- ну и восстанавливаем состояние регистров (естественно в обратном бэкапу порядке)
pop esi
pop edi
pop edx
pop ecx
pop ebx
pop eax
Всё.
В Террарии наступила ночь, часики перемотались на 7:30 вечера, игра не вылетела, я счастлив, мир прекрасен!