Хук directx в GTA SA

Статус
В этой теме нельзя размещать новые ответы.

Jack_Savage

Участник
Автор темы
150
17
Может есть где то пример как отрендерить что то в игре ?
Используя IDirect3DDevice9
Нашел был такое:

Код:
typedef IDirect3DDevice9 *(*RwD3D9GetCurrentD3DDevicePtr)();

RwD3D9GetCurrentD3DDevicePtr fpRwD3D9GetCurrentD3DDevice = (RwD3D9GetCurrentD3DDevicePtr)0x007F9D90;

void InitRender() 
{
    IDirect3DDevice9 *pDevice = fpRwD3D9GetCurrentD3DDevice();

    if (pDevice)
    {
        pDevice->ShowCursor(1);
        Debug("Cursor");
    }
}
Но игра вылетает почему то.

Еще нашел такой способ:
Код:
typedef void (*Render2dStuffPtr)();

// Pointer to Render2dStuff function
Render2dStuffPtr fpRender2dStuff = (Render2dStuffPtr)0x0053E230;

// This function will be called by SA after hook is installed
void MyDrawFunction()
{
// first draw SA's 2d stuff
fpRender2dStuff();

// draw own stuff here using d3d device or SA functions
}

// This function should typically be called in DllMain
void SetupMyDrawFunctionHook()
{
DWORD oldProtect;
DWORD *workAddress = (DWORD *)0x0053EB13; // Pointer to the call to Render2dStuff

// change protection/permissions to allow modification to instructions
VirtualProtect(workAddress, 4, PAGE_READWRITE, &oldProtect);

// modify instruction with a pointer to our draw function
*workAddress = (DWORD)&MyDrawFunction - (DWORD)(workAddress + 1);

// restore original protection/permissions to allow code to be executed again
VirtualProtect(workAddress, 4, oldProtect, NULL);
}
Но тут нет даже IDirect3DDevice9.
Помогите пожалуйста
 

Jack_Savage

Участник
Автор темы
150
17

SR_team

like pancake
BH Team
4,804
6,475
Может есть где то пример как отрендерить что то в игре ?
Используя IDirect3DDevice9
Нашел был такое:

Код:
typedef IDirect3DDevice9 *(*RwD3D9GetCurrentD3DDevicePtr)();

RwD3D9GetCurrentD3DDevicePtr fpRwD3D9GetCurrentD3DDevice = (RwD3D9GetCurrentD3DDevicePtr)0x007F9D90;

void InitRender()
{
    IDirect3DDevice9 *pDevice = fpRwD3D9GetCurrentD3DDevice();

    if (pDevice)
    {
        pDevice->ShowCursor(1);
        Debug("Cursor");
    }
}
Но игра вылетает почему то.

Еще нашел такой способ:
Код:
typedef void (*Render2dStuffPtr)();

// Pointer to Render2dStuff function
Render2dStuffPtr fpRender2dStuff = (Render2dStuffPtr)0x0053E230;

// This function will be called by SA after hook is installed
void MyDrawFunction()
{
// first draw SA's 2d stuff
fpRender2dStuff();

// draw own stuff here using d3d device or SA functions
}

// This function should typically be called in DllMain
void SetupMyDrawFunctionHook()
{
DWORD oldProtect;
DWORD *workAddress = (DWORD *)0x0053EB13; // Pointer to the call to Render2dStuff

// change protection/permissions to allow modification to instructions
VirtualProtect(workAddress, 4, PAGE_READWRITE, &oldProtect);

// modify instruction with a pointer to our draw function
*workAddress = (DWORD)&MyDrawFunction - (DWORD)(workAddress + 1);

// restore original protection/permissions to allow code to be executed again
VirtualProtect(workAddress, 4, oldProtect, NULL);
}
Но тут нет даже IDirect3DDevice9.
Помогите пожалуйста
Смотри в исходники mod_s0beit_sa_asi
 

Jack_Savage

Участник
Автор темы
150
17
Код:
IDirect3DDevice9 *device = *(IDirect3DDevice9**)0xC97C28;


void STDMETHODCALLTYPE EndSceneCallback()
{
    device->EndScene();
    Debug("INTD");
}
void InitRender()
{
    void *new_vtable[115];
    void **v_table = *(void ***)device;
    // Copy v-table
    memcpy(new_vtable, v_table, sizeof(new_vtable));
    // Replace v-table pointer
    *(void **)device = new_vtable;
    new_vtable[42] = &EndSceneCallback;
    Debug("INT");
}
Нашел такое а оно почему то крашит игру :С

Код:
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib")

void Debug(char* text);
IDirect3DDevice9* GetD3DDevice;


void InitRender()
{
    while(1)
    {
        GetD3DDevice = *(IDirect3DDevice9 **)0xC97C28;
        D3DCOLOR rectColor = D3DCOLOR_XRGB(0, 255, 0);
        D3DRECT BarRect = { 0, 0, 5, 5 };
        GetD3DDevice->Clear(1, &BarRect, D3DCLEAR_TARGET | D3DCLEAR_TARGET, rectColor, 0, 0);
    }
}
Такой способ тоже не работает. Редко мерцает зеленый квадрат с такой скоростью что его и не видно.
 
Последнее редактирование модератором:

SR_team

like pancake
BH Team
4,804
6,475
Код:
IDirect3DDevice9 *device = *(IDirect3DDevice9**)0xC97C28;


void STDMETHODCALLTYPE EndSceneCallback()
{
    device->EndScene();
    Debug("INTD");
}
void InitRender()
{
    void *new_vtable[115];
    void **v_table = *(void ***)device;
    // Copy v-table
    memcpy(new_vtable, v_table, sizeof(new_vtable));
    // Replace v-table pointer
    *(void **)device = new_vtable;
    new_vtable[42] = &EndSceneCallback;
    Debug("INT");
}
Нашел такое а оно почему то крашит игру :С
потому что нельзя перезаписывать элементы существующей таблицы. Ты можешь скопировать данные в свою таблицу и заменить указатель в device
Код:
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib")

void Debug(char* text);
IDirect3DDevice9* GetD3DDevice;


void InitRender()
{
    while(1)
    {
        GetD3DDevice = *(IDirect3DDevice9 **)0xC97C28;
        D3DCOLOR rectColor = D3DCOLOR_XRGB(0, 255, 0);
        D3DRECT BarRect = { 0, 0, 5, 5 };
        GetD3DDevice->Clear(1, &BarRect, D3DCLEAR_TARGET | D3DCLEAR_TARGET, rectColor, 0, 0);
    }
}
Такой способ тоже не работает. Редко мерцает зеленый квадрат с такой скоростью что его и не видно.
А InitRender ты откуда вызываешь? Сдается мне, что это второй поток, использование которого в такой форме может привести к внезапному крашу в случайный момент времени
 

Jack_Savage

Участник
Автор темы
150
17
потому что нельзя перезаписывать элементы существующей таблицы. Ты можешь скопировать данные в свою таблицу и заменить указатель в device
А нет где то примера как это делать ?
А то в исходниках собейта как то не понятно сделано.

А InitRender ты откуда вызываешь? Сдается мне, что это второй поток, использование которого в такой форме может привести к внезапному крашу в случайный момент времени
Да это второй поток
 

Jack_Savage

Участник
Автор темы
150
17
Может у тебя просто знаний не хватает для понимания?
Ну так та оно да... По этому я и просил что если где то есть пример чтобы показали.
Я на C++ что то делаю пару дней.
А так делал все на C# и с памятью не работал.
 

SR_team

like pancake
BH Team
4,804
6,475
  • Нравится
Реакции: vasiliy130198

Jack_Savage

Участник
Автор темы
150
17
Ну вот... Оно же делает тоже самое что я
Код:
*(IDirect3DDevice9 **)0xC97C28 = new proxyIDirect3DDevice9(*(IDirect3DDevice9 **)0xC97C28);//Получает IDirect3DDevice9 и отправляет в proxyIDirect3DDevice9

IDirect3DDevice9        *origIDirect3DDevice9;//Сюда записывает дивайс

proxyIDirect3DDevice9 ( IDirect3DDevice9 *pOriginal );
proxyIDirect3DDevice9::proxyIDirect3DDevice9 ( IDirect3DDevice9 *pOriginal )
{
    //Log("proxyIDirect3DDevice9 constructor called. Original IDirect3DDevice9 interface address is 0x%p", pOriginal);
    origIDirect3DDevice9 = pOriginal;
    bD3DRenderInit = false;
}
Но тут работает а у меня нет

https://github.com/sr-tream/mod_s0beit_sa_asi
Вот тебе asi соб в котором нужный тебе хук ставится в main.cpp, функции DllMain и mainloop
Та это я нашел... А вот как впихнуть в свой мод. Я не знаю
 
Статус
В этой теме нельзя размещать новые ответы.