[Help] Present hook

they tryna be cray
Пользователь
Статус
Оффлайн
Регистрация
22 Ноя 2017
Сообщения
238
Реакции[?]
78
Поинты[?]
4K
Хуканул пресент(по видео уроку),вроде всё ворк, но есть большой дроп фпс + фризы. Как фиксить?\
C++:
typedef IDirect3D9* (__stdcall *DIRECT3DCREATE9)(unsigned int);
typedef long(__stdcall *PRESENT9)(IDirect3DDevice9* self, const RECT*, const RECT*, HWND, void*);

PRESENT9 g_D3D9_Present = 0;
BYTE g_codeFragment_p9[5] = {0, 0, 0, 0, 0};
BYTE g_jmp_p9[5] = {0, 0, 0, 0, 0};
DWORD g_savedProtection_p9 = 0;
DWORD present9 = 0;
D3DRECT rec = {10, 10, 120, 30};
ID3DXFont *m_font = 0;
RECT fontRect = {10, 15, 120, 120};
D3DCOLOR bkgColor = 0;
D3DCOLOR fontColor = 0;

void DrawIndicator(void* self)
{
    IDirect3DDevice9* dev = (IDirect3DDevice9*)self;
    dev->BeginScene();
    D3DXCreateFont(dev, 12, 0, FW_BOLD, 0, 0, 1, 0, 0, 0 | FF_DONTCARE, TEXT("Arial"), &m_font);
    bkgColor = D3DCOLOR_XRGB(255, 255, 255);
    fontColor = D3DCOLOR_XRGB(0, 0, 0);
    dev->Clear(1, &rec, D3DCLEAR_TARGET, bkgColor, 1.0f, 0);
    m_font->DrawText(0, "Text", -1, &fontRect, 0, fontColor);
    dev->EndScene();
}

void GetDevice9Methods()
{
    HWND hWnd = CreateWindowA("STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0);
    HMODULE hD3D9 = LoadLibrary("d3d9");
    DIRECT3DCREATE9 Direct3DCreate9 = (DIRECT3DCREATE9)GetProcAddress(hD3D9, "Direct3DCreate9");
    IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION);
    D3DDISPLAYMODE d3ddm;
    d3d->GetAdapterDisplayMode(0, &d3ddm);
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = 1;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = d3ddm.Format;
    IDirect3DDevice9* d3dDevice = 0;
    d3d->CreateDevice(0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3dDevice);
    DWORD* vtablePtr = (DWORD*)(*((DWORD*)d3dDevice));
    present9 = vtablePtr[17] - (DWORD)hD3D9;
    d3dDevice->Release();
    d3d->Release();
    FreeLibrary(hD3D9);
    CloseHandle(hWnd);
}

long __stdcall HookedPresent9(IDirect3DDevice9* self, const RECT* src, const RECT* dest, HWND hWnd, void* unused)
{
    BYTE* codeDest = (BYTE*)g_D3D9_Present;
    codeDest[0] = g_codeFragment_p9[0];
    *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_codeFragment_p9 + 1));
    DrawIndicator(self);
    DWORD res = g_D3D9_Present(self, src, dest, hWnd, unused);
    codeDest[0] = g_jmp_p9[0];
    *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_jmp_p9 + 1));
    return res;
}

void HookDevice9Methods()
{
    HMODULE hD3D9 = GetModuleHandle("d3d9.dll");
    g_D3D9_Present = (PRESENT9)((DWORD)hD3D9 + present9);
    g_jmp_p9[0] = 0xE9;
    DWORD addr = (DWORD)HookedPresent9 - (DWORD)g_D3D9_Present - 5;
    memcpy(g_jmp_p9 + 1, &addr, sizeof(DWORD));
    memcpy(g_codeFragment_p9, g_D3D9_Present, 5);
    VirtualProtect(g_D3D9_Present, 8, PAGE_EXECUTE_READWRITE, &g_savedProtection_p9);
    memcpy(g_D3D9_Present, g_jmp_p9, 5);
}

DWORD __stdcall TF(void* lpParam)
{
    GetDevice9Methods();
    HookDevice9Methods();
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        CreateThread(0, 0, &TF, 0, 0, 0);
    }
    }
    return TRUE;
}
Игра half life 2
 
Последнее редактирование:
Я лучше тебя
Участник
Статус
Оффлайн
Регистрация
31 Июл 2017
Сообщения
383
Реакции[?]
448
Поинты[?]
1K
во первых, вместе с пресентом или ендсценой, там где ты работаешь с шрифтами и иногда текстурками, обязательно следует хукать и Reset (16 индекс) и в нем как раз проворачивать всякие дела, вроде обновления шрифта при сворачивании/разворачивании окна игры и тп, да и не понимаю как ты такой говно код юзаешь и где отрыл, в гугле по запросу "С++ d3d9 interface hook" ответ в первой же ссылке лучше всего того что ты тут описал.
 
they tryna be cray
Пользователь
Статус
Оффлайн
Регистрация
22 Ноя 2017
Сообщения
238
Реакции[?]
78
Поинты[?]
4K
во первых, вместе с пресентом или ендсценой, там где ты работаешь с шрифтами и иногда текстурками, обязательно следует хукать и Reset (16 индекс) и в нем как раз проворачивать всякие дела, вроде обновления шрифта при сворачивании/разворачивании окна игры и тп, да и не понимаю как ты такой говно код юзаешь и где отрыл, в гугле по запросу "С++ d3d9 interface hook" ответ в первой же ссылке лучше всего того что ты тут описал.
Тема уже старая, сам понимаю что код говно. А смотрел уроки
Пожалуйста, авторизуйтесь для просмотра ссылки.
а(на ютубе)
 
Сверху Снизу