OldSchoolHack

Registrieren / Anmelden Deutsch

D3D Hook - D3DXCreateFont & DrawFont


icon D3D Hook - D3DXCreateFont & DrawFont #1

Anmeldungsdatum: Apr 2014

Beiträge: 4

Hallo ich arbeite z.Z. ein paar tut's durch und würde gerne "Deutsche" schrift in eine Fremde Anwendung Zeichnen.

Mein derzeitiger Stand:
Um Links zu sehen, musst du dich registrieren


CPP Code:
  1.  
  2.  
  3. const D3DCOLOR txtPink = D3DCOLOR_ARGB(255, 255, 0, 255); // Alpha, Rot, Grün, Blau
  4. const D3DCOLOR txtBlaue = D3DCOLOR_ARGB(255, 0, 0, 255); // Alpha, Rot, Grün, Blau
  5. void DrawFont (int X, int Y, D3DCOLOR Color, char *format, ...);
  6.  
  7.  
  8. void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color);
  9. //Our font interface
  10. ID3DXFont *g_font=NULL;
  11.  
  12. HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
  13. {
  14. DrawRect ( pDevice, 10, 10, 200, 200, txtPink);
  15.  
  16. if ( g_font == 0 )
  17. {
  18. D3DXCreateFont(pDevice, 14, 0, FW_NORMAL, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, (LPCWSTR)"Arial", &g_font );
  19. }
  20. else
  21. {
  22. DrawFont ( 20, 50, txtBlaue, "Hife" );
  23. g_font->OnLostDevice();
  24. g_font->OnResetDevice();
  25.  
  26. }
  27.  
  28. DrawFont ( 300, 50, txtPink, "Bitte" );
  29.  
  30.  
  31. return pEndScene(pDevice);
  32. }
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39. //Draw------------
  40.  
  41. void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color)
  42. {
  43. D3DRECT rect = {X, Y, X+L, Y+H};
  44. Device_t->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0);
  45. }
  46.  
  47. void DrawFont (int X, int Y, D3DCOLOR Color, char *format, ...)
  48. {
  49. //const char *fps_string;
  50. //fps_string = "a";
  51. char buffer[256];
  52. va_list args; // deswegen: #include <cstdio>
  53. va_start (args, format);
  54. vsprintf (buffer,format, args);
  55. RECT FontRect = { X, Y, X + 120, Y + 16 };
  56. g_font->DrawText(NULL,        //pSprite
  57.                               (LPCWSTR) buffer,  //pString
  58.                                -1,          //Count
  59.                                &FontRect,  //pRect
  60.                                DT_NOCLIP,//Format,
  61.                                Color); //Color
  62. //( NULL, buffer, -1, &FontRect, DT_NOCLIP , Color ); // Zeichnen
  63. va_end (args);
  64. }
  65.  

Frage 2:

Warum bekomme ich immer wieder den Fehler (in Visual Studio 2010) wenn ich bei buffer das (LPCWSTR) weg lasse:


Das Argument vom Typ ""char *"" ist mit dem Parameter vom Typ ""LPCWSTR"" inkompatibel.

Hier der Code zur Frage 2:

CPP Code:
  1.  
  2.  
  3. g_font->DrawText(      NULL,        
  4.                                (LPCWSTR) buffer,  //<--- hier ist der Bösewicht
  5.                                -1,        
  6.                                &FontRect,  
  7.                                DT_NOCLIP,
  8.                                Color);
  9.  

und bei

CPP Code:
  1.  
  2. D3DXCreateFont(pDevice,
  3.                       14,
  4.                       0,
  5.                       FW_NORMAL,
  6.                        1,
  7.                       false,
  8.                       DEFAULT_CHARSET,
  9.                       OUT_DEFAULT_PRECIS,
  10.                       ANTIALIASED_QUALITY,
  11.                       DEFAULT_PITCH | FF_DONTCARE,
  12.                       "Arial", //<--- hier wurde jetzt der Fehler erscheinen
  13.                       &g_font );
  14.  
  15.  

wird bei mir immer das "Arial" als Fehler angegeben:

Das Argument vom Typ ""const char *"" ist mit dem Parameter vom Typ ""LPCWSTR"" inkompatibel.


Frage 3:
Wenn die Anwendung scalliere oder full Scren aktivere kommt diese Fehlermeldung:

Um Links zu sehen, musst du dich registrieren


Was kann/muss ich tun?
Danke

Zuletzt geändert von KN4CK3R (Mo 7. Apr 2014, 12:50)

Grund: kein Grund angegeben

icon #2

Anmeldungsdatum: Mär 2011

Beiträge: 978

Benutzer-Bewertung:

89 positiv
6 negativ
Ein thread reicht, danke.

1. würde ich dir ans herz legen zuerst die sprache c++ zu lernen, bevor du mit hacks anfängst, dann könntest du solche fehler selbst beheben.

2. guck dir die tuts in meiner sig an.

3. Antwort auf fragen:
1. wird durch 2. frage ausgelöst
2. DrawText erwartet ein buffer von unicode characters, nicht auf ascii characters, also wchar_t* anstatt char*, genauso wie createfont ein unicode fontnamen erwartet.
Fixen lässt sich das indem du kennzeichnest, dass der konstante string ein unicode string ist, also L"Arial" und wchar_t buffer benutzt, oder indem du die projekteinstellungen von unicode auf multibyte umstellst (wie das geht - google).
3. Die meisten directx ressourcen wie fonts, texturen etc. müssen bei einem reset (der z.b. bei einem resize der device oder umschalten vollbild/windowed etc. auftritt) releast und wieder neu erstellt werden falls sie nicht selber funktionen dafür bereitstellen oder sog. managed ressourcen sind.
das dx sample programm ist da so nett und zeigt eine fehlermeldung an - spiele crashen meist oder ignorieren es -> memory leak.

__________________

http://www.abload.de/img/signfj5o.png
Spoiler
Vids:
Zitate:
Spoiler

Zitat von xst
Vater KN4CK3R, der du hängst im irc, geheiligt werde dein Botnet, dein P7 v1.337 komme, die Bannwelle geschehe, wie in CS:S als auch in CS:GO, führe uns nicht in Versuchung, sondern erlöse uns von all dem c+p-Shit.
Zitat von f4gsh0t_h4x
VAC ist an,immer,überall
Zitat von gibson.w
Ich mag braune Würstchen
Zitat von irc
<SilverDeath> KN4CK3R bistn nub
<~KN4CK3R> kk
Zitat von irc
<OrkSchamane> das prob is das viele dieser eig. recht guten bücher englisch sind ...
<OrkSchamane> da habe ich's ja doppelt schwer
<~KN4CK3R> falsch
<~KN4CK3R> das prob is dass du programmieren willst ohne englisch zu können
Zitat von irc
<SilverDeath> Ich schwöre dir Dr_Pepper Ich bumms deine Mutter tot Mann!
<Dr_Pepper> danke.
<SilverDeath> bitte
Zitat von irc
<~KN4CK3R> dann liegts wenigstens an mir
<~KN4CK3R> nur noch rausfinden warum -.-
<SilverDeath> ja sicher
<SilverDeath> an wem sonst?
* You were kicked by KN4CK3R (kick)
Zitat von Dr_Pepper
ihr seit beide dumm
Tutorials:
Releases:
Gifs:
Spoiler
http://www.abload.de/img/uberesp2sgul2.gif
https://i.imgur.com/Z5VQMrV.gif
http://www.abload.de/img/minesweeperzgaef.gif
icon #3

Anmeldungsdatum: Apr 2014

Beiträge: 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:
  1.  
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <Windows.h>
  4. #include <cstdio>
  5. #include <time.h>
  6. #include <d3d9.h> //einmal endscene() hooken.
  7. #include <d3dx9.h>
  8.  
  9.  
  10. #pragma once
  11. #pragma comment(lib, "d3d9.lib")
  12. #pragma comment(lib,"d3dx9d.lib")
  13. #pragma comment(lib,"d3dx9.lib")
  14.  
  15. const D3DCOLOR txtGreen = D3DCOLOR_ARGB(255, 0, 255, 0); //um zu in das game-Fenster zu malen brauch man ein D3DCOLOR
  16. HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice);
  17. typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9);
  18. EndScene_t pEndScene;
  19. DWORD WINAPI HookThread(); //typedef und einen Funktionspointer davon
  20.  
  21.  
  22.  
  23. void add_log(char* format, ...);
  24. void* DetourFunc(PBYTE src, const PBYTE dst, const int len);
  25. bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
  26. DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);
  27.  
  28. HMODULE hModD3D9 = NULL;
  29. FARPROC dwEndScene = NULL;
  30. HANDLE tmpHandle = NULL;
  31. DWORD* VTableStart = NULL; //Pointer auf die VTable
  32. DWORD tempadd = NULL;
  33.  
  34.  
  35. const D3DCOLOR txtPink = D3DCOLOR_ARGB(100, 255, 0, 255); // Alpha, Rot, Grün, Blau
  36. const D3DCOLOR txtBlaue = D3DCOLOR_ARGB(100, 0, 0, 255); // Alpha, Rot, Grün, Blau
  37. void DrawFont (int X, int Y, D3DCOLOR Color, char *format, ...);
  38.  
  39.  
  40. void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color);
  41. //Our font interface
  42. ID3DXFont *g_font=NULL;
  43. #pragma endregion
  44.  
  45. typedef HRESULT(__stdcall* Reset_t)(IDirect3DDevice9*, D3DPRESENT_PARAMETERS*); //<--
  46. bool DIPInit = true;
  47. Reset_t OrigReset;
  48.  
  49.  
  50.  
  51. //---------------
  52.  
  53.  
  54.  
  55. BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved)
  56. {
  57. switch(Reason)
  58. {
  59. case DLL_PROCESS_ATTACH: add_log("==========LOG START==========");
  60. add_log("DLL Attached");
  61. add_log("Creating Thread...");
  62. tmpHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&HookThread, 0, 0, 0);
  63. if (!tmpHandle)
  64. {
  65. add_log("ThreadCreation Failed!");
  66. }
  67. break;
  68. case DLL_PROCESS_DETACH: add_log("DLL Detached");
  69. add_log("==========LOG END==========\n\n\n");
  70. break;
  71. }
  72. return 1;
  73. }
  74.  
  75.  
  76.  
  77.  
  78. DWORD WINAPI HookThread(void)
  79. {
  80. add_log("Thread Created");
  81. while (!hModD3D9)
  82. {
  83. add_log("Searching d3d9.dll...");
  84. hModD3D9 = GetModuleHandle("d3d9.dll");
  85. Sleep(100);
  86. }
  87.  
  88. add_log("Found d3d9.dll: %x !", hModD3D9);
  89.  
  90. //---------VTable finden
  91. tempadd = dwFindPattern((DWORD)hModD3D9, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
  92. VTableStart = (DWORD*) *(DWORD*)(tempadd+2);
  93. //---------VTable finden---Ende
  94.  
  95. //---------EndScene Adresse holen und dann hooken
  96. dwEndScene = (FARPROC) VTableStart[42];
  97.  
  98. pEndScene = (EndScene_t) DetourFunc((PBYTE) dwEndScene, (PBYTE)hkEndScene, 5); while (true)
  99. OrigReset = (Reset_t) DetourFunc((BYTE*) VTableStart[16], (BYTE*) ResetHook, 5);
  100.  
  101. {
  102. Sleep(500);
  103. }
  104. return 0;
  105. }
  106.  
  107.  
  108.  
  109.  
  110. HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
  111. {
  112.  
  113. DrawRect ( pDevice, 10, 10, 200, 200, txtPink);
  114.  
  115. if (DIPInit)
  116. {
  117. D3DXCreateFont(pDevice, 14, 0, FW_NORMAL, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &g_font );
  118. DIPInit = false;
  119. }
  120. else
  121. {
  122.  
  123. char *a = "a"; // so kann man eine variable erstellen und sie zeichnen lassen
  124. DrawFont ( 20, 50, txtBlaue, a );
  125.  
  126. /* g_font->OnResetDevice();
  127. g_font->OnLostDevice();*/
  128. DrawFont ( 300, 50, txtPink, "Bitte" );
  129.  
  130. }
  131. return pEndScene(pDevice);
  132. }
  133.  
  134.  
  135. //----------
  136. HRESULT __stdcall ResetHook(IDirect3DDevice9* Device, D3DPRESENT_PARAMETERS* Params)
  137. {
  138. if (!DIPInit)
  139. {
  140. g_font->Release();
  141. }
  142. DIPInit = true;
  143. return OrigReset(Device, Params);
  144. }
  145. //----------
  146.  
  147.  
  148. #pragma region Draw------------dinge
  149.  
  150. void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color)
  151. {
  152. D3DRECT rect = {X, Y, X+L, Y+H};
  153. Device_t->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0);
  154. }
  155.  
  156. void DrawFont (int X, int Y, D3DCOLOR Color, char *format, ...)
  157. {
  158. //const char *fps_string;
  159. //fps_string = "a";
  160. char buffer[256];
  161. va_list args; // deswegen: #include <cstdio>
  162. va_start (args, format);
  163. vsprintf ( buffer,format, args);
  164. RECT FontRect = { X, Y, X + 120, Y + 16 };
  165. g_font->DrawText(NULL, //pSprite
  166. buffer, //pString
  167. -1, //Count
  168. &FontRect, //pRect
  169. DT_NOCLIP,//Format,
  170. Color); //Color
  171.  
  172. va_end (args);
  173. }
  174.  
  175.  
  176.  
  177.  
  178.  
  179. void* DetourFunc(PBYTE src, const PBYTE dst, const int len) // Adresse der OriginalFunktion ( src) und Adresse der HookFunktion (dst)
  180. {
  181. DWORD dwback;
  182. BYTE* jmp = (BYTE*)malloc(len+5); //Speicher für unser Trampolin allokieren und die <len> Bytes aus Source hineinkopieren
  183. VirtualProtect(src, len, PAGE_READWRITE, &dwback); //save ^ und readwrite rechte geben --- mit VirtualProtect die entsprechenden Rechte zusichern
  184. memcpy(jmp, src, len);
  185. jmp += len;
  186. jmp[0] = 0xE9; // jmp befehl in den anfang der Originalfunktion reinschreiben
  187. *(DWORD*)(jmp+1) = (DWORD)(src + len - jmp) - 5; // relative adresse zu dst eintragen
  188. src[0] = 0xE9;
  189. *(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
  190. VirtualProtect(src, len, dwback, &dwback); // vp wieder herstellen.
  191. VirtualProtect(jmp-len, len+5, PAGE_EXECUTE_READWRITE, &dwback); //Trampolin Execute Rechte geben
  192. return (jmp - len);
  193. }
  194.  
  195. //---------------------
  196. //um die Adresse der EndScene Funktion zu finden, ein sogenanntes "Search-Pattern", also ein Suchmuster.
  197. //Dazu benutzen wir diese beiden Funktionen hier:
  198. bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
  199. {
  200. for(;*szMask;++szMask,++pData,++bMask)
  201. {
  202. if(*szMask=='x' && *pData!=*bMask )
  203. {
  204. return false;
  205. }
  206. }
  207. return (*szMask) == NULL;
  208. }
  209.  
  210.  
  211. DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
  212. {
  213. for(DWORD i=0; i < dwLen; i++)
  214. {
  215. if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
  216. {
  217. return (DWORD)(dwAddress+i);
  218. }
  219. }
  220. return 0;
  221. }
  222.  
  223. //Erstellt eine Log.txt in dem ausführendem verzeichniss und schreibt den erfolg/misserfolg dahinein
  224. void add_log(char* format, ...)
  225. {
  226. HANDLE filehandle;
  227. DWORD dwReadBytes;
  228. char buffer[2048];
  229. char writebuffer[2048];
  230. va_list args;
  231. va_start(args, format);
  232. vsprintf (buffer, format, args);
  233. filehandle = CreateFile("Log.txt", GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
  234. SetFilePointer(filehandle, 0, 0, FILE_END);
  235. char date[18]; _strdate(date);
  236. date[8] = ' ';
  237. _strtime(date+9);
  238. sprintf_s(writebuffer, 2048, "Log Added (%s): %s\r\n", date, buffer);
  239. WriteFile(filehandle, writebuffer, strlen(writebuffer), &dwReadBytes, 0); CloseHandle(filehandle);
  240. }
  241.  
icon #4

Anmeldungsdatum: Mär 2011

Beiträge: 978

Benutzer-Bewertung:

89 positiv
6 negativ
CPP Code:
  1.  
  2. HRESULT __stdcall ResetHook(IDirect3DDevice9* Device, D3DPRESENT_PARAMETERS* Params)
  3. {
  4. if (!DIPInit)
  5. {
  6. g_font->Release();
  7. }
  8. DIPInit = true;
  9. return OrigReset(Device, Params);
  10. }

zu

CPP Code:
  1.  
  2. HRESULT __stdcall ResetHook(IDirect3DDevice9* Device, D3DPRESENT_PARAMETERS* Params)
  3. {
  4. if (!DIPInit)
  5. {
  6. g_font->OnLostDevice();
  7. }
  8. HRESULT Temp = OrigReset(Device, Params);
  9. if (!DIPInit)
  10. {
  11. g_font->OnResetDevice();
  12. }
  13. return Temp;
  14. }
  15.  

und wieso heißt dein endscene init code switch bool DIPInit?

edit:
außerdem grad mal genauer angeguckt, eigtl sollte dein ansatz auch funktionieren - im thread, ist i-wie eine while schleife beim HookThread verrutscht - sicher, dass dein reset hook überhaupt gecallt wird?
außerdem bekommt der hookthread als param nicht void, sondern void* als parameter.

__________________

http://www.abload.de/img/signfj5o.png
Spoiler
Vids:
Zitate:
Spoiler

Zitat von xst
Vater KN4CK3R, der du hängst im irc, geheiligt werde dein Botnet, dein P7 v1.337 komme, die Bannwelle geschehe, wie in CS:S als auch in CS:GO, führe uns nicht in Versuchung, sondern erlöse uns von all dem c+p-Shit.
Zitat von f4gsh0t_h4x
VAC ist an,immer,überall
Zitat von gibson.w
Ich mag braune Würstchen
Zitat von irc
<SilverDeath> KN4CK3R bistn nub
<~KN4CK3R> kk
Zitat von irc
<OrkSchamane> das prob is das viele dieser eig. recht guten bücher englisch sind ...
<OrkSchamane> da habe ich's ja doppelt schwer
<~KN4CK3R> falsch
<~KN4CK3R> das prob is dass du programmieren willst ohne englisch zu können
Zitat von irc
<SilverDeath> Ich schwöre dir Dr_Pepper Ich bumms deine Mutter tot Mann!
<Dr_Pepper> danke.
<SilverDeath> bitte
Zitat von irc
<~KN4CK3R> dann liegts wenigstens an mir
<~KN4CK3R> nur noch rausfinden warum -.-
<SilverDeath> ja sicher
<SilverDeath> an wem sonst?
* You were kicked by KN4CK3R (kick)
Zitat von Dr_Pepper
ihr seit beide dumm
Tutorials:
Releases:
Gifs:
Spoiler
http://www.abload.de/img/uberesp2sgul2.gif
https://i.imgur.com/Z5VQMrV.gif
http://www.abload.de/img/minesweeperzgaef.gif
Zuletzt geändert von SilverFire (Do 24. Apr 2014, 20:18)

Grund: kein Grund angegeben

1 positiv
0 negativ
Dieser Beitrag wurde bewertet von:
lacrima (So 18. Mai 2014, 16:51)
icon #5

Anmeldungsdatum: Dez 2011

Beiträge: 97

Benutzer-Bewertung:

2 positiv
0 negativ
Guten Morgen,


Zitat
Das Argument vom Typ ""const char *"" ist mit dem Parameter vom Typ ""LPCWSTR"" inkompatibel.

Du verwendest Visual Studio oder?
Falls ja: 
Klick auf Projekt > "DEIN PROJEKT" Eigenschaften

http://s7.directupload.net/images/140821/ifermcay.png 

Und Setze "Zeichensatz" auf MultiByte.

Gruß
vedel
Zuletzt geändert von vedel (Do 21. Aug 2014, 10:23)

Grund: kein Grund angegeben