Получение адресов функции от крючка dllmainC++

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

Сообщение Anonymous »

Создание объектов DirectX непосредственно из dllmain () не удается. Я попытался запустить новый поток, создать там объекты, и они получают vtable/адреса функций, которые я собираюсь зацепить. DetourtransActionCommit () не может быть вызван из другого потока, чем dllmain поток. /p>

Код: Выделить всё

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;
}
< /code>
Но, делая это, он застрял, когда он пытается вызвать любую функцию DirectX. < /p>
Я получаю адреса функции 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();
}
}
}

// ...
}
< /code>
Я проверил сбор адреса с другого процесса, и мои крючки работали правильно: < /p>
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++»