Портирование встроенного ассемблера VC ++ в x64 (из хука __stdcall) - PullRequest
0 голосов
/ 28 июня 2011

Мне нужно портировать встроенный ассемблер, чтобы иметь возможность компилировать на 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)
}

1 Ответ

1 голос
/ 28 июня 2011

кажется, что вам нужна подключаемая библиотека, такая как this (или this , если вы хотите API C ++) вместе с функцией 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);
...