- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 429
- Реакции
- 10
Народ, кто плотно сидит на реверсе D3D9, подскажите по базе.
Столкнулся с классической проблемой при написании internal-софта. Пытаюсь хукнуть EndScene (индекс 42 в VMT), но при попытке вызвать оригинал все идет по п... в общем, не работает так, как задумывалось.
Вот текущий кусок кода, который отказывается заводиться:
Судя по всему, проблема в передаче контекста устройства или в конвенции вызова. В Direct3D 9 методы девайса — это __stdcall, и они ожидают указатель на this (сам IDirect3DDevice9) первым аргументом, если обращаться через указатель на функцию напрямую.
Пробовал курить доки, но везде либо под старые компиляторы, либо через готовые либы типа MinHook, а мне нужно понять саму логику проброса вызова оригинала именно в VMT-хуке без лишних костылей.
Технические детали:
Кто сталкивался с подобным при написании своих баз? Нужно ли явно прописывать STDMETHODCALLTYPE и передавать девайс в typedef, чтобы стек не улетал в стратосферу?
Отпишитесь, кто реально фиксил подобные мисс-колы в своих проектах.
Столкнулся с классической проблемой при написании internal-софта. Пытаюсь хукнуть EndScene (индекс 42 в VMT), но при попытке вызвать оригинал все идет по п... в общем, не работает так, как задумывалось.
Вот текущий кусок кода, который отказывается заводиться:
Код:
typedef HRESULT(* ENDSCENE)();
ENDSCENE pEndScene{ nullptr };
HRESULT hkEndScene() {
std::cout << "[Debug] EndScene hooked." << '\n';
return pEndScene();
}
// В инициализации:
pEndScene = (ENDSCENE)pDevice[42];
Судя по всему, проблема в передаче контекста устройства или в конвенции вызова. В Direct3D 9 методы девайса — это __stdcall, и они ожидают указатель на this (сам IDirect3DDevice9) первым аргументом, если обращаться через указатель на функцию напрямую.
Пробовал курить доки, но везде либо под старые компиляторы, либо через готовые либы типа MinHook, а мне нужно понять саму логику проброса вызова оригинала именно в VMT-хуке без лишних костылей.
Технические детали:
- Direct3D 9 API
- VMT Index: 42 (EndScene)
- Internal injection
- Стек вызовов крашится при обращении к pEndScene
Кто сталкивался с подобным при написании своих баз? Нужно ли явно прописывать STDMETHODCALLTYPE и передавать девайс в typedef, чтобы стек не улетал в стратосферу?
Отпишитесь, кто реально фиксил подобные мисс-колы в своих проектах.