Concepts WDM pour les pilotes WDF
Windows Driver Frameworks (WDF) est un wrapper autour des interfaces WDM (Microsoft Windows Driver Model). Bien que l’infrastructure simplifie de nombreux concepts WDM et en masque complètement d’autres afin que vous n’ayez pas à les utiliser, vous devez toujours comprendre certains des concepts de base des pilotes WDM. Plus précisément, vous devez comprendre les types de pilotes, les piles de pilotes, les piles de périphériques et les paquets de demandes d’E/S.
Types de pilotes
Les pilotes Windows sont divisés en trois types : les pilotes de bus, les pilotesde fonction et les pilotesde filtre. Les pilotes de bus prennent en charge les bus d’E/S en détectant les appareils enfants connectés à un bus parent et en signalant leurs caractéristiques. (Cette activité est appelée énumération de bus.) Les pilotes de fonction contrôlent les opérations d’E/S pour les appareils et les bus. Les pilotes de filtre reçoivent, examinent et modifient éventuellement les données qui circulent entre les applications utilisateur et les pilotes, ou entre des pilotes individuels.
Les pilotes pour les bus sont essentiellement des pilotes de fonction qui énumèrent également les enfants. Un pilote agit comme un « pilote de bus » lorsqu’il énumère les appareils enfants d’un bus. Sinon, le même pilote agit comme « pilote de fonction » pour le bus lorsqu’il gère les opérations d’E/S qui accèdent au matériel de l’adaptateur de bus.
Un pilote UMDF (User-Mode Driver Framework) ne peut pas être un pilote de bus.
Piles de pilotes
Dans le système d’exploitation Windows, les pilotes WDM sont superposés dans une séquence d’appels verticaux appelée pile de pilotes. Le pilote le plus haut de la pile reçoit généralement les demandes d’E/S des applications utilisateur, une fois que les demandes ont transité par le gestionnaire d’E/S du système d’exploitation. Les couches de pilotes inférieures communiquent généralement avec le matériel informatique.
Une pile de pilotes simple comprend un pilote de bus en bas de la pile, qui gère les opérations d’E/S spécifiques au bus et énumère les périphériques enfants qui y sont connectés. En règle générale, un ou plusieurs pilotes de fonction spécifiques à l’appareil se trouvent au-dessus du pilote de bus. Ces pilotes de fonction gèrent les opérations d’E/S sur les appareils connectés au bus. Les pilotes de filtre peuvent se trouver au-dessus des pilotes de fonction ou se trouver entre un pilote de bus et un pilote de fonction. Un système en cours d’exécution a plusieurs piles de pilotes qui prennent en charge différents types d’appareils.
Piles d’appareils
Chaque pile de pilotes prend en charge une ou plusieurs piles d’appareils. Une pile d’appareils est un ensemble d’objets d’appareil créés à partir de structures DEVICE_OBJECT définies par WDM. Chaque pile d’appareils représente un appareil. Chaque pilote crée un objet d’appareil pour chacun de ses appareils et attache chaque objet d’appareil à une pile d’appareils. Les piles d’appareils sont créées et supprimées lorsque les appareils sont branchés et débranchés, et chaque fois que le système est redémarré.
Lorsqu’un pilote de bus détecte que des appareils enfants ont été branchés ou débranchés, il en informe le gestionnaire Plug-and-Play (PnP). En réponse, le gestionnaire PnP demande au pilote de bus de créer un objet de périphérique physique (PDO) pour chaque appareil enfant connecté au périphérique parent (c’est-à-dire, le bus). Le PDO devient le bas d’une pile d’appareils.
Ensuite, le gestionnaire PnP charge les pilotes de fonction et de filtre pour prendre en charge chaque appareil (s’ils ne sont pas déjà chargés), puis le gestionnaire PnP appelle ces pilotes afin que chacun puisse créer un objet d’appareil et l’ajouter en haut de la pile d’appareils. Les pilotes de fonction créent des objets d’appareil fonctionnels (FDO) et les pilotes de filtre créent des objets de périphérique de filtre (DO de filtre).
Lorsque le gestionnaire d’E/S envoie une demande d’E/S aux pilotes d’un appareil, il transmet la demande au pilote qui a créé l’objet d’appareil le plus haut dans la pile d’appareils. Si ce pilote demande au gestionnaire d’E/S de transmettre la demande au pilote inférieur suivant, le gestionnaire d’E/S utilise la pile de périphériques pour déterminer le pilote inférieur suivant. (Le pilote suivant est le pilote qui a créé l’objet d’appareil inférieur suivant.)
WDF crée un objet d’appareil framework pour chaque objet d’appareil WDM. Les pilotes basés sur l’infrastructure accèdent à ces objets d’appareil framework au lieu d’objets d’appareil WDM.
Paquets de demandes d’E/S
Le gestionnaire d’E/S envoie les demandes d’E/S d’une application aux pilotes en créant des paquets de demandes d’E/S (IRPs). Un IRP peut contenir une demande d’exécution d’une opération d’E/S (telle qu’une opération de lecture/écriture) ou une demande d’exécution d’une action de contrôle d’E/S (IOCTL) (par exemple, le retour d’status). En outre, le gestionnaire PnP crée des IRP qui représentent les opérations PnP et de gestion de l’alimentation que les pilotes doivent effectuer, et il envoie ces IRP aux pilotes.
En règle générale, le gestionnaire d’E/S crée un IRP en lecture ou en écriture lorsqu’une application utilisateur demande une opération de lecture ou d’écriture. Le gestionnaire d’E/S transmet l’IRP au pilote en haut de la pile de pilotes, et ce pilote prend en charge la demande ou transmet la demande au pilote inférieur suivant. Certaines demandes sont acheminées vers le bas de la pile, et d’autres sont entièrement traitées par des pilotes de niveau supérieur.
Chaque fois qu’un pilote reçoit un IRP, il reçoit également un pointeur vers l’objet d’appareil qui représente l’appareil qui doit gérer l’opération. Par conséquent, les pilotes d’une pile de pilotes utilisent des objets d’appareil pour déterminer les appareils connectés auxquels une demande particulière est censée accéder.
Les pilotes WDF n’accèdent généralement pas directement aux IRPs. L’infrastructure convertit les IRP WDM qui représentent les opérations de contrôle d’E/S de lecture, d’écriture et d’appareil en objets de demande d’infrastructure qui Kernel-Mode driver Framework (KMDF) et les pilotes UMDF reçoivent dans les files d’attente d’E/S. L’infrastructure gère les IIP PnP et de gestion de l’alimentation en interne et utilise des fonctions de rappel d’événements pour informer le pilote des événements PnP et d’alimentation.