IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Hook Direct3D sur rasteriser propriétaire (ancien jeu vidéo)


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Particulier
    Inscrit en
    Mars 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Particulier
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Hook Direct3D sur rasteriser propriétaire (ancien jeu vidéo)
    Hello,
    J'ai besoin d'aide SVP, si vous avez un peu de temps..

    Il y a 10 ans environ j'ai créé une DLL pour afficher des données de télémétries dans un jeu vidéo D3D9.
    Le principe que j'avais choisi était de nommer ma dll "D3D9.DLL" et de la mettre dans le répertoire du jeu pour le tromper, le jeu croyait charger la vraie.
    Bref, une fois ma dll chargée et à l'aide du SDK Clootie DX9 pour Delphi et de GenCodeHook je parvenais via "Direct3DCreate9" à charger la vraie D3D9.DLL et à récupérer un pointeur sur la vraie fonction DirectX. Ensuite mon Loop d'affichage était basé sur un autre Hook de la fonction DX "Present".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function Direct3DCreate9(SDKVersion: cardinal): Pointer; stdcall;
    begin
      Module := LoadLibrary(pchar(GetWinDir+'\system32\d3d9.dll'));
      @Direct3DCreate9original := GetProcAddress(Module, 'Direct3DCreate9');
      Result := Direct3DCreate9original(SDKVersion);
      if not (Result = nil) and (@CreateDeviceNext = nil) then
        CreateGenericCodeHook(GetPtrMethod(Result, 16), @CreateDeviceCallback, @CreateDeviceNext);
    end;

    Bon, aujourd'hui je travaille sur un autre jeu, très ancien (Grand Prix Legends), et ça se corse sévèrement.
    Ce jeu gère l'affichage avec un rasteriser propriétaire, apparemment style DirectX 7.
    Avec ma méthode classique je suis donc chocolat...

    J'ai dans l'idée de déplacer le rasteriser dans un sous dossier du jeu (par exemple .\raster\rastD3D7.dll ) , et de créer ma DLL en utilisant le même nom, ça serait ma façon de forcer le jeu à la charger.
    Sauf que, les SDK Clootie débutent à DX8, et donc évidemment ça ne sert a rien que j'essai de faire un hook dans Direct3DCreate8 ou 9 .... vu que je ne récupèrerais pas de pointeur sur la fonction du rasteriser propriétaire.

    Et même si j'y parvenais, il faudrait qu'il y ait des fonctions communes entre les deux versions de DirectX pour que je puisse faire appeler mon Loop principal pour exécuter mon propre code graphique par dessus celui du jeu..

    J'en suis là et franchement je n'arrive pas à avancer.

    Ma question est donc, comment feriez-vous ? Quelle pistes pouvez-vous me conseiller ?
    Ou même peut-être suis-je à coté de la plaque...
    Je suis codeur amateur, très amateur même, mais même si je mets généralement 15 fois plus de temps qu'un pro, je vais au bout Sauf que là je galère.

    Merci d'avance pour vos conseils,

    Alekhine.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Bonjour,

    j'ai fait ce genre de chose il y a fort longtemps pour faire tourner Age of Empire sur un PC doté d'une puce Poulsbo qui n'était pas compatible...et ça été assez simple car AOE se contente d'allouer un buffer DirectX qu'il alimente en software...donc j'ai simplement créé un Bitmap et je ne faisais tout simplement pas appel à DX

    Quoi qu'il en soit tu peux toujours surcharger la DLL comme tu veux...et c'est simple en fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    library rastD3D7;
     
    procedure QueJeNeChangePas; external 'CheminVersLaVraieDLL\rastD3D7.dll';
     
    function QueJeChangeOriginale; external 'CheminVersLaVraieDLL\rastD3D7.dll' name 'QueJeChange';
     
     
    function QueJeChange; stdcall;
    begin
      Result :=  QueJeChangeOriginale;
    end;
     
    exports
      QueJeNeChangePas,
      QueJeChange;
     
    begin
    end.
    tu n'as pas besoin du détail des fonctions que tu ne surcharges pas, car elles sont exportées par nom (et donc par adresse) peu importe la déclaration ce n'est pas elle qui défini le passage des paramètres (sauf dans le cas de fonction manglées mais ce n'est pas le cas de DX).

    et tu colles ta DLL dans le répertoire de l'exe du Jeu

    le plus pénible c'est encore de déclarer toutes les fonctions utilisées par le jeu et que tu ne détournes pas...à la rigueur il faudrait partir sur un programme comme DID qui va extraire les fonctions exposées de la DLL pour créer un wrapper
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Particulier
    Inscrit en
    Mars 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Particulier
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    Bonjour,

    j'ai fait ce genre de chose il y a fort longtemps pour faire tourner Age of Empire sur un PC doté d'une puce Poulsbo qui n'était pas compatible...et ça été assez simple car AOE se contente d'allouer un buffer DirectX qu'il alimente en software...donc j'ai simplement créé un Bitmap et je ne faisais tout simplement pas appel à DX

    Quoi qu'il en soit tu peux toujours surcharger la DLL comme tu veux...et c'est simple en fait

    tu n'as pas besoin du détail des fonctions que tu ne surcharges pas, car elles sont exportées par nom (et donc par adresse) peu importe la déclaration ce n'est pas elle qui défini le passage des paramètres (sauf dans le cas de fonction manglées mais ce n'est pas le cas de DX).

    et tu colles ta DLL dans le répertoire de l'exe du Jeu

    le plus pénible c'est encore de déclarer toutes les fonctions utilisées par le jeu et que tu ne détournes pas...à la rigueur il faudrait partir sur un programme comme DID qui va extraire les fonctions exposées de la DLL pour créer un wrapper
    Hello,

    Merci beaucoup

    Je ne suis pas certain d'avoir tout compris mais je vais travailler sérieusement là dessus !
    Je te tiens informé si j'y parviens ou pas..

    Salutations,
    Alekhine.

Discussions similaires

  1. [Padakodart] Néophyte informatique sur un projet de jeu vidéo
    Par Padakodart dans le forum Présentations
    Réponses: 2
    Dernier message: 24/11/2019, 20h59
  2. Question sur "Architecture d'un jeu vidéo 3D par Pierre Schwartz"
    Par TocTocKiéLà? dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 01/09/2009, 22h31
  3. [Bénévole] Recherche un programmeur PHP pour site Web sur le monde du jeu vidéo
    Par xcalibure- dans le forum Autres
    Réponses: 0
    Dernier message: 08/06/2009, 00h53
  4. Ecrire du texte sur une fenêtre de Jeu vidéo (OSD)
    Par zenway dans le forum DirectX
    Réponses: 7
    Dernier message: 07/03/2009, 14h06
  5. Question sur Architecture d'un jeu vidéo 3D
    Par Polygon dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 28/10/2007, 12h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo