2011-06-29 212 views
1

我有这个挂钩函数可以在x86上正常工作。感谢Bo Persson。移植C++ __fastcall从x86挂钩到x64

void __fastcall Hook(Class* ThisInECX, int UnknownEDX, OtherClass* P1, void* P2, void* P3) 
{ 
    static void* OriginalFunctionPointer = GetProcAddress(GetModuleHandleA("Some.dll"), "[...]"); 
    static auto OriginalFunction = ((void(__fastcall*)(Class* ThisInECX, int UnknownEDX, OtherClass* P1, void* P2, void* P3))OriginalFunctionPointer); 

    OriginalFunction(ThisInECX, UnknownEDX, P1, P2, P3); 
} 

现在我试图将其移植到x64。我从几个片段中发现并理解的是: 我在前面有另一个变量“int UnknownRDX”,但没有它,至少在正确调用OriginalFunction时至少没有它。 我的实际变量(P1等)似乎被抵消了(或者我的问题是不同的)。 我其实需要知道这个声明是否正确,所以我可以在更糟糕的位置寻找问题。

void Hook(Class* This, int Unknown0, int Unknown1, OtherClass* P1, void* P2, void* P3) 
{ 
    static void* OriginalFunctionPointer = GetProcAddress(GetModuleHandleA("Some64.dll"), "[...]"); 
    static auto OriginalFunction = ((void(*)(Class* This, int Unknown0, int Unknown1, OtherClass* P1, void* P2, void* P3))OriginalFunctionPointer); 

    // Using P1 here is fine on x86 but not on x64 

    OriginalFunction(This, Unknown0, Unknown1, P1, P2, P3) 
} 
+0

请不要在标题中加任何标签。 Mkay,这将是伟大的,谢谢。 – 2011-06-29 13:09:07

+0

只是一个建议......在x86和x64中使用'size_t UnknownEDX'。 – Raiv

+0

可能是因为x64的签名是无效的(Class *,int64_t,OtherClass *,void *,void *)而不是void(Class *,int,int,OtherClass *,void *,void *)? – Tomek

回答

1

在x64上只有一个调用约定,所以你可以从签名中剔除它。可能出现的问题是您尝试从x64函数加载x86版本的过程。

编辑:哦,等一下,你之前发布了关于x86/x64挂钩的问题吧?我很有信心,这不是问题。

我想说的是,以前,您的代码依赖于调用约定特定的hack,但在x64上只有一个调用约定。

http://msdn.microsoft.com/en-us/library/ms235286.aspx

+0

这是我从中加载的x64库。 – zEh

+0

@zEh:检查我的编辑。 – Puppy

+0

有关调用约定的更多信息:http://msdn.microsoft.com/en-us/library/ms235286.aspx – ALOToverflow