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 :

[Service/Driver] Questions de base


Sujet :

Windows

  1. #1
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut [Service/Driver] Questions de base
    Bonjour,
    Voilà, je suis nouveau dans le devellopement de driver et j'ai quelques questions à vous soumettre :-)
    a titre informatif, j'essais de créer une application qui tourne en RING0, pas un pilote pour périphérique matériel

    - Quel différence précise il y a-t-il entre un service et un driver?

    De ce que j'ai compris (attention à la connerie qui va suivre )
    Le driver est l'executable (avec extention .sys) qui tourne en kernel mode (ring 0)
    Le service est un executable (extention .exe) qui tourne en userland (ring 3) permettant la communication entre le kernel et l'user.

    - Quand le driver est-il chargé?
    Est ce lors du lancement du service (assez tot dans le winlogon) qui charge le driver en mémoire?
    Dans ce cas, ça signifie que le service lors de son chargement est en ring0 (ou du moins fait appel a des fonctions qui sont executée en kernel land) pour pouvoir charger le driver en ram non? (puisque le driver va se charger dans la mémoire haute et que cette même mémoire est "interdite" au ring3

    - Comment communiquer avec le driver depuis le service?
    J'ai lu qu'il fallait utiliser une API I/O mais j'ai pas tout suivi, si quelqun à un code d'exemple documenté ou un lien ou l'autre sur le sujet en français ce serait sympas :-)

    Je précise que j'ai bien évidement la DDK mais que je suis un peu mauvais en anglais et que je ne comprend pas tout (je traduis quand même une petite partie hein )

    - Comment décharger un driver X de la mémoire?
    Je ne parle pas d'un driver que j'ai créer, mais d'un driver présent en ram que je souhaiterai décharger.
    Dois-je désactiver le service associé au driver, désinstaller le service, suprimmer l'exe du service puis suprimmer simplement le fichier sys correspondant au driver? (puis reboot pour que le driver ne soit plus en ram).

    - Comment associer un service à un driver (ou inversément)?

    - Comment situé un driver (connu) dans la ram?

    Voilà, c'est quelques questions que je me pose, je ne demande pas des codes tout fais, mais plutot quelques liens (en français si possible) sur le sujet ou encore des explications des membres motivés :-) (voir des codes d'exemples commenté ^^).

    Amicallement, sloshy
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Citation Envoyé par sloshy
    - Quel différence précise il y a-t-il entre un service et un driver?

    De ce que j'ai compris (attention à la connerie qui va suivre )
    Le driver est l'executable (avec extention .sys) qui tourne en kernel mode (ring 0)
    Le service est un executable (extention .exe) qui tourne en userland (ring 3) permettant la communication entre le kernel et l'user.
    Il existe deux types de service :

    - Les services applicatifs, qui sont des exécutables tournant en user-land ( mode utilisateur / ring3) et dont la seule particularité est de n'avoir aucune interface (pas de console, pas de fenêtre). Il servent parfois de front-end pour un driver.

    - Les services de drivers. Tournent en mode noyau, bien sûr aucune interface. Ils sont là pour gérer un périphérique même si celui ci est virtuel et n'a donc aucune existence physique. Techniquement on doit parler de "pilotes de périphérique" (device drivers) et pas de services.

    La confusion vient du fait que les deux sont gérer via le SCM (Service Control Manager).

    - Quand le driver est-il chargé?
    Est ce lors du lancement du service (assez tot dans le winlogon) qui charge le driver en mémoire?
    Dans ce cas, ça signifie que le service lors de son chargement est en ring0 (ou du moins fait appel a des fonctions qui sont executée en kernel land) pour pouvoir charger le driver en ram non? (puisque le driver va se charger dans la mémoire haute et que cette même mémoire est "interdite" au ring3
    Plusieurs possibilités :

    - SERVICE_BOOT_START : chargé juste après le kernel, très tôt donc, pendant le démarrage de windows.

    - SERVICE_SYSTEM_START : chargé avec SYSTEM.

    - SERVICE_AUTO_START : démarrage avec le SCM.

    - SERVICE_DEMAND_START : driver démarré à la demande.

    Les drivers s'exécutent toujours en ring0.

    - Comment communiquer avec le driver depuis le service?
    J'ai lu qu'il fallait utiliser une API I/O mais j'ai pas tout suivi, si quelqun à un code d'exemple documenté ou un lien ou l'autre sur le sujet en français ce serait sympas :-)

    Je précise que j'ai bien évidement la DDK mais que je suis un peu mauvais en anglais et que je ne comprend pas tout (je traduis quand même une petite partie hein )
    C'est justement la première partie qui bloque les "débutants" en programmation de driver. Comment communiquer avec le driver depuis l'user-land...

    La communication se fait principalement via les IOCTL (I/O Control Code) et les fonctions Ring3 ReadFile() et WriteFile().

    il y a quatre méthodes de communication (champ "Method de l'IOCTL) :

    - METHOD_BUFFERED (0) ; E/S avec tampon.

    - METHOD_IN_DIRECT (1) ; E/S directe (user-land -> kernel land) via MDL.

    - METHOD_OUT_DIRECT (2) ; E/S directe (Kernel land -> user -land) via MDL.

    - METHOD_NEITHER (3) ; E/S sans gestion. (Le buffer user land est passé "comme tel").

    Chaque méthode a ses particularités, ses avantages et ses inconvénients. Difficile à expliquer en peu de mots... le DDK est ton ami

    - Comment décharger un driver X de la mémoire?
    Je ne parle pas d'un driver que j'ai créer, mais d'un driver présent en ram que je souhaiterai décharger.
    Dois-je désactiver le service associé au driver, désinstaller le service, suprimmer l'exe du service puis suprimmer simplement le fichier sys correspondant au driver? (puis reboot pour que le driver ne soit plus en ram).
    Si un driver n'est pas de ta conception, utilise le SCM (panneau de contrôle > services). Si un driver n'est pas listé dans le SCM, ne tente pas de le décharger par toi même. BSOD assuré (un exemple serait de vouloir décharger le driver NTFS... plantage et corruption complet !)

    - Comment associer un service à un driver (ou inversément)?
    Comme on associe un exécutable avec un driver. Puisqu'un service n'est qu'un exécutable sans interface.

    - Comment situé un driver (connu) dans la ram?
    Hmmm, c'est techniquement possible mais ça relève du "hack" (comprendre de la bidouille) en tripotant des structures internes de Windows. En théorie on a jamais besoin de situer un driver en mémoire.

    Sinon on peut assez facilement l'avoir via KD (kernel debugger de microsoft).

    Quel serait pour toi l'utilité d'avoir l'adresse d'un driver ?

  3. #3
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour et merci beaucoup pour ton aide précieuse.
    J'ai entendu parler de driver en user land, des driver vdd (non similaire au vxd de windows 9x), qu'en est il vraiment?
    Il n'y a aucun moyen d'interface graphique pour utiliser le driver?
    Quand je parlais d'association je voulais parler de dépenance (voilà le mots que je cherchais ^^).

    Merci en tout cas pour ses réponses, elles m'aideront beaucoup j'en suis sur
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    J'ai entendu parler de driver en user land, des driver vdd (non similaire au vxd de windows 9x), qu'en est il vraiment?
    Ha oui, c'est exact, j'avais oublié cette catégorie (assez récente). Il s'agit des UMD (User Mode Driver) qu'on programme avec l'UMDF (User Mode Driver FrameWork).

    Je ne pourrais pas t'en dire grand chose, c'est une techno très récente apparue avec Vista et je ne la connais pas....

    c.f : http://www.microsoft.com/whdc/driver/wdf/UMDF.mspx

    Quant aux VDDs (Virtual Device Driver), il s'agit de drivers Kernel chargés d'émuler un composant hardware en software.

    Il n'y a aucun moyen d'interface graphique pour utiliser le driver?
    Quand je parlais d'association je voulais parler de dépenance (voilà le mots que je cherchais ^^).
    [ceci ne s'applique qu'aux drivers en mode noyau, pour les drivers UMD, je ne sais pas...]

    On peut bien sûr créer une interface, mais pas "dans" le driver. Il n'y pas d'interface graphique en mode noyau, donc aucune fonction qui permette d'afficher quoi que ce soit, même pas sur une console.

    L'interface (si on a besoin d'une interface quelconque) se fait en user-land, depuis un programme qui, lui, enverra des IOCTLs (codes de contrôle) vers le driver. On peut programmer l'interface en n'importe quel langage pourvu que l'on ait accès, via le langage choisi, aux APIs Windows.

    Pour simplifier, on peut commander "à distance" le driver depuis l'user-land.

  5. #5
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour et encore une fois, merci de ta réponse,

    Donc je devrais faire:

    Un programme qui contient mon IG en userland avec pour fonction des appel d'API windows à mon service/driver en kernelland c'est bien ça?
    et donc le "question/réponse" s'effectue avec codes de contrôle (IOCTL (I/O Control Code) et les fonctions ReadFile() et WriteFile() (userland)) le tout dans une API que je dois découvrir dans la DDK?

    Existe-t-il de la doc française sur le sujet? (car mon niveau en anglais et bas, et même si j'arrive à traduire, c'est pas toujours fort précis ce qui sors de ma traduction )

    Merci beaucoup encore une fois pour ses infos (que j'ai vraiment eu du mal à trouver ^^)
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  6. #6
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Citation Envoyé par sloshy
    Donc je devrais faire:

    Un programme qui contient mon IG en userland avec pour fonction des appel d'API windows à mon service/driver en kernelland c'est bien ça?
    et donc le "question/réponse" s'effectue avec codes de contrôle (IOCTL (I/O Control Code) et les fonctions ReadFile() et WriteFile() (userland)) le tout dans une API que je dois découvrir dans la DDK?
    Voilà c'est ça. Le programme qui contrôle le driver (Programme dit "SCP" : Service control Program) s'écrit comme un programme "normal", avec le SDK.

    Dans le cadre d'un SCP, on utilise juste des APIs nécessaires aux services, comme OpenSCManager(), CreateService(), OpenService(), DeviceIoControl(), etc.

    Si on utilise pas de SCP, il faut passer par le registre.

    Pour le driver, tout est contenu et documenté dans le DDK.

    Existe-t-il de la doc française sur le sujet? (car mon niveau en anglais et bas, et même si j'arrive à traduire, c'est pas toujours fort précis ce qui sors de ma traduction )
    A ma connaissance, non. Les meilleurs endroits sont :

    - La doc du DDK.
    - Le site de Microsoft (WHDC : Windows Hardware Devlopper Cental) :
    http://www.microsoft.com/whdc/default.mspx
    - OSR Online (communauté anglophone des développeurs de drivers) : http://www.osronline.com/

    Pour commencer, regarde les documentations sur le WHDC (menu "xxx Fundamentals") qui sont plutôt bien faites pour commencer.

    Il faut tout de même avoir un bon background du SDK et de certains mécanismes de Windows pour développer des drivers (Qu'est-ce qu'une IRP, une IRQL, une interruption, comment est gérer la mémoire, etc.). Tu trouvera la réponse à ces questions dans les documentations. La doc du DDK est vraiment bien faites, mais très touffues. Essaye de combiner avec les docs du WHDC.

    Quant au problème de langue, y'a rien à faire. Ca sera anglais ou rien malheureusement...

  7. #7
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour,

    je te remercie encore beaucoup pour toute cette précieuse aide
    Je vais essayer d'avancer dans mon driver, mais je pense que j'aurais encore des questions

    Au fait, pour situer la place d'un driver en ram je parlais d'une méthode de programmation
    Au fait, quand un driver (ou n'importe quoi) est chargé en ram, c'est un bloc continu ou bien il y a aussi fragmentation?

    Au fait, petite contribution pour tous les autres anglophobe qui recherche des infos sur les drivers en français:

    http://neitsabes.free.fr/ASM/KMD/kmd01.html
    http://neitsabes.free.fr/ASM/KMD/kmd02.html
    http://neitsabes.free.fr/ASM/KMD/kmd03.html
    http://neitsabes.free.fr/ASM/KMD/kmd04.html

    Les quatres pages ce suivent mais il n'y a pas de liens pour passer de l'une à l'autre (du coup je mets les 4 disponibles).
    Il y a parfois un mots qui manque mais on peux comprendre assez rapidement :-)

    voilà voilà,
    amicallement, sloshy
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  8. #8
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Au fait, quand un driver (ou n'importe quoi) est chargé en ram, c'est un bloc continu ou bien il y a aussi fragmentation?
    Les pages sont généralement continues pour un exécutable, mais il ne vaut mieux pas se reposer sur ce phénomène. C'est l'O.S qui gère la mémoire et il le fait comme il l'entend...

    Pour un driver, certaines partie du fichier exécutable ne restent pas en mémoire, elles sont "discardable".


    Au fait, petite contribution pour tous les autres anglophobe qui recherche des infos sur les drivers en français:

    http://neitsabes.free.fr/ASM/KMD/kmd01.html
    ...
    Houla Ce sont de vieilles pages que j'ai écrites et qui sont destinées avant tout aux programmeurs en assembleur. Mais y'a peut être deux trois infos à glaner pour les programmeurs HLL.

    L'index est là : http://neitsabes.online.fr/ASM/KMD/KMDindex.htm

    J'ai jamais eu le courage d'aller plus loin que 4 tuts.

    Ceci dit, ces pages ont un risque accru d'effacement, étant donné que je vais refaire ce site quand j'aurais un petit peu de temps disponible... Mais je ne désespère pas de faire quelques papiers pour la programmation de drivers en C...

  9. #9
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Ha comme quoi
    Je vais donc telecharger ses pages sur mon PC.
    Même si c'est pour masm les appels au api sont les mêmes je supose (et la logique aussi ^^)

    Sinon bonne chance pour ton site
    Je pense que je vais enfin mettre le sujet en resolu on sais jamais

    amicallement, sloshy
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  10. #10
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonsoir,
    Excuse-moi mais une question me taraude depuis un petit moment.
    En kernel-land aurais-je droit au API windows et au librairie de base du C (qui elle sont en ring3 si j'ai bien tout suivi ...)

    C'est peut être bete mais ça me taraude ...
    Merci,

    amicallement, sloshy
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si j'ai bien compris, NON, tu n'as pas droit à l'API Win32, car le sous-système Win32 est "au-dessus".
    La C Run-Time Library (CRT), à mon avis il ne faut pas trop y compter pour les mêmes raisons, à part peut-être pour les fonctions de string.h en liaison statique...

    Par contre, tu as droit à l'API native: Les fonctions de NTDLL.DLL, sur lesquelles reposent toutes les autres.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour et merci de ta réponse,

    C'est genial l'api native n'étant pas documentée de maniere officiele, je vais encore galerer pour faire mes fonctions
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20
  2. Réponses: 4
    Dernier message: 20/11/2005, 21h46
  3. question de base
    Par tuxedo dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/04/2005, 15h28
  4. [Débutant] Question de base sur le BDE et les SGBD
    Par Invité dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/03/2005, 08h45
  5. Question de base
    Par xinu1.1 dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 03/02/2005, 22h14

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