Получение адресов функций из перехватчика DllMainC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Получение адресов функций из перехватчика DllMain

Сообщение Anonymous »

Создать объекты DirectX непосредственно из DllMain() не удается. Я попытался создать новый поток и создать там объекты, чтобы получить виртуальную таблицу/адреса функций DirectX, которые я собираюсь подключить.
Я использую 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.
Я получаю адреса функций 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);
Как обойти эту неразбериху и получить адреса из DLL?


Подробнее здесь: https://stackoverflow.com/questions/793 ... lmain-hook
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»