挂钩__thiscall而不使用__fastcall

假设您需要在x86 Windows上挂钩/绕行__thiscalltypes的函数,为了实现这一点,您需要将void *传递给shim函数。 是的,这在技术上是C ++的“可怕的滥用”,但这是函数挂钩,而不是编码便携式应用程序的练习。

例如,假设你需要挂钩一个这样的函数:

 void __thiscall SomeClass::MemberFunction(int b) { this->somevar = b; } 

显然众所周知,你可以创build一个__fastcall函数来使用一个额外的参数来处理EDX,但这有点…蹩脚。

所以问题是: 你能想到能够将非静态C ++类成员函数的types转换为void *variables的技巧?

我已经有了一些解决方案,所以我们来看看:

第一个可以说是最快的:

 __declspec(naked) __cdecl void* MemberFuncToPtr(...) { __asm { mov eax, [esp+4] retn } } void* ptr = MemberFuncToPtr(&MyClass::TheMemberFunction); 

而另一个没有ASM的选择,却需要一个没用的参数:

 void* MemberFuncToPtr(char i, ...) { va_list v; va_start(v,i); void* ret = va_arg(v, void*); va_end(v); return ret; } void* ptr = MemberFuncToPtr(0, &MyClass::TheMemberFunction);