Join Date: Apr 2014
Posts: 4
|
kann mir nochmal jemand sagen was in meinem code falsch ist?
Situation: ich möchte ein rectangle und schrift in eine directx9 Anwendung rein malen, wenn ich nun die Fenstergröße verändere wird das spiel nicht mehr gezeichnet. Der Fehlerhafte C++ Code dazu:
TEXT Code: #define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #include <cstdio> #include <time.h> #include <d3d9.h> //einmal endscene() hooken. #include <d3dx9.h> #pragma once #pragma comment(lib, "d3d9.lib") #pragma comment(lib,"d3dx9d.lib") #pragma comment(lib,"d3dx9.lib") const D3DCOLOR txtGreen = D3DCOLOR_ARGB(255, 0, 255, 0); //um zu in das game-Fenster zu malen brauch man ein D3DCOLOR HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice); typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9); EndScene_t pEndScene; DWORD WINAPI HookThread(); //typedef und einen Funktionspointer davon void add_log(char* format, ...); void* DetourFunc(PBYTE src, const PBYTE dst, const int len); bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask); DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask); HMODULE hModD3D9 = NULL; FARPROC dwEndScene = NULL; HANDLE tmpHandle = NULL; DWORD* VTableStart = NULL; //Pointer auf die VTable DWORD tempadd = NULL; const D3DCOLOR txtPink = D3DCOLOR_ARGB(100, 255, 0, 255); // Alpha, Rot, Grün, Blau const D3DCOLOR txtBlaue = D3DCOLOR_ARGB(100, 0, 0, 255); // Alpha, Rot, Grün, Blau void DrawFont (int X, int Y, D3DCOLOR Color, char *format, ...); void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color); //Our font interface ID3DXFont *g_font=NULL; #pragma endregion typedef HRESULT(__stdcall* Reset_t)(IDirect3DDevice9*, D3DPRESENT_PARAMETERS*); //<-- bool DIPInit = true; Reset_t OrigReset; //--------------- BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved) { switch(Reason) { case DLL_PROCESS_ATTACH: add_log("==========LOG START=========="); add_log("DLL Attached"); add_log("Creating Thread..."); tmpHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&HookThread, 0, 0, 0); if (!tmpHandle) { add_log("ThreadCreation Failed!"); } break; case DLL_PROCESS_DETACH: add_log("DLL Detached"); add_log("==========LOG END==========\n\n\n"); break; } return 1; } DWORD WINAPI HookThread(void) { add_log("Thread Created"); while (!hModD3D9) { add_log("Searching d3d9.dll..."); hModD3D9 = GetModuleHandle("d3d9.dll"); Sleep(100); } add_log("Found d3d9.dll: %x !", hModD3D9); //---------VTable finden tempadd = dwFindPattern((DWORD)hModD3D9, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx"); VTableStart = (DWORD*) *(DWORD*)(tempadd+2); //---------VTable finden---Ende //---------EndScene Adresse holen und dann hooken dwEndScene = (FARPROC) VTableStart[42]; pEndScene = (EndScene_t) DetourFunc((PBYTE) dwEndScene, (PBYTE)hkEndScene, 5); while (true) OrigReset = (Reset_t) DetourFunc((BYTE*) VTableStart[16], (BYTE*) ResetHook, 5); { Sleep(500); } return 0; } HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice) { DrawRect ( pDevice, 10, 10, 200, 200, txtPink); if (DIPInit) { D3DXCreateFont(pDevice, 14, 0, FW_NORMAL, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &g_font ); DIPInit = false; } else { char *a = "a"; // so kann man eine variable erstellen und sie zeichnen lassen DrawFont ( 20, 50, txtBlaue, a ); /* g_font->OnResetDevice(); g_font->OnLostDevice();*/ DrawFont ( 300, 50, txtPink, "Bitte" ); } return pEndScene(pDevice); } //---------- HRESULT __stdcall ResetHook(IDirect3DDevice9* Device, D3DPRESENT_PARAMETERS* Params) { if (!DIPInit) { g_font->Release(); } DIPInit = true; return OrigReset(Device, Params); } //---------- #pragma region Draw------------dinge void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color) { D3DRECT rect = {X, Y, X+L, Y+H}; Device_t->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0); } void DrawFont (int X, int Y, D3DCOLOR Color, char *format, ...) { //const char *fps_string; //fps_string = "a"; char buffer[256]; va_list args; // deswegen: #include <cstdio> va_start (args, format); vsprintf ( buffer,format, args); RECT FontRect = { X, Y, X + 120, Y + 16 }; g_font->DrawText(NULL, //pSprite buffer, //pString -1, //Count &FontRect, //pRect DT_NOCLIP,//Format, Color); //Color va_end (args); } void* DetourFunc(PBYTE src, const PBYTE dst, const int len) // Adresse der OriginalFunktion ( src) und Adresse der HookFunktion (dst) { DWORD dwback; BYTE* jmp = (BYTE*)malloc(len+5); //Speicher für unser Trampolin allokieren und die <len> Bytes aus Source hineinkopieren VirtualProtect(src, len, PAGE_READWRITE, &dwback); //save ^ und readwrite rechte geben --- mit VirtualProtect die entsprechenden Rechte zusichern memcpy(jmp, src, len); jmp += len; jmp[0] = 0xE9; // jmp befehl in den anfang der Originalfunktion reinschreiben *(DWORD*)(jmp+1) = (DWORD)(src + len - jmp) - 5; // relative adresse zu dst eintragen src[0] = 0xE9; *(DWORD*)(src+1) = (DWORD)(dst - src) - 5; VirtualProtect(src, len, dwback, &dwback); // vp wieder herstellen. VirtualProtect(jmp-len, len+5, PAGE_EXECUTE_READWRITE, &dwback); //Trampolin Execute Rechte geben return (jmp - len); } //--------------------- //um die Adresse der EndScene Funktion zu finden, ein sogenanntes "Search-Pattern", also ein Suchmuster. //Dazu benutzen wir diese beiden Funktionen hier: bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask) { for(;*szMask;++szMask,++pData,++bMask) { if(*szMask=='x' && *pData!=*bMask ) { return false; } } return (*szMask) == NULL; } DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask) { for(DWORD i=0; i < dwLen; i++) { if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) ) { return (DWORD)(dwAddress+i); } } return 0; } //Erstellt eine Log.txt in dem ausführendem verzeichniss und schreibt den erfolg/misserfolg dahinein void add_log(char* format, ...) { HANDLE filehandle; DWORD dwReadBytes; char buffer[2048]; char writebuffer[2048]; va_list args; va_start(args, format); vsprintf (buffer, format, args); filehandle = CreateFile("Log.txt", GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0); SetFilePointer(filehandle, 0, 0, FILE_END); char date[18]; _strdate(date); date[8] = ' '; _strtime(date+9); sprintf_s(writebuffer, 2048, "Log Added (%s): %s\r\n", date, buffer); WriteFile(filehandle, writebuffer, strlen(writebuffer), &dwReadBytes, 0); CloseHandle(filehandle); }
|