Надо пихнуть вызов метода класса в asm. Для этого надо привести метод к void*.
Если использовать обычную C функцию, то все достаточно просто - (void)func, но с методами класса чета все не так просто.
Код:
template<class C, class ...Args>
bool hookMethod(int id, C *object, void(__attribute__((__thiscall__)) C::*method)(Args...)){
if (!isIdValid(id))
return false;
CShortAsm *_asm = new CShortAsm();
_asm->push(r86::ECX);
_asm->mov(r86::ECX, (const int)object);
_asm->jmp((void*)method);
hookMethod(id, _asm->getAddr());
return true;
}
_asm->jmp((void*)method);
Ранее писал подобный код для коллбеков, и там все работает. Тут вроде ничем не отличается, а не работает. Не понимаю, что делаю не так.
Вызываются тоже одинаково:
g_class.DirectX->connect(this, &TestAntiInject::Present, proxyIDirect3DDevice9_Present);
testHook->hookMethod(25, this, &TestAntiInject::_RPC25);