Я пытаюсь создать thunk с C++ и Win32 API, который связывает этот указатель со статической функцией-членом, поэтому я могу использовать эту функцию в качестве обратного вызова.Как связать этот указатель со статической функцией-членом с помощью thunk в C++
Теперь у меня есть рабочий кусок для x64, он работает, установив значение регистра r9 (соответствует 4-му параметру функции) на адрес этого указателя.
Но у меня возникла проблема с thunk для x86, я попытался установить значение [esp + 10h] (также соответствует 4-му параметру).
Вот преобразователь:
#pragma pack(push, 1)
struct THUNK {
DWORD mov; // mov dword ptr[esp+10h], pThis
DWORD pThis;
BYTE jmp; // jmp relproc
DWORD relproc;
}
#pragma pack(pop)
А вот класс, который использует преобразователь,:
class foo {
void callback_impl(int a, int b, int c) {
...
}
static void __stdcall callback(int a, int b, int c, foo *This) {
This->callback_impl(a, b, c);
}
public:
THUNK *thunk;
foo() {
thunk = (THUNK*)VirtualAlloc(NULL, sizeof(THUNK), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
thunk->mov = 0x102444C7;
thunk->pThis = (DWORD)this;
thunk->jmp = 0xe9;
thunk->relproc = DWORD((INT_PTR)&foo::callback - ((INT_PTR)thunk + sizeof(THUNK)));
FlushInstructionCache(GetCurrentProcess(), this, sizeof(THUNK));
}
~foo() {
VirtualFree(thunk, sizeof(THUNK), MEM_DECOMMIT);
}
};
А вот пользователь обратного вызова:
void callback_user(void(__stdcall *callback)(int, int, int)) {
...
}
// foo f;
// callback_user((void(__stdcall*)(int, int, int))f.thunk);
Однако, когда я побежал программа, это дало мне провал:
Ошибка проверки времени выполнения # 0 - Значение ESP не было должным образом сохранено во время вызова функции. Обычно это результат вызова функции, объявленной с одним вызовом, с указателем функции, объявленным с другим соглашением о вызовах.
Как решить эту проблему?
Спасибо.
Пожалуйста, предоставьте [mcve]. – IInspectable