PDA

Просмотр полной версии : Lineage2 Interlude Draw text to canvas (c++)


wongerlt
21.07.2019, 00:24
Hello,
Maybe someone try to find parameters for this function? from Engine.dll
?DrawTextToCanvas@UCanvas@@UAEKHHKPBGKKKMHW4L2Font Type@@HHKHHHPAV?$TArray@PAVFL2ColorFontInfo@@@@GW4 EFontExceptionType@@H@Z


public: virtual unsigned long __thiscall UCanvas::DrawTextToCanvas(int,int,unsigned long,unsigned short const *,unsigned long,unsigned long,unsigned long,float,int,enum L2FontType,int,int,unsigned long,int,int,int,class TArray<class FL2ColorFontInfo *> *,unsigned short,enum EFontExceptionType,int)


What each parameter mean, maybe someone was facing with it? : confused:

most interesting for me is enum L2FontType, class TArray<class FL2ColorFontInfo *> *, enum EFontExceptionType

all other parameters i think possible to guess.

Thanks for any information.

ScythLab
24.07.2019, 10:21
Перехватывай эту функцию и смотри, что в нее передается.
Либо используй перехват функций DirectX (Direct3DCreate9), в интернете есть примеры, как с помощью DirectX рисовать что-либо в окне La2

wongerlt
26.07.2019, 12:23
Перехватывай эту функцию и смотри, что в нее передается.
Либо используй перехват функций DirectX (Direct3DCreate9), в интернете есть примеры, как с помощью DirectX рисовать что-либо в окне La2

finally i do it :D
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));
(*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,GetMo duleHandleA(NULL),NULL,NULL,NULL,NULL,"DX",NULL};
RegisterClassExA(&wc);
HWND hWnd = CreateWindowA("DX",NULL,WS_OVERLAPPEDWINDOW,100,100,300,300,GetDeskt opWindow(),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,hWn d,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;
}
}

[I]Добавлено через 13 часов 10 минут
L2 Create new dx device when window resize? because when i resize window me draws stop working. how to fix it?

ScythLab
27.07.2019, 09:44
L2 Create new dx device when window resize? because when i resize window me draws stop working. how to fix it?не знаю, не работал с dx, но повторное создание контекста должно отловиться с помощью перехваченной функции Direct3DCreate9.