将VC ++内联汇编程序移植到x64(__stdcall挂钩)

时间:2011-06-28 09:47:16

标签: c++ visual-studio visual-studio-2010 visual-c++ inline-assembly

我需要移植内联汇编程序才能在x64上编译。 我正在尝试熟悉x64内在函数等,但我想有人可以轻松帮助我。

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)
}

1 个答案:

答案 0 :(得分:1)

似乎你需要一个像this one(或this,如果你想要一个C ++ API)和一个函数proto的挂钩库,那么在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);