In DirectX "einklinken"



  • Hallo! Ich habe keine Ahnung, ob das Forum hier das richtige ist, aber da ich nach langer Suche keine Lösung für mein Problem gefunden habe schildere ich es mal hier:

    Also:

    Ich habe es geschaft eine DLL zu injecten in eine Anwendung, in der DirectX initialisiert wurde.
    Nun habe ich die Frage: Wie kann ich auf diese DirectX zugreifen, also z.B. Text ausgeben oder ein Bild zeichnen?

    Mfg,

    Frey



  • Frey094 schrieb:

    Wie kann ich auf diese DirectX zugreifen, also z.B. Text ausgeben oder ein Bild zeichnen?

    😃



  • Oh Cool...
    Danke für die schnelle Antwort!
    Hast mir echt weitergeholfen.

    Ich weiß, dass es möglich ist.



  • Wenn du die nötigen Handles hast, solltest du die gleichen Funktionen benutzen können, wie sonst auch.
    Sprich. Schau zu, dass du ein Handle auf die Device kriegst und dann kannst du dort drauf Funktionen aufrufen. Sollte imo gehen, habs aber noch nie gemacht.



  • Ok Vielen Dank!
    Ich werds probieren!



  • Ör.
    Kommt man denn an das 3D Device bzw. die DirectDraw Instance dran?

    Ich kenne nur den Weg, eine eigene DLL in das Programmverzeichnis zu kopieren, die dann z.B. "D3D9.dll" heisst. Da drinnen implementiert man die entsprechende Create-Funktion, lädt dann die "echte" D3D DLL nach, wrappt die Interfaces, und hängt sich bei EndScene rein.
    Wo man dann munter zeichnen kann was man mag.

    Oder so ähnlich 🤡



  • Kann sein, dass ich die Frage falsch verstanden habe. Ich habe eher so gedacht, dass man das zur Laufzeit des Programmes macht und sich da in die DLL einklinkt und dann sozusagen als das Programm selbst Anweisungen an die Device schickt.



  • Also der Plan ist folgender:
    Ich habe ein Spiel, dass DirectX benutzt.

    Ich habe eine DLL injected und nun wäre es cool, wenn ich auf das DirectX Device zugreifen könnte. Also z.B. Per DirectInput die Tastatur abfragen könnte oder Text ausgeben könnte.

    Vielen Dank für die Mühe!



  • Es gibt nicht "das" DirectX Device.
    Es gibt DirectSound, DirectDraw, Direct3D, DirectInput etc.
    Die haben alle ihre eigenen "Devices".

    Auch kenne ich keinen Weg, ein bestehendes "Device" zu finden.

    Und was das ausgeben von Text etc. angeht: du musst ja auch irgendwie sicherstellen, dass der Text nicht sofort wieder überschrieben wird. Daher ist es soweit ich weiss üblich, eben nicht mit DLL injection zu arbeiten, sondern z.B. die Direct3D DLL zu "ersetzen".
    Dadurch kannst du dich an einer "sicheren" Stellen einklinken, und dort deinen Text rendern, oder was auch immer du machen willst.

    Was DirectInput angeht: das sollte kein Problem sein. Du kannst ja einfach deine eigene DirectInput Instanz erzeugen, und dann diese verwenden. Oder sogar einfach die Windows Funktionen ala Get(Async)KeyState etc.



  • ...



  • Vielen Dank für die ganzen Antworten.

    Ich werde mich mal bemühen etwas zu schreiben

    Mfg,

    Frey



  • Hook einfach EndScene und hol dir das Device davon, geht wohl am Besten.

    HRESULT __stdcall EndScene_detour(LPDIRECT3DDEVICE9 pDevice)
    {
            yourdevice = pDevice;
    	return EndScene_d(pDevice);
    }
    


  • Wie es aussieht scheint wirklich Hooken die Lösung zu sein.

    Hier: http://www.gamedev.net/community/forums/topic.asp?topic_id=359794 gibt es ein Beispiel mit Quellcode.

    Mfg, Frey


Anmelden zum Antworten