Вопрос Как хукнуть D3D?

Тема в разделе "C, C++", создана пользователем monobogdan, 2 янв 2017.

Статус темы:
Закрыта.
  1. monobogdan

    monobogdan Известный пользователь

    Регистрация:
    26.12.16
    Сообщения:
    66
    Лайки:
    1
    Репутация:
    1
    Как хукнуть D3D? Я хочу нарисовать на сурфейсе кара кубмапу кубической текстуры.
    Не могли бы вы привести пример хука D3D на C++ для gtavc?
     
    #1
  2. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.618
    Лайки:
    1.572
    Репутация:
    421
  3. monobogdan

    monobogdan Известный пользователь

    Регистрация:
    26.12.16
    Сообщения:
    66
    Лайки:
    1
    Репутация:
    1
    А в общем как он реализуется? Подмена интерфейса девайса?
     
    #3
  4. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.618
    Лайки:
    1.572
    Репутация:
    421
    не обязательно. я в нужные мне функции просто встраиваюсь
     
    #4
  5. monobogdan

    monobogdan Известный пользователь

    Регистрация:
    26.12.16
    Сообщения:
    66
    Лайки:
    1
    Репутация:
    1
    Что насчет opengl? Там ещё проще должно быть.
     
    #5
  6. AWRage

    Проверенный

    Регистрация:
    10.07.15
    Сообщения:
    644
    Лайки:
    118
    Репутация:
    57
    Яйцами только не кидайтесь.
    tPresent                gPresent        = nullptr;
    tReset                    gReset            = nullptr;
    D3DPRESENT_PARAMETERS*    gPresentParams    = nullptr;
    
    HRESULT __stdcall hkdReset(IDirect3DDevice9 *d3dDev, D3DPRESENT_PARAMETERS *presentParams)
    {
        Log("-> hkdReset");
    
        gPresentParams = presentParams;
    
        HRESULT hRes = gReset(d3dDev, presentParams);
    
        Log("<- hkdReset");
    
        return hRes;
    }
    
    HRESULT __stdcall hkdPresent(IDirect3DDevice9 *d3dDev, CONST RECT *srcRect, CONST RECT *destRect, HWND destWindow, CONST RGNDATA *dirtyRegion)
    {
        Log("-> hkdPresent");
    
        HRESULT hRes = gPresent(d3dDev, srcRect, destRect, destWindow, dirtyRegion);
    
        Log("<- hkdPresent");
    
        return hRes;
    }
    
    DWORD FindDevice(DWORD dwLen)
    {
        DWORD dwObjBase = (DWORD)LoadLibraryA("d3d9.dll");
    
        if (dwObjBase == 0x0)
            return 0x0;
    
        while (dwObjBase++ < dwObjBase + dwLen)
        {
            if ((*(WORD*)(dwObjBase + 0x00)) == 0x06C7 && (*(WORD*)(dwObjBase + 0x06)) == 0x8689 && (*(WORD*)(dwObjBase + 0x0C)) == 0x8689)
            {
                dwObjBase += 2;
                break;
            }
        }
    
        return dwObjBase;
    };
    
    void initD3D9()
    {
        Log("-> Install D3D9-hook..");
    
        DWORD* VTable;
        *(DWORD*)&VTable = *(DWORD *)FindDevice(0x128000);
    
        DWORD VP16, VP17;
    
        VirtualProtect((LPVOID)&VTable[16], 4, PAGE_READWRITE, &VP16);
        VirtualProtect((LPVOID)&VTable[17], 4, PAGE_READWRITE, &VP17);
    
        gReset = (tReset)VTable[16];
        gPresent = (tPresent)VTable[17];
    
        VTable[16] = (DWORD)hkdReset;
        VTable[17] = (DWORD)hkdPresent;
    
        VirtualProtect((LPVOID)&VTable[16], 4, VP16, &VP16);
        VirtualProtect((LPVOID)&VTable[17], 4, VP17, &VP17);
    
        Log("<- Install D3D9-hook..");
    }
    
    void destD3D9()
    {
        Log("-> Remove D3D9-hook..");
    
        DWORD* VTable;
        *(DWORD*)&VTable = *(DWORD*)FindDevice(0x128000);
    
        DWORD VP16, VP17;
    
        VirtualProtect((LPVOID)&VTable[16], 4, PAGE_READWRITE, &VP16);
        VirtualProtect((LPVOID)&VTable[17], 4, PAGE_READWRITE, &VP17);
    
        VTable[16] = (DWORD)gReset;
        VTable[17] = (DWORD)gPresent;
    
        VirtualProtect((LPVOID)&VTable[16], 4, VP16, &VP16);
        VirtualProtect((LPVOID)&VTable[17], 4, VP17, &VP17);
    
        Log("<- Remove D3D9-hook..");
    }
    typedef HRESULT(__stdcall *tPresent)(IDirect3DDevice9 *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *);
    typedef HRESULT(__stdcall *tReset)(IDirect3DDevice9 *, D3DPRESENT_PARAMETERS *);
     
    #6
Статус темы:
Закрыта.