Показать сообщение отдельно
Старый 26.07.2019, 12:23   #3
Новичок
 
Регистрация: 25.08.2016
Сообщений: 21
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
wongerlt пока неопределено
По умолчанию

Цитата:
Сообщение от ScythLab Посмотреть сообщение
Перехватывай эту функцию и смотри, что в нее передается.
Либо используй перехват функций DirectX (Direct3DCreate9), в интернете есть примеры, как с помощью DirectX рисовать что-либо в окне La2
finally i do it
http://prntscr.com/ok1yqe

Код:
void DrawTextX(int x, int y, const char *text,LPDIRECT3DDEVICE9 pDevice) {
    RECT rct = {x,y,0,0};
    LPD3DXFONT pFont = NULL;
 
    D3DXCreateFont(pDevice, 32, 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET, OUT_TT_ONLY_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Arial"), &pFont);
    if (pFont) {
        pFont->DrawText( NULL, text, -1, &rct, DT_CALCRECT, 0 );
        pFont->DrawText( NULL, text, -1, &rct, DT_LEFT, D3DCOLOR_XRGB(0,255,0) );
        pFont->Release();
    }
 
}

HRESULT APIENTRY myEndScene( LPDIRECT3DDEVICE9 pDevice )
{
    while(!pDevice) {pDevice = pDevice;}   
    
    DrawTextX(100,100,"coderx.ru",pDevice);
    
    return pEndScene( pDevice );
}

PBYTE HookVTable( PDWORD* dwVTable, PBYTE dwHook, INT Index )
{
    DWORD dwOld = 0;
    VirtualProtect((void*)((*dwVTable) + (Index*4) ), 4, PAGE_EXECUTE_READWRITE, &dwOld);
    PBYTE pOrig = ((PBYTE)(*dwVTable)[Index]);
    (*dwVTable)[Index] = (DWORD)dwHook;
    VirtualProtect((void*)((*dwVTable) + (Index*4)), 4, dwOld, &dwOld);
 
    return pOrig;
}
LRESULT CALLBACK MsgProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM  lParam){return DefWindowProc(hwnd, uMsg, wParam, lParam);}
void DX_Init(DWORD* table)
{
    WNDCLASSEXA wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandleA(NULL),NULL,NULL,NULL,NULL,"DX",NULL};
    RegisterClassExA(&wc);
    HWND hWnd = CreateWindowA("DX",NULL,WS_OVERLAPPEDWINDOW,100,100,300,300,GetDesktopWindow(),NULL,wc.hInstance,NULL);
    LPDIRECT3D9 pD3D = Direct3DCreate9( D3D_SDK_VERSION );
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    LPDIRECT3DDEVICE9 pd3dDevice;
    pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&pd3dDevice);
    DWORD* pVTable = (DWORD*)pd3dDevice;
    pVTable = (DWORD*)pVTable[0];
 
    table[0]   = pVTable[42];                    
    
 
    DestroyWindow(hWnd);
}
DWORD WINAPI VMT_Patching( LPVOID  Param )
{
    while(1)
    {
    Sleep(100);
    HookVTable((PDWORD*)nm_pD3Ddev, (PBYTE)myEndScene,42);         
    }
    return 1;
}
void D3D9_Interface_Hook()
{
    if(hooked==false) 
    {
        DWORD VTable[3] = {0};
        while(GetModuleHandleA("d3d9.dll")==NULL) 
        {
            Sleep(250);
        }
        DX_Init(VTable);
        pEndScene = (oEndScene)DetourFunction((PBYTE)VTable[0],(PBYTE)myEndScene);     
        while(!nm_pD3Ddev) 
        {
            Sleep(50); 
        }
        pEndScene = (oEndScene)DetourFunction((PBYTE)VTable[0],(PBYTE)pEndScene);    
        *(PDWORD)&pEndScene = VTable[0];
        CreateThread(NULL,0,&VMT_Patching,NULL,0,NULL); 
        hooked = true;
    }        
}
Добавлено через 13 часов 10 минут
L2 Create new dx device when window resize? because when i resize window me draws stop working. how to fix it?

Последний раз редактировалось wongerlt, 26.07.2019 в 12:23. Причина: Добавлено сообщение
wongerlt вне форума   Ответить с цитированием