似乎需要一個鉤庫等this one(或this如果希望C++ API)與函數原沿,則不需要聯彙編,在32或64位模式。另外,當你在進行內聯彙編時,不需要那些pushad/popad。
typedef void (__stdcall*myfp)(int,int);
void __stdcall MyHook(int arg1, int arg2)
{
static myfp TheFP = (myfp)GetProcAddress(GetModuleHandleA("Some.dll"), "[...]");
//your extra code
TheFP(arg1,arg2);
}
當然,這個鉤子的注入需要發生在別的地方。 鉤住類,你需要考慮隱藏this
指針(pDevice
在這種情況下):
#define D3D8FUNC(name,...) typedef HRESULT (__stdcall * name)(__VA_ARGS__)
D3D8FUNC(D3D8SetTexture,void* pDevice, DWORD dwStage, void* pTexture);
HRESULT __stdcall D3DSetTexture(void* pDevice, DWORD dwStage, void* pTexture)
{
LOG("[D3DSetTexture][0x%p] Device: 0x%p Stage: %u Texture: 0x%p\n",_ReturnAddress(),pDevice,dwStage,pTexture);
return Direct3D::gpfD3D8SetTexture(pDevice,dwStage,pTexture);
}
//in the init
Direct3D::gpfD3D8SetTexture = System::VirtualFunctionHook<Direct3D::D3D8SetTexture>(Direct3D::gpDevice,61,D3DSetTexture);
@Necrolis:我這樣做是爲__cdecl掛鉤,但據我所知,經驗豐富不起作用由於堆棧順序的__stdcall鉤子。 – zEh
@zEh:除了你應該提到的事實之外,'__cdecl'鉤子需要更多的工作,因爲如果需要使用'va_list'手動轉發參數,並且你打算調用原始函數),如果沒有,它的完成方式與上面完全相同(因爲參數是固定的),您只需更改鉤子的調用conv和函數指針類型即可。 – Necrolis
原函數是一個類的成員函數,是否會改變任何東西? – zEh