Я использую Microsoft Detours, но DetourTransactionCommit () не может быть вызван из другого потока, кроме потока DllMain().
Я также пробовал дождаться, пока поток завершит сбор адресов, вот так :
Код: Выделить всё
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
{
std::thread(InitializeHooks).detach();
while (!_done)
{
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
// ...
break;
}
}
return TRUE;
}
Я получаю адреса функций DirectX следующим образом:< /p>
Код: Выделить всё
void InitializeHooks()
{
if (HMODULE d3d9Module = GetModuleHandle("d3d9.dll"))
{
typedef IDirect3D9* (WINAPI* Direct3DCreate9Func)(UINT SDKVersion);
Direct3DCreate9Func d3d9Create = (Direct3DCreate9Func)GetProcAddress(d3d9Module, "Direct3DCreate9");
if (d3d9Create)
{
IDirect3D9* d3d9 = d3d9Create(D3D_SDK_VERSION);
if (d3d9)
{
D3DPRESENT_PARAMETERS d3dpp = {};
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = GetDesktopWindow();
IDirect3DDevice9* device = nullptr;
if (SUCCEEDED(d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
GetDesktopWindow(),
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,
&device)))
{
void* deviceVTable = *(void**)device;
HookVirtualMethod(
(PVOID*)&originalD3D9Present,
(PVOID)HookedD3D9Present,
deviceVTable,
17
);
device->Release();
}
d3d9->Release();
}
}
}
// ...
}
Код: Выделить всё
void HookVirtualMethod(PVOID* ppOriginal, PVOID pDetour)
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(ppOriginal, pDetour);
r = DetourTransactionCommit();
}
// ...
originalD3D9Present = reinterpret_cast(0x00007ffd891c8c90);
originalD3D11Draw = reinterpret_cast(0x00007ffdbd7cd0b0);
originalD3D11DrawIndexed = reinterpret_cast(0x00007ffdbd7cdc30);
originalDXGIPresent = reinterpret_cast(0x00007ffdbe2e18c0);
HookVirtualMethod((PVOID*)&originalD3D9Present, (PVOID)HookedD3D9Present);
HookVirtualMethod((PVOID*)&originalD3D11Draw, (PVOID)HookedD3D11Draw);
HookVirtualMethod((PVOID*)&originalD3D11DrawIndexed, (PVOID)HookedD3D11DrawIndexed);
HookVirtualMethod((PVOID*)&originalDXGIPresent, (PVOID)HookedDXGIPresent);
Подробнее здесь: https://stackoverflow.com/questions/793 ... lmain-hook
Мобильная версия