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

Windows Discussion :

Savoir si une instance utilisant DirectX a été lancée


Sujet :

Windows

  1. #1
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut Savoir si une instance utilisant DirectX a été lancée
    Bonjour à tous,

    je suis assez débutant dans ce domaine alors n'hésitez pas à me corriger si je dis trop d'âneries ...

    Mon objectif est d'essayer d'afficher des informations personnalisées dans toute application utilisant DirectX.

    Je cherche donc le moyen de savoir quelles sont les applications DirectX lancées dans mon système (ou savoir quand elles sont lancées). L'idée va donc être de pouvoir écouter les applications qui vont faire l'usage de DirectX (via du Hook d'API probablement).

    Avez-vous des pistes ?

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Pas besoin d'API hooking. Pour savoir si une application utilise DX, il suffit d'énumérer tous le modules qu'elle a chargé et voir s'il y a une DLL de DX parmi. Voir dans la FAQ comment énumérer les modules chargés par un processus.

  3. #3
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Merci Melem, mais je souhaite que mon application qui tourne soit alertée par toute application utilisant des fonctions directX.

    Mais pour un départ, est-ce lourd de lister tous les modules de toutes les appli tournants ? (le but étant de ne pas trop altérer le FPS dans les jeux videos)

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Enumérer les modules d'un processus n'affecte pas le fonctionnement du processus. Si tu veux que ton application soit alertée de la création d'une application utilisant DX, il faut commencer par hooker les fins d'initialisation de processus (et ensuite énumérer ses modules ...). C'est cependant un peu compliqué alors je te propose une autre solution, moins élégante, mais en tout cas ça marche :

    - Tu hookes la création de fenêtre, c'est-à-dire le message WM_CREATE. Hooker un message est facile et bien documenté.

    - Sur interception d'un WM_CREATE, tu récupères le handle de la fenêtre nouvellement créée. Avec la fonction GetWindowThreadProcessId, tu récupères ensuite le handle du processus ayant créé cette fenêtre.

    - Si c'est un nouveau processus (c'est-à-dire un processus qu'on n'a pas ncore examiné), énumérer ses modules.

  5. #5
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Merci Melem pour ton aide, je vais me renseigner sur tout ça

  6. #6
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Après un travail intensif, je suis parvenu à enumerer les modules des processus des fenetres qui se créent.

    J'utilise pour cela un module de hook global que j'ai écris (avec l'inspiration Google) en C++ qui repere l'ouverture des nouvelles fenetres.

    Avec un launcher en VB.net, j'arrive à énumerer les différents modules des process attachés aux nouvelles fenetres qui s'ouvrent. J'arrive même à repérer les dll d3d9 / d3d10 / d3d11.

    Malheureusement je suis bloqué à ce point. J'aimerais par exemple afficher un triangle ou un texte dans toute application directX.

    Merci d'avance pour votre aide.

  7. #7
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Et c'est quoi le problème ? Si on te donne un hwnd par exemple, tu sais dessiner là-dedans ou pas ?

  8. #8
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Et bien j'arrive a afficher en plein ecran un triangle directx via vb.net.
    Le pb est que je ne comprends pas trop ce que je dois faire à présent.

    Surtout comment injecter mon device Triangle dans une application utilisant directX.

    Faut-il que je hook la fonction de création de Device de DirectX ?

    Le Handle serait celui de la dll directX à utiliser ?

  9. #9
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Melem Voir le message
    Si on te donne un hwnd par exemple, tu sais dessiner là-dedans ou pas ?

  10. #10
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Salut Melem,

    oui, jarrive à dessiner dans un handle tant que celui ci reste en windows form et qu'il n'y a pas d'instance directX utilisée.

  11. #11
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Ou la la ... je te demande juste si tu peux compéter cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DrawInWindowUsingDX(HWND hwnd)
    {
        // Que mettrais-tu ici ?
    }
    Tu n'as pas besoin de te demander d'où vient le hwnd, on te demande juste de dessiner là-dedans. Ce que tu as à faire c'est faire les initialisations nécessaires (création et Device et co.), créer une boucle qui tourne tant que tu veux dessiner, dessiner, et à la sortie de la boucle, détruire ce qu'il faut détruire.

  12. #12
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Ah je vais essayer ca melem, merci encore de ton assistance.

  13. #13
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    J'ai amélioré ma classe me permettant de créer un triangle via du managedDirectX car classe écrite en vb.net.

    Je peux instancier ma classe avec n'importe quel handle. J'arrive à dessiner dedans.

    Pour info, voici le code de ma classe ( mon constructeur peut prendre un handle comme argument )

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    Imports System
    Imports System.Drawing
    Imports System.Collections
    Imports System.ComponentModel
    Imports System.Windows.Forms
    Imports System.Data
    Imports Microsoft.DirectX
    Imports Microsoft.DirectX.Direct3D
     
    PublicClass d3dInjection
    Inherits System.Windows.Forms.Form
    Private hHandle AsLong
    PrivateWithEvents device As Device
    Private vertices As VertexBuffer
    'Le device a t il t perdu et non-reinitialis?
    Private deviceLost AsBoolean = False
     
    Private pres As PresentParameters = New PresentParameters()
     
     
    'boucle du jeu
    PublicSubNew(OptionalByVal hwnd AsLong = 0)
    If hwnd > 0 Then
    hHandle = hwnd
    Else
    hHandle = Me.Handle
    EndIf
    Me.InitializeGraphics()
    Me.Show()
    WhileMe.Created
    Me.Render()
    Application.DoEvents()
    EndWhile
    Me.DisposeGraphics()
    EndSub
     
    ProtectedFunction InitializeGraphics() AsBoolean
    pres.Windowed = True
    pres.SwapEffect = SwapEffect.Discard
     
    device = New Device(0, DeviceType.Hardware, hHandle, CreateFlags.SoftwareVertexProcessing, pres)
    vertices = CreateVertexBuffer(device)
    'Fait la configuration initiale de nos objets graphiques
    SetupDevice()
    ReturnTrue
    EndFunction
    ProtectedFunction CreateVertexBuffer(ByVal device As Device) As VertexBuffer
    device.VertexFormat = CustomVertex.TransformedColored.Format
     
    Dim verts As CustomVertex.TransformedColored() = New CustomVertex.TransformedColored(2) {}
     
    verts(0) = New CustomVertex.TransformedColored(Me.Width / 2, Me.Height / 4, 0.5F, 1, Color.Blue.ToArgb())
    verts(1) = New CustomVertex.TransformedColored(Me.Width * 3 / 4, Me.Height * 3 / 4, 0.5F, 1, Color.Green.ToArgb())
    verts(2) = New CustomVertex.TransformedColored(Me.Width / 4, Me.Height * 3 / 4, 0.5F, 1, Color.Red.ToArgb())
     
    Dim buf AsNew VertexBuffer(GetType(CustomVertex.TransformedColored), verts.Length, device, 0, CustomVertex.TransformedColored.Format, Pool.[Default])
     
    Dim stm As GraphicsStream = buf.Lock(0, 0, 0)
    stm.Write(verts)
    buf.Unlock()
     
    Return buf
    EndFunction
    ProtectedSub Render()
    If deviceLost Then
    ' Tente de reprendre le device
    AttemptRecovery()
    EndIf
     
    ' Si le device n'a pas pu tre rcupr, n'essaye pas de faire le rendu
    If deviceLost Then
    ExitSub
    EndIf
     
     
    ' Paint la surface en noir partout
    device.Clear(ClearFlags.Target, Color.Black, 1.0F, 0)
    device.BeginScene()
     
    ' Appels aux mthodes de dessin ici
    device.SetStreamSource(0, vertices, 0)
    device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1)
    device.EndScene()
    Try
    ' Copie le back buffer l'cran
    device.Present()
    Catch generatedExceptionName As DeviceLostException
    ' Indique que le device est perdu
    deviceLost = True
    ' Affiche un message dans la fentre du dbugger
    Debug.WriteLine("Device was lost")
    EndTry
    EndSub
     
    ProtectedSub AttemptRecovery()
    Try
    device.TestCooperativeLevel()
    Catch generatedExceptionName As DeviceLostException
    Catch generatedExceptionName As DeviceNotResetException
    Try
    device.Reset(pres)
    deviceLost = False
     
    ' Affiche un message dans la fentre du dbugger
    Debug.WriteLine("Device successfully reset")
    Catch generatedExceptionName1 As DeviceLostException
    ' Si il est toujours perdu ou qu'il a encore t perdu
    ' ne fais rien
    EndTry
    EndTry
    EndSub
     
    ProtectedSub DisposeGraphics()
    device.Dispose()
    EndSub
    PrivateSub device_DeviceResizing(ByVal sender AsObject, ByVal e As System.ComponentModel.CancelEventArgs) Handles device.DeviceResizing
    e.Cancel = True
    EndSub
    PrivateSub device_DeviceReset(ByVal sender AsObject, ByVal e As System.EventArgs) Handles device.DeviceReset
    SetupDevice()
    EndSub
    PrivateSub device_DeviceLost(ByVal sender AsObject, ByVal e As System.EventArgs) Handles device.DeviceLost
    vertices.Dispose()
    EndSub
    ProtectedSub SetupDevice()
    'Configure les "RenderStates" du device
    device.RenderState.Lighting = False
    device.RenderState.CullMode = Cull.None
     
    'Cre le VertexBuffer
    vertices = CreateVertexBuffer(device)
    EndSub
    
    EndClass
    

  14. #14
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Cette fonction pose des pbs aux applications. En plein écran cela ne fonctionne pas. Dans une application fenêtrée non directX, le code s'injecte correctement dans la fenêtre. Dans une application fenetrée directX, le directX original clignote avec ma fonction directX injectée.

    Malheureusement ce résultat est inexploitable pour moi. Je dois parvenir à injecter mon code dans la mémoire au meme moment que l'application que je cible. C'est là que je suis bloqué. Quelques recherches sur le web, m'ont permis de voir quelques notion de la PE et de la IAT. Faut-il que je passe par cette solution ? Y a t il de meilleures idées ?

  15. #15
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Dans une application fenetrée directX, le directX original clignote avec ma fonction directX injectée.
    Normal il y a deux boucles de dessin (celle de l'application et la tienne) quand même ...

    Malheureusement ce résultat est inexploitable pour moi. Je dois parvenir à injecter mon code dans la mémoire au meme moment que l'application que je cible. C'est là que je suis bloqué. Quelques recherches sur le web, m'ont permis de voir quelques notion de la PE et de la IAT. Faut-il que je passe par cette solution ? Y a t il de meilleures idées ?
    Oui. Il faut donc hooker les fonctions de type SwapChain.Present et à chaque interception, dessiner ton triangle avant d'effectivement appeler la fonction.

  16. #16
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Citation Envoyé par Melem Voir le message
    Normal il y a deux boucles de dessin (celle de l'application et la tienne) quand même ...
    Je m'en doutais mais j'expliquais juste les résultats que j'avais obtenu. (aussi je débute totalement dans ce type de programmation)

    Malheureusement, après pas mal de recherches je suis bloqué au point de hooker les fonctions de type SwapChain.Present. Je ne vois pas du tout comment réaliser ceci.

    Si tu as des tutoriaux, ou des cours à propos de cela, je suis preneur.

    Merci

  17. #17
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Je n'ai pas de tutoriel à te proposer mais tu n'as qu'à rechercher sur google avec le thème API Hooking, en favorisant la technique IAT Patching. Cherche avant des libs directement utilisables plutôt que des tutos, il doit y en avoir pas mal. Je te laisse le soin de faire cette recherche .

  18. #18
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Merci beaucoup Melem

Discussions similaires

  1. [C#] savoir si un processus utilise DirectX
    Par Cyrill26 dans le forum DirectX
    Réponses: 6
    Dernier message: 03/07/2008, 19h59
  2. Réponses: 9
    Dernier message: 01/07/2008, 14h52
  3. [C#] savoir si un processus utilise DirectX
    Par Cyrill26 dans le forum C#
    Réponses: 6
    Dernier message: 27/06/2008, 14h04
  4. Réponses: 4
    Dernier message: 03/05/2008, 09h56
  5. Détecter si une instance du programme est déjà lancée
    Par ghassen_73 dans le forum Langage
    Réponses: 1
    Dernier message: 15/03/2008, 15h52

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