Écriture d’un minidriver Stream
L’objectif de conception main du pilote de classe de flux est de gérer le travail de gestion du système d’exploitation, qui comprend les subtilités de la prise en charge des machines multiprocesseurs et de la prise en charge de la sémantique de diffusion en continu du noyau. Il nécessite que le minidriver gère uniquement la partie spécifique de l’appareil de toute opération qu’il doit effectuer. Le pilote de classe alloue de la mémoire pour le minidriver, effectue la comptabilité pour toutes les ressources du noyau NT dont le minidriver peut avoir besoin et (éventuellement) gère tous les problèmes de synchronisation.
Le pilote de classe communique avec le minidriver par le biais d’un ensemble de rappels fournis par minidriver. La plupart du travail d’écriture d’un minidriver de streaming se produit lors de l’écriture de ces rappels.
Dans cette documentation, nous faisons référence à chaque type de routines fournies par minidriver en tant que StrMiniXxx. Le minidriver peut devoir fournir une ou plusieurs versions de chaque routine, en fonction du nombre de fonctions différentes que le matériel sous-jacent est capable d’effectuer.
Un pilote de streaming peut généralement prendre en charge plusieurs flux de données différents. Par exemple, un lecteur DVD produit un flux audio et vidéo. Dans le contexte de la diffusion en continu du noyau, chaque flux de données est représenté par une broche.
Le pilote de classe de flux effectue le suivi de chaque broche sur le minidriver. Dans la terminologie du pilote de classe, chaque type de broche est un flux. Les flux, comme les types de broches, peuvent avoir plusieurs instances. Étant donné que les flux peuvent recevoir des demandes d’E/S, le pilote doit fournir des rappels pour chaque flux.
Voici les routines que le minidriver peut avoir à fournir. Ils sont documentés plus en détail ci-dessous et dans le guide de référence.
Routines que chaque minidriver fournit
Routines que le minidriver fournit pour chaque flux individuel
StrMiniReceiveStreamDataPacket
StrMiniReceiveStreamControlPacket
Il est possible pour le minidriver d’utiliser le même rappel pour plusieurs flux différents. Le rappel peut déterminer le flux pour le compte duquel il a été appelé à partir de ses paramètres.
Comme tous les pilotes WDM, le minidriver doit également fournir une routine DriverEntry . La main tâche de la routine DriverEntry d’un minidriver consiste à inscrire le minidriver auprès du pilote de classe.
Le pilote de classe reçoit toutes les demandes d’E/S au nom du minidriver. Pour obtenir les informations dont il a besoin pour effectuer la demande, le pilote de classe génère un bloc de demande de flux (SRB) et le transmet à l’une des routines de paquets StrMiniXXX. Le pilote de classe distribue les demandes d’E/S à l’ensemble de l’appareil à la routine StrMiniReceiveDevicePacket . Il transmet les requêtes à des flux individuels à StrMiniReceiveStreamDataPacket (pour les demandes de lecture et d’écriture en streaming du noyau) ou à StrMiniReceiveStreamControlPacket (pour d’autres demandes).
Normalement, le pilote de classe met en file d’attente ses demandes et les transmet une par une au minidriver. Le minidriver peut éventuellement effectuer sa propre synchronisation ; le minidriver est alors responsable de la mise en file d’attente qu’il ne peut pas gérer immédiatement. Pour plus d’informations, consultez Synchronisation de Minidriver .
Le minidriver doit fournir deux routines supplémentaires pour manipuler les blocs de demande de flux. Le pilote de classe appelle StrMiniCancelPacket lorsqu’il reçoit un IRP d’annulation et doit indiquer au minidriver d’annuler un paquet spécifique. Le pilote de classe effectue également le suivi du temps nécessaire au minidriver pour terminer sa gestion d’un bloc de demande de flux. Si le minidriver prend trop de temps, le pilote de classe expire la demande et appelle la routine StrMiniRequestTimeout du minidriver.
Lorsqu’une interruption matérielle se produit, le système d’exploitation signale le pilote de classe, qui appelle ensuite la routine StrMiniInterrupt du minidriver pour gérer l’interruption.