Я следую этому руководству: DirectX 9.0 Hooking via Injection via C++. Таким образом, программа создает удаленный поток в процессе в качестве запуска, внедряет мой крючок, вызывает его DllMain и перехватывает функцию Direct3D9Create. Барабанный барабан используется для подключения Direct3DCreate9. Весь интерфейс Direct3D и интерфейс устройства завернуты. Когда игра вызывает Direct3D9Create, она должна вызывать мою подключенную функцию вместо оригинала. Это проблема, потому что игра никогда не вызывает функцию зацепления. Но когда я вызываю Direct3DCreate из dll, вызывается функция hooked. Это DLLMain:Обтекание интерфейсов dx9 и функции подключения
...
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, и все равно. Что мне не хватает?