0

我需要移植內聯彙編程序才能在x64上編譯。 我試圖熟悉x64 Intrinsics等,但我想有人會很容易幫助我。將VC++內聯彙編程序移植到x64(__stdcall鉤子)

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

似乎需要一個鉤庫等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); 
+0

@Necrolis:我這樣做是爲__cdecl掛鉤,但據我所知,經驗豐富不起作用由於堆棧順序的__stdcall鉤子。 – zEh

+1

@zEh:除了你應該提到的事實之外,'__cdecl'鉤子需要更多的工作,因爲如果需要使用'va_list'手動轉發參數,並且你打算調用原始函數),如果沒有,它的完成方式與上面完全相同(因爲參數是固定的),您只需更改鉤子的調用conv和函數指針類型即可。 – Necrolis

+0

原函數是一個類的成員函數,是否會改變任何東西? – zEh