Partager via


DispatchReadWrite utilisant des E/S directes

Tout pilote de périphérique de niveau inférieur qui configure ses objets d’appareil pour les E/S directes satisfait à une demande de lecture en retournant les données transférées de son appareil à la mémoire physique système, qui est décrite par le MDL à Irp-MdlAddress>. Il satisfait à une demande d’écriture en transférant les données de la mémoire physique système vers son appareil.

Les pilotes de niveau inférieur doivent gérer les demandes de lecture/écriture de manière asynchrone. Par conséquent, chaque routine DispatchReadWrite du pilote de niveau inférieur doit transmettre les IRPs IRP_MJ_READ et IRP_MJ_WRITE avec des paramètres valides à d'autres routines de pilote, comme décrit dans Passage des IRPs dans la pile de pilotes.

Pour les IRP en lecture/écriture envoyés aux pilotes de niveau inférieur, la mémoire physique paginée décrite par le MDL à Irp-MdlAddress> a déjà été sondée pour obtenir les droits d’accès corrects pour effectuer le transfert demandé et a déjà été verrouillée par le pilote de niveau supérieur dans la chaîne ou par le gestionnaire d'entrées/sorties. Tout pilote intermédiaire ou de niveau le plus bas qui configure ses objets d’appareil pour les E/S directes ne doit pas appeler MmProbeAndLockPages , car cela a déjà été fait. Un pilote de niveau le plus bas appelle MmGetSystemAddressForMdlSafe. (Les pilotes pour Windows 98 appellent MmGetSystemAddressForMdl à la place. Les pilotes pour Windows Me, Windows 2000 et versions ultérieures de Windows doivent utiliser MmGetSystemAddressForMdlSafe.)

Toute routine DispatchReadWrite du pilote de périphérique intermédiaire ou de niveau inférieur doit valider les paramètres dans son emplacement de pile d’E/S des IRP en lecture/écriture s’il ne peut pas approuver un pilote de niveau supérieur pour transmettre uniquement les irPs avec des paramètres valides. Si la routine DispatchReadWrite trouve une erreur de paramètre, elle doit terminer l’IRP avec une erreur appropriée STATUS_ valeurXXX , comme décrit déjà dans l’exécution des irps. Si les paramètres sont valides, la routine DispatchReadWrite d’un pilote intermédiaire doit transmettre la demande pour un traitement ultérieur, conformément aux instructions de DispatchReadWrite dans Higher-Level Drivers.

La routine DispatchReadWrite d’un pilote de périphérique de niveau le plus bas doit appeler IoMarkIrpPending avec la demande de transfert, transmettre l’IRP pour un traitement ultérieur par d’autres routines de pilotes et retourner STATUS_PENDING, comme décrit dans Le passage d’IRPs vers le bas de la pile des pilotes.

Notez qu’une routine DispatchReadWrite d’un pilote de périphérique peut contrôler l’ordre dans lequel les irps sont mis en file d’attente vers son appareil pour accélérer le débit d’E/S en appelant IoStartPacket avec une valeur clé déterminée par le pilote. Une autre routine dans le pilote met en file d’attente l’IRP ultérieurement, détermine si la longueur demandée doit être divisée en opérations de transfert partiel et programme l’appareil pour transférer des données.

En général, un pilote de périphérique qui doit fractionner les demandes de transfert volumineuses pour répondre aux limitations de son appareil doit reporter ces opérations jusqu’à juste avant de configurer l’appareil pour une demande de transfert donnée. La routine DispatchReadWrite d'un pilote de périphérique ne doit pas vérifier l'emplacement de la pile d'E/S des IRP entrants pour des contraintes de transfert spécifiques à l'appareil, ni tenter de calculer des plages de transfert partielles. Ces vérifications peuvent être reportées et effectuées juste avant que son programme StartIo (ou une autre routine de pilote) configure l'appareil en vue d'une opération de transfert.