Обтекание интерфейсов dx9 и функций перехвата

Я следовал этому уроку:DirectX 9.0 Подключение через инъекцию через C ++ . Итак, программа создает удаленный поток в процессе при запуске, вводит мой хук, вызывает его DllMain и перехватывает функцию Direct3D9Create. Батут Detour используется для подключения Direct3DCreate9. Весь интерфейс Direct3D и интерфейс устройства обернуты. Когда игра вызывает Direct3D9Create, она должна вызывать мою подключенную функцию вместо оригинальной. Это проблема, потому что игра никогда не вызывает подключенную функцию. Но когда я вызываю Direct3DCreate из dll, вызывается подключенная функция. Это DllMain:

...
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
HookHandle = hModule;
HookAPI();
lpReserved;
//LPDIRECT3D9 pD3d9 = Direct3DCreate9(D3D_SDK_VERSION);//if I uncomment this line, hooked function is called
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
UnhookAPI();
lpReserved;
OutputDebugString(pszMessage);
}
return TRUE;
}
...

Это реализация конструктора оболочки:

Direct3D9Wrapper::Direct3D9Wrapper(LPDIRECT3D9 pDirect3D)
{
IDirect3DDevice9 * device = (IDirect3DDevice9 *)this;
Direct3D9 = pDirect3D;
}

Dll вводится во время выполнения игр, поэтому Direct3DCreate не может быть вызван после завершения DllMain. Я попытался вызвать функцию CreateDevice из dll вручную, и она также перенаправлена ​​правильно, но сама игра никогда не делает вызов. Как можно было даже запустить игру, не перенаправляя вызов функции CreateDevice на мою dll? Я перепробовал несколько игр на dx9, и это все то же самое. Что мне не хватает?

0

Решение

Я полагаю, вы пытаетесь сделать снимок экрана для своей игры.
Если вы хотите сделать стабильный код (не только для учебы), пожалуйста, используйте Direct3DHook вместо того, чтобы иметь дело с перехватом API.

РЕДАКТИРОВАТЬ:

Для большего контроля использования EasyHook. Direct3DHook использует EasyHook за кулисами, если только вы не играете с API Hooking …

1

Другие решения

Некоторые догадки.

  • вы не имеете дело с перехватом вариантов GetProcAddress () и LoadLibrary ()
  • вы просто не выполняете итерации модулей, которые загружаются, когда вы загружаетесь, и не подключаете их.
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector