Подскажите как перхватить функцию QAbstractListModel::qt_metacall. я пробую так: Код (Text): int (__thiscall *Real_metacall)(QMetaObject::Call call, int id, void **arguments) = &QAbstractListModel::qt_metacall; int mine_metacall(QMetaObject::Call call, int id, void **arguments) { _PrintEnter("metacall(%d))\n", call); } ATTACH(&(PVOID&)Real_metacall, Mine_metacall); получаю ошибку: Ошибка 2 error C2440: =: невозможно преобразовать 'int (__thiscall QAbstractListModel::* )(QMetaObject::Call,int,void **)' в 'int (__thiscall *)(QMetaObject::Call,int,void **)' d:\Detours\APIHookingComplete\DetourByAddr\DetourByAddr.cpp 173 DetourByAddr то есть когда ручками, вроде как можно сделать Код (Text): Mine_metacall( QAbstractListModel *pThis, QMetaObject::Call p1, int p2, void ** p3) { } __declspec(naked) POKERHOOKER_API int __stdcall qt_metacall_hook( enum Call, int, void ** ) { __asm { pop eax push ecx push eax jmp Mine_metacall } } а как делать с microsoft detours?
O, вопрос получается сводится к тому как использовать microsoft research detours для перехвата функций с соглашением __thiscall?
Получилось так: Код (Text): class CAbstractListModel:public QAbstractListModel { public: int Mine_metacall(QMetaObject::Call call, int id, void **arguments); static int (CAbstractListModel::* Real_metacall)(QMetaObject::Call call, int id, void **arguments); }; int CAbstractListModel::Mine_metacall(QMetaObject::Call call, int id, void **arguments) { _PrintEnter("CAbstractListModel::Mine_metacall"); return (this->*Real_metacall)(call, id, arguments); } int (CAbstractListModel::* CAbstractListModel::Real_metacall)(QMetaObject::Call call, int id, void **arguments) = (int (CAbstractListModel::*)(QMetaObject::Call call, int id, void **arguments))&QAbstractListModel::qt_metacall; DetourAttach(&(PVOID&)CAbstractListModel::Real_metacall, (PVOID)(&(PVOID&)CAbstractListModel::Mine_metacall)); компилируется и работает, но не перехватывает. в чем может быть дело?
попробовал вариант Код (Text): int ( _cdecl *Real_metacall)(QAbstractListModel *pthis,QMetaObject::Call call, int id, void **arguments) = (int (_cdecl *)(QAbstractListModel *pthis,QMetaObject::Call call, int id, void **arguments))DetourFindFunction("C:\\Program Files\\Full Tilt Poker\\QtCore4.dll", "?qt_metacall@QAbstractListModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z"); он работает и Код (Text): int Mine_metacall(QAbstractListModel *pthis,QMetaObject::Call call, int id, void **arguments) { Syelog(SYELOG_SEVERITY_NOTICE,"CAbstractListModel::Mine_metacall"); return Real_metacall(pthis,call, id, arguments); } этот код печатает строку при вызове функции и все идет неплохо, но когда пробуем использовать аргумент функции, например Код (Text): int Mine_metacall(QAbstractListModel *pthis,QMetaObject::Call call, int id, void **arguments) { Syelog(SYELOG_SEVERITY_NOTICE,"CAbstractListModel::Mine_metacall %d",id); return Real_metacall(pthis,call, id, arguments); } все дохнет