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

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

  1. monobogdan

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

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

    SR_team BH Team
    BH Team

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

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

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

    SR_team BH Team
    BH Team

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

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

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

    Проверенный

    Регистрация:
    10.07.15
    Сообщения:
    642
    Лайки:
    119
    Репутация:
    54
    Яйцами только не кидайтесь.
    Код (C++):
    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..");
    }
    Код (C++):
    typedef HRESULT(__stdcall *tPresent)(IDirect3DDevice9 *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *);
    typedef HRESULT(__stdcall *tReset)(IDirect3DDevice9 *, D3DPRESENT_PARAMETERS *);
     
    #6