DispatchReadWrite à l’aide d’E/S mises en mémoire tampon
Tout pilote de périphérique de niveau inférieur qui configure ses objets de périphérique pour les E/S mises en mémoire tampon répond à une demande de lecture en retournant les données transférées de son appareil dans une mémoire tampon d’espace système verrouillée sur Irp-AssociatedIrp.SystemBuffer>. Il répond à une demande d’écriture en transférant des données de la même mémoire tampon vers son appareil.
Par conséquent, la routine DispatchReadWrite d’un tel pilote de périphérique effectue généralement les opérations suivantes à la réception d’une demande de transfert :
Appelle IoGetCurrentIrpStackLocation et détermine la direction de la demande de transfert.
Vérifie la validité des paramètres de la demande.
Pour une demande de lecture, la routine vérifie généralement la valeur IoStackLocation-Parameters.Read.Length> du pilote pour déterminer si la mémoire tampon est suffisamment grande pour recevoir des données transférées à partir de l’appareil.
Par exemple, le pilote de classe de clavier système traite les demandes de lecture qui proviennent uniquement du thread d’entrée utilisateur Win32. Ce pilote définit une structure, KEYBOARD_INPUT_DATA, dans laquelle stocker les séquences de touches de l’appareil et, à un moment donné, conserve un certain nombre de ces structures dans une mémoire tampon en anneau interne afin de satisfaire les demandes de lecture au fur et à mesure qu’elles arrivent.
Pour une demande d’écriture, la routine vérifie généralement la valeur dans Parameters.Write.Length et vérifie la validité des données sur Irp-AssociatedIrp.SystemBuffer si nécessaire , c’est-à-dire> si son appareil accepte uniquement des paquets de données structurés contenant des membres avec des plages de valeurs définies.
Si l’un des paramètres n’est pas valide, la routine DispatchReadWrite termine immédiatement l’IRP, comme décrit dans Terminer les irps. Dans le cas contraire, la routine transmet l’IRP pour un traitement ultérieur par d’autres routines de pilotes, comme décrit dans Passer des IRP dans la pile des pilotes.
Les pilotes de périphériques de niveau inférieur qui utilisent des E/S mises en mémoire tampon doivent généralement satisfaire une demande de transfert en lisant ou en écrivant des données d’une taille spécifiée par l’auteur de la demande. Un tel pilote est susceptible de définir une structure pour les données provenant ou envoyées à son appareil et est susceptible de mettre en mémoire tampon les données structurées en interne, comme le fait le pilote de classe clavier système.
Les pilotes qui devront mettre en mémoire tampon les données en interne doivent prendre en charge les requêtes IRP_MJ_FLUSH_BUFFERS et peuvent également prendre en charge les demandes de IRP_MJ_SHUTDOWN .
Le pilote de niveau le plus élevé d’une chaîne est généralement chargé de vérifier les paramètres de l’IRP d’entrée avant de transmettre une demande de lecture/écriture aux pilotes inférieurs. Par conséquent, de nombreux pilotes de niveau inférieur peuvent supposer que leurs emplacements de pile d’E/S dans un IRP en lecture/écriture ont des paramètres valides. Si un pilote de niveau le plus bas d’une chaîne est conscient des contraintes spécifiques au périphérique sur les transferts de données, ce pilote doit case activée la validité des paramètres dans son emplacement de pile d’E/S.