Direct3D-Funktionen ohne Referenz auf DirectX-DLLs



  • Hört sich erst mal nach Grafikprogrammierung an, aber ich vermute, dass es hier dennoch besser aufgehoben ist.

    Eingangssituation ist folgende: Altes 3D-Spiel auf der Platte, geht nur mit einer grottigen Auflösung von 1024x768x32. Dachschaden hat den Plan, eine eigene DLL zu injecten, welches der Routine, die das virtuelle Device erstellt, andere Parameter übergibt. Vorzugsweise Parameter, die wenigstens 1280x960 erlauben. Und mit denen man die Aspect Ratio erhalten lassen kann.

    Schreiben/Kompilieren einer solchen DLL ist kein Problem - mein Problem ist ein ganz anderes: Das Spiel hat keine Referenz auf irgendwelche DirectX-DLLs ( d3d8.dll , wäre glaube ich der nächste Kandidat - ist halt ein altes Spiel). Nur auf die ddraw.dll für DirectDraw-Funktionen, ein nach dem, was ich verstanden habe, 2D-API, welches auch gar nicht mehr supported wird.

    Ich habe die Anwendung durch IDA gejagt, dort habe ich nur Referenzen auf die üblichen Verdächtigen (USER32, KERNEL32, NTDLL usw. + DDRAW) gesehen. Wenn ich in der Anwendung selbst nach DLL suche, komme ich nur auf ddraw.dll.

    Meine Frage wäre daher: wie kann ich es hinbekommen, dass mir angezeigt wird, welche DirectX-Funktionen aus welchen DLLs aufgerufen werden, damit ich nicht gezwungen bin, für jede Funktion in den DLLs einen Wrapper zu schreiben?

    (Da ich nicht so dicke in DirectX-Programmierung bin, weiß ich nicht, ob die Anwendung vielleicht auch nur statisch gelinkt wurde. Vielleicht ist das mit DirectX auch gar nicht möglich, ich weiß es nicht).



  • Hm...

    Ich glaube vor Direct3D8 war Direct3D mit DirectDraw zusammen.

    D.h. das Spiel macht ein DirectDrawCreate bzw. DirectDrawCreateEx ( ddraw.dll ), und bekommt da ein DirectDraw Interface zurück.
    Und holt sich dann einfach über QueryInterface z.B. das IDirect3D7 Interface des selben Objekts.

    Du müsstest also zumindest die DirectDrawCreate bzw. DirectDrawCreateEx Funktion implementieren. Dazu wirst du dich vermutlich ein wenig bei COM einlesen müssen, speziell was das Thema Aggregation angeht.

    ps: Und natürlich kann es sein dass das Spiel gar kein Direct3D verwendet, sondern Software-Rendering.


Log in to reply