EndScene hook Вопросы - PullRequest
       37

EndScene hook Вопросы

1 голос
/ 19 апреля 2020

Так что недавно я хотел добавить интерфейс im gui в окно примера с использованием DirectX, поэтому я посмотрел на видео, что мне пришлось подключить функцию EndScene с помощью DirectX9sdk, чтобы иметь возможность добавить свой собственный интерфейс im gui.

Однако у меня есть несколько вопросов:

  1. Где я могу найти любую документацию для функций и типов DirectX9 (если есть, потому что я не понимаю, почему мы должны подключить функцию EndScene) или где я могу найти какую-либо статью, объясняющую более подробно, как работает DirectX?
  2. До сих пор я видел две версии перехватов EndScene, одна с функцией patternScanning, которая сканирует сигнатуру в dll shaderapi и другой, который создает DirectXDevice и затем обращается к vtable оттуда; Есть ли какие-либо источники в Интернете, или это то, что мы должны сделать сами? Вот версия, которая у меня есть:
while (!DirectXDevice) // loops until it finds the device
        DirectXDevice = **(DWORD**)(FindPattern("shaderapidx9.dll", "A1 ?? ?? ?? ?? 50 8B 08 FF 51 0C") + 0x1);

    void** pVTable = *reinterpret_cast<void***>(DirectXDevice); // getting the vtable array
    oEndScene = (f_EndScene)DetourFunction((PBYTE)pVTable[42], (PBYTE)Hooked_EndScene)//getting the 42th virtual function and detouring it to our own
Я не совсем понимаю, что __stdcall делает здесь, я знаю, что он используется для вызова функций WINAPI, но зачем здесь?
HRESULT __stdcall Hooked_EndScene(IDirect3DDevice9* pDevice){//some code}

Примечание: это функция, которую я подключаю к оригинальная сцена.

Большое спасибо, извините, если есть много вопросов, но я действительно не могу обернуться вокруг этого.

1 Ответ

1 голос
/ 19 апреля 2020

Как вы узнаете, какие функции вам нужно подключить?

Если говорить прямо, вы должны быть опытным программистом DirectX, чтобы это выяснить. Не ожидайте, что сможете подключиться к структуре, которую вы не понимаете. Так уж получилось, что EndScene всегда будет вызываться после всех других вызовов отрисовки на цели рендеринга.

Существует множество доступных ресурсов программирования D3D9, в режиме онлайн и в бумажном виде. Большинство из них не бесплатны. Боюсь, что это не тот ответ, на который вы надеялись.

Какое дело с сканированием по шаблону или созданием временного устройства D3D9?

Microsoft этого не сделала приложите любые явные усилия к тому, чтобы сделать EndScene подключаемым. Просто оказывается подключаемым , потому что каждая нормальная функция подключаема. Вам нужен способ найти функцию в памяти, потому что функция не всегда будет иметь один и тот же адрес.

Один из подходов состоит в поиске известных инструкций, которые появляются внутри функции. Кто-то должен быть первым, кто обнаружит шаблон, который вы можете сканировать. Вы далеко не первый человек, который перехватывает EndScene, поэтому многие из них ранее перепроектировали функцию и поделились шаблонами для поиска.

ПРИМЕЧАНИЕ. Шаблон не обязательно должен находиться непосредственно внутри целевой функции. Это может также привести вас сначала к чему-то другому, в вашем случае, к экземпляру ID3D9Device. Важно то, что вы можете каким-то образом найти путь к функции EndScene.

Другой подход - получить указатель на функцию. Если бы это была обычная функция C, это было бы легко. Здесь трудно, потому что OOP имеет тенденцию усложнять эти вещи - вам нужно пробиться через различные интерфейсы, чтобы получить правильный vtable.

Оба метода имеют свои преимущества и недостатки - создание устройства D3D9 безопаснее, но также более навязчивым, потому что целевой процесс может не ожидать, что кто-то просто случайным образом создаст новые устройства.

Зачем нужна функция подключения __stdcall?

Поскольку вы замените исходную функцию на вашу перехваченную версию, соглашение о вызове перехваченной функции должно быть таким же, как соглашение о вызове исходной функции. Вызывающая сторона EndScene ожидает (и была скомпилирована) соглашение __stdcall, поэтому новая функция также должна вести себя так же, иначе стек будет поврежден. Ваш акт замены функции не меняет способ вызова вызывающего абонента.

...