Partager via


DispatchReadWrite utilisant des E/S tamponnées

Tout pilote de périphérique de niveau inférieur qui configure ses objets d’appareil 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 satisfait à une demande d’écriture en transférant les données du même 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 lors de la réception d’une demande de transfert :

  1. Appelle IoGetCurrentIrpStackLocation et détermine la direction de la demande de transfert.

  2. Vérifie la validité des paramètres de la requête.

    • Pour une demande de lecture, la routine vérifie généralement la valeur du IoStackLocation-Parameters.Read.Length du pilote pour déterminer si le tampon est suffisamment grand pour recevoir les données transférées à partir du périphérique.

      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 à partir de l’appareil et, à tout moment donné, contient un certain nombre de ces structures dans une mémoire tampon d’anneau interne afin de répondre aux demandes de lecture à mesure qu’elles se présentent.

    • Pour une demande d’écriture, la routine vérifie généralement la valeur sur Parameters.Write.Length et vérifie les données à Irp-AssociatedIrp.SystemBuffer> si nécessaire : autrement dit, si son appareil accepte uniquement des paquets de données structurés contenant des membres avec des plages de valeurs définies.

  3. Si des paramètres ne sont pas valides, la routine DispatchReadWrite termine immédiatement l’IRP, comme décrit dans Complétion des IRPs. Sinon, la routine transmet l’IRP pour un traitement ultérieur par d’autres routines de pilotes, comme décrit dans Passage des IRPs vers le bas de la pile des pilotes.

Les pilotes de périphérique de niveau le plus bas qui utilisent des E/S mis 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 celui de l’originateur 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 des données structurées en interne, comme le fait le pilote de classe de clavier système.

Les pilotes qui tamponnent les données en interne doivent prendre en charge les requêtes IRP_MJ_FLUSH_BUFFERS et peuvent également prendre en charge les requêtes IRP_MJ_SHUTDOWN.

Le pilote de niveau le plus élevé d’une chaîne est généralement responsable de la vérification des 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 aux appareils sur les transferts de données, ce pilote est requis pour vérifier la validité des paramètres dans son emplacement de pile d’E/S.