我需要移植内联汇编程序以便能够在x64上进行编译。
我正在尝试熟悉x64 Intrinsics等,但是我猜有人会很容易地帮助我。
void __stdcall Hook(P1, P2)
{
__asm pushad
static void* OriginalFunctionPointer =
GetProcAddress(GetModuleHandleA("Some.dll"), "[...]");
// [...]
__asm popad
__asm push (P2)
__asm push (P1)
__asm call (OriginalFunctionPointer)
}
最佳答案
似乎您需要一个类似this one的钩子库(如果需要C ++ API,则是this)以及一个函数原型,那么在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);
关于c++ - 将VC++内联汇编程序移植到x64(带有__stdcall Hook ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6504579/