2014-02-07 42 views
0

假設您需要在x86 Windows上掛鉤/繞過__thiscall類型的函數,並且爲此,您需要將void *傳遞給shim函數。是的,這在技術上是C++的「可怕的濫用」,但這是函數掛鉤,而不是編碼便攜式應用程序的練習。不使用__fastcall掛鉤__thiscall

例如,假設您需要連接的功能,如本:

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

顯然,這是衆所周知的,你可以只創建一個使用一個額外的ARG處置EDX的__fastcall功能,但是這是一個有點...跛腳。

所以問題是:你能想到能夠將非靜態C++類成員函數的類型轉換爲void *變量的技巧嗎?

回答

2

我有一對夫婦的解決方案已經爲這一點,所以在這裏我們去:

第一無疑是最快的:

__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);