Я декомпилирую очень старую игру, и моя цель - восстановить 100% нативный код.Таким образом, мне нужно было бы максимально сохранить существующую архитектуру (например, просто использование std::function
не очень полезно).
У меня есть коллекция статических функций с различнымиколичество параметров.Они хранятся в такой структуре:
struct ScriptFunction
{
const wchar_t* m_name;
void* m_func; // ptr to specific function
void* m_returnType;
int m_argCount;
};
И заполняются следующим образом:
ScriptFunction s_functions[206] = {
{L"AddMoveAroundDesire", &ScriptFunctions::AddMoveAroundDesire, &CScriptType::s_void, 2},
{L"AddDoNothingDesire", &ScriptFunctions::AddDoNothingDesire, &CScriptType::s_void, 2},
{L"AddAttackDesire", &ScriptFunctions::AddAttackDesire, &CScriptType::s_void, 3},
{L"AddAttackDesireEx", &ScriptFunctions::AddAttackDesireEx, &CScriptType::s_void, 4},
{L"AddGetItemDesire", &ScriptFunctions::AddGetItemDesire, &CScriptType::s_void, 2},
...
Итак, как мне вызвать ScriptFunction :: m_func с заданным m_argCount и void ** аргументы?Я должен как-то поместить параметры в стек и вызвать func-call, но понятия не имею.
Какой-то асм-код?va_list?Но как заполнить его во время выполнения?
UPD: Invoker выглядит следующим образом
void CScriptAccessible::InvokeInternal(ScriptFunction* scriptFunc, void** args)
{
// here I have to push params from **args** to stack
// and somehow call ScriptFunction::m_func
// In assembly I could see pushes to stack in a loop (driven by
// ScriptFunction::m_argCount). But I'm wondering, whether it's
// possible to do in C++ (push args on stack and call function by just address)
}