Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос D3D9 Hooking — Как правильно вызвать оригинальный EndScene?

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
429
Реакции
10
Народ, кто плотно сидит на реверсе D3D9, подскажите по базе.

Столкнулся с классической проблемой при написании internal-софта. Пытаюсь хукнуть EndScene (индекс 42 в VMT), но при попытке вызвать оригинал все идет по п... в общем, не работает так, как задумывалось.

Вот текущий кусок кода, который отказывается заводиться:
Код:
Expand Collapse Copy
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-хуке без лишних костылей.

Технические детали:
  1. Direct3D 9 API
  2. VMT Index: 42 (EndScene)
  3. Internal injection
  4. Стек вызовов крашится при обращении к pEndScene

Кто сталкивался с подобным при написании своих баз? Нужно ли явно прописывать STDMETHODCALLTYPE и передавать девайс в typedef, чтобы стек не улетал в стратосферу?

Отпишитесь, кто реально фиксил подобные мисс-колы в своих проектах.
 
Назад
Сверху Снизу