Hilfe bei DirectX9 Hook!

Hi,

ich bräuchte mal ehrlich hilfe von Profis hier!
Ich habe diesen Hook hier:
Hier Klicken! runtergeladen und gehofft er funktioniert einwandfrei, und siehe da!
Es geht!!
Endlich ein Overlay Hook der funktioniert.
Natürlich wärs mir lieber wenns im VB.net oder C# gewesen wäre, aber was solls ich versuch hiermit mein Glück.
Nun wollte ich wissen, wie ich es schaffe anstatt einer weißen kleinen Box ein Text anzeigen lasse?

Code:

Code:
INT DrawText(
   LPD3DXSPRITE pSprite,
   LPCTSTR pString,
   int Count,
   LPRECT pRect,
   DWORD Format,
   D3DCOLOR Color
);
HRESULT WINAPI D3DXCreateFont(
   LPDIRECT3DDEVICE9 pDevice,
   unsigned int Height,
   unsigned int Width,
   unsigned int Weight,
   unsigned int MipLevels,
   BOOL Italic,
   DWORD CharSet,
   DWORD OutputPrecision,
   DWORD Quality,
   DWORD PitchAndFamily,
   LPCTSTR pFacename,
   LPD3DXFONT *ppFont
);
HRESULT hr;
HRESULT (APIENTRY *pfnEndScene)( IDirect3DDevice9 *pDevice );
HRESULT APIENTRY hook_EndScene( IDirect3DDevice9 *pDevice ){
    
    ID3DXFont *g_font=NULL;

    const char *fps_string;
    RECT font_rect;

    fps_string= "test";

    SetRect(&font_rect,0,0,20,20);

    D3DRECT rec = { 0, 0, 20, 20 };      
    //pDevice->Clear(1, &rec, D3DCLEAR_TARGET, 0, 0, 0); 

          
    hr=D3DXCreateFont(pDevice,     //D3D Device
                     22,               //Font height
                     0,                //Font width
                     FW_NORMAL,        //Font Weight
                     1,                //MipLevels
                     false,            //Italic
                     DEFAULT_CHARSET,  //CharSet
                     OUT_DEFAULT_PRECIS, //OutputPrecision
                     ANTIALIASED_QUALITY, //Quality
                     DEFAULT_PITCH|FF_DONTCARE,//PitchAndFamily
                     "Arial",          //pFacename,
                     &g_font);         //ppFont

    g_font->DrawText(NULL,        //pSprite
                    fps_string,  //pString
                    -1,          //Count
                    &font_rect,  //pRect
                    DT_LEFT|DT_NOCLIP,//Format,
                    0xFFFFFFFF);


    pDevice->Clear(1, &rec, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255,255, 0, 255), 0, 0);
    return pfnEndScene(pDevice);
}

Kann mir jemand helfen? Ich bitte um anständige Posts, habe es in anderen Foren probiert und wurde beschimpft ich soll C++ lernen....
Ich habe VB.Net so gelernt und nun bin ich an C++ dran.


Gruß
Dennis
 
So..

Code:
class CDX9DrawUtils {
private:
	bool bInit;
	ID3DXFont* m_pFont;

public:
	void init(IDirect3DDevice9* pDevice) {
		if(!bInit) {
			D3DXCreateFont(pDevice, 15, 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET, OUT_TT_ONLY_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &m_pFont);
			bInit = true;
		}
	}

	void drawText(int x, int y, int red, int green, int blue, int alpha, const char *text,...) { 
		D3DCOLOR fontColor = D3DCOLOR_ARGB(alpha, red, green, blue);
		RECT rct;
		rct.left=x; 
		rct.top=y; 
		rct.right=rct.left+350; 
		rct.bottom=rct.top+350;
		va_list va_alist;
		char logbuf[100] = {0};
		va_start(va_alist, text);
		_vsnprintf(logbuf+strlen(logbuf), sizeof(logbuf) - strlen(logbuf), text, va_alist);
		va_end(va_alist);
		m_pFont->DrawText(NULL, logbuf, -1, &rct, 0, fontColor);
	}
};
CDX9DrawUtils DX9DrawUtils;

HRESULT APIENTRY hook_EndScene(IDirect3DDevice9 *pDevice){
	int myNumber = 10;
	float myFloat = 10.5f;
	string myString = "Hello bla string";

	DX9DrawUtils.init(pDevice);
	DX9DrawUtils.drawText(100, 200, 255, 0, 0, 255, "Hallo Welt");
	DX9DrawUtils.drawText(100, 200, 255, 0, 0, 255, "MyNumber %i", myNumber);
	DX9DrawUtils.drawText(100, 200, 255, 0, 0, 255, "MyFloat %f", myFloat);
	DX9DrawUtils.drawText(100, 200, 255, 0, 0, 255, "MyFloat %s", myString.c_str()); //du kannst auch alles in verbindung benutzen.. , "%s%i\n%f.2, myString.c_str(), myNumber, myFloat);    die .2 begrenzen die float nachkomma stellen auf 2..   das \n steht natürlich für newline

	return pfnEndScene(pDevice); //return zum codecave wo die überschriebenen bytes stehen (funktionsprolog) und ein jump zurück zum orginalcode
}
 
Zuletzt bearbeitet:
Super! Echt klasse, habe schon aufgeben wollen... Endlich eine Person hier auf der Welt wo großzügig ist und mir helfen kann.
Super danke!

Ich habe nur ein Problem. Im Spiel wird nichts angezeigt. Vorher mit dem Standart weißen Quadrat gings, mit deinem Code passiert nichts. Der Compiler muckt auch rum wegen dieser Zeile:
" _vsnprintf(logbuf+strlen(logbuf), sizeof(logbuf) - strlen(logbuf), text, va_alist);"


Dann gibt es noch einen fehler mit string, da wird mir string roter unterstrichen (Nutze Visual Studio)
Habe gegoogelt wie man normal strings definiert, und deins ist aber richtig, keine ahnung was visual studio für probleme hat....

Aber super eh!! Danke!
 
Stell mal in den Projekteinstellungen "Charackterset" von Unicode auf Multibyte. Vielleicht ist es das. Bin mir nicht sicher.
Ich benutze den code genau so wie er ist. Das kommt aus dem DrawSDK was ich mir damals für meinen ingame irc client geschrieben hab.
 
Zeichensatz: Multibyte-Zeichensatz verwenden

Ist schon drinnen!

Hier ist der Quellcode von der main.cpp:

Code:
#include <windows.h>
#include <d3dx9.h>
#include <d3d9.h>

#include "../../include/dx9hook.h"
#include "../../include/dx9table.h"

class CDX9DrawUtils {
private:
    bool bInit;
    ID3DXFont* m_pFont;
 
public:
    void init(IDirect3DDevice9* pDevice) {
        if(!bInit) {
            D3DXCreateFont(pDevice, 15, 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET, OUT_TT_ONLY_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &m_pFont);
            bInit = true;
        }
    }
 
    void drawText(int x, int y, int red, int green, int blue, int alpha, const char *text,...) { 
        D3DCOLOR fontColor = D3DCOLOR_ARGB(alpha, red, green, blue);
        RECT rct;
        rct.left=x; 
        rct.top=y; 
        rct.right=rct.left+350; 
        rct.bottom=rct.top+350;
        va_list va_alist;
        char logbuf[100] = {0};
        va_start(va_alist, text);
        _vsnprintf(logbuf+strlen(logbuf), sizeof(logbuf) - strlen(logbuf), text, va_alist);
        va_end(va_alist);
        m_pFont->DrawText(NULL, logbuf, -1, &rct, 0, fontColor);
    }
};
CDX9DrawUtils DX9DrawUtils;

HRESULT (APIENTRY *pfnEndScene)( IDirect3DDevice9 *pDevice );
HRESULT APIENTRY hook_EndScene(IDirect3DDevice9 *pDevice){
    int myNumber = 10;
    float myFloat = 10.5f;
    //string myString = "Hello bla string";

 
    DX9DrawUtils.init(pDevice);
    DX9DrawUtils.drawText(100, 200, 255, 0, 0, 255, "Hallo Welt");
    DX9DrawUtils.drawText(100, 200, 255, 0, 0, 255, "MyNumber %i", myNumber);
    DX9DrawUtils.drawText(100, 200, 255, 0, 0, 255, "MyFloat %f", myFloat);
    //DX9DrawUtils.drawText(100, 200, 255, 0, 0, 255, "MyFloat %s", myString.c_str()); //du kannst auch alles in verbindung benutzen.. , "%s%i\n%f.2, myString.c_str(), myNumber, myFloat);    die .2 begrenzen die float nachkomma stellen auf 2..   das \n steht natürlich für newline
 
    return pfnEndScene(pDevice); //return zum codecave wo die überschriebenen bytes stehen (funktionsprolog) und ein jump zurück zum orginalcode
}

BOOL APIENTRY DllMain( HMODULE hInstance, DWORD dwReason, LPVOID lpReserved )
{
	switch(dwReason) {
		case DLL_PROCESS_ATTACH:
			DisableThreadLibraryCalls((HMODULE)hInstance);
			if(!DirectX9Detour(DX9_ENDSCENE, (FARPROC)&hook_EndScene, (FARPROC)&pfnEndScene)) {
				MessageBoxA(HWND_DESKTOP, "DirectX9Detour failed.", "DirectX9Detour", MB_ICONERROR);
				return FALSE;
			}
			break;

		case DLL_PROCESS_DETACH:
			DirectX9Cleanup();
			break;
	}

	return TRUE;
}

//EDIT: Komplette Source mal hinzugefügt: http://rumstein.de/DirectX9Hook.zip
 
Zuletzt bearbeitet:
Hellö Welt xP

Stehe seit zwei Tagen vor genau dem selbem Problem.

Der Hook funktioniert. Clear oder ColorFill funktionieren einwandfrei.

Die DrawText lasse ich per Tastendruck ausgeführen.
Resultat: Ein kurzes Aufblinken des Textes und dann verschwinden alle vorher, per Clear oder ColorFill, erstellen Flächen, inklusive des Textes.

@Bulldozer1930:
Hast du inzwischen eine Lösung gefunden?

Habe so ziemlich alles abgegrast, was google mdsn und co dazu ausgespuckt haben. Ohne Erfolg.

Gibt es generell Probleme mit Hooks und DrawText?

Bin langsam am Verzweilfen, aber noch hat mit der Ergeiz fest im Griff. (x_X)

Also wenn da draußen mir irgendwer weiter helfen kann, platz ich wahrscheinlich vor Freude ;) (*push*)
 
Gibts inzwischen eine Lösung für eine funktionierende DrawText Methode ? Bastel da jetzt nun schon seit 4 Tagen rum .. :P
 
heyho,

hab vorhin mal mein hook getest... läuft nich mehr -.-
is auch schon ein weilchen her^^

hier aber ein link zu einem funtionierendem hook

hier soll ein crosshair nachträglich gerendert werden, was bei mir nicht geklappt hat...

hab die khEndScene um folgende zeilen erweitert um ein kleines weißes rechteck bei pos 0x0 einzufügen und siehe da, es geht :)
Code:
HRESULT WINAPI hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
    myfile << "EndScene is hooked\n";             //Check log
    while(!npDevice) {
        npDevice = pDevice;                       //Here we store pDevice so we can re-hook with a VTable hook later.
    }

                                                  
    /*if(g_pFont == NULL) D3DXCreateFontA(pDevice, 15, 0, FW_BOLD, 1, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Verdana", &g_pFont); //Create fonts
                                                  
    if(g_pLine == NULL) D3DXCreateLine(pDevice, &g_pLine); //Create lines

    pDevice->GetViewport(&g_ViewPort);
	
	if(GetAsyncKeyState(VK_DECIMAL)&1) 
{
	bXHair=!bXHair;
	bChams=!bChams;
}
	if( bXHair ){DrawXHair(pDevice,D3DCOLOR_XRGB( 255, 0, 0 ) );}*/

	IDirect3DSurface9 *test;
	pDevice->GetRenderTarget(0, &test);
	D3DRECT rec = {0, 0, 10, 10};
	pDevice->Clear(1, &rec, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 0, 0);

    return oEndScene(pDevice);
}

Um die dll zu injecten brauchst du noch Winject oder du nimmst die injector.cpp aus bulldozer post und passt sie dir an. Link (im DirectX9Hook.rar)

wie das ganze funktioniert, kann ich dir auch nur theoretisch erklären, da ich auch eher neuling bin. ein kleines tutoruial dazu

hier gehts zwar um game hacks aber es behandelt auch das hooken des directxdevices. weiß ja nich wozu du das ganze benutzten willst. cheaten is ******** :mad: aber ich werd hier mal nix unterstellen ;)

zum groben ablauf:
  • wenn prozess xyz.exe gestartet ist wird während der runtime deine dll injected
  • deine dll hängt sich an die endscene funktion vom directxdevice (pDevice; pointer aufs DIRECT3DDEVICE9) bzw. leitet sie an die khEndScene in der du alle möglichen sachen rendern, texturen austauschen etc kannst
  • das von die geänderte directxdevice wird an die eigentliche EndScene zurück returnt womit dann deine änderungen gerendert werden

hoffe, du kannst damit erstmal was anfangen... bei fragen, fragen ;)
 
Zurück