Портирование C ++ __fastcall Hook с x86 на x64 - PullRequest
1 голос
/ 29 июня 2011

У меня есть эта функция ловушки, которая отлично работает на x86.Спасибо Бо Перссону.

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

1 Ответ

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

Существует только одно соглашение о вызовах на x64, так что вы можете исключить это из подписи.Вероятно, что происходит неправильно, вы пытаетесь загрузить версию процедуры для x86 из функции x64.

Редактировать: Ой, подождите, вы уже публиковали этот вопрос о подключении x86 / x64, верно?Я вполне уверен, что проблема не в этом.

Я бы сказал, что раньше ваш код зависел от хаков, связанных с соглашением о вызовах, но в x64 существует только одно соглашение о вызовах.*http://msdn.microsoft.com/en-us/library/ms235286.aspx

...