DispatchReadWrite à l’aide d’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 vers la mémoire physique système, qui est décrite par le MDL sur Irp-MdlAddress>. Il répond à une demande d’écriture en transférant des 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, la routine DispatchReadWrite de chaque pilote de niveau inférieur doit passer IRP_MJ_READ et IRP_MJ_WRITE IRP avec des paramètres valides à d’autres routines de pilote, comme décrit dans Passer des IRP dans la pile des pilotes.
Pour les runtimes d’intégration en lecture/écriture envoyés aux pilotes de niveau inférieur, la mémoire physique paginée décrite par le MDL sur Irp-MdlAddress> a déjà été sondée pour obtenir les droits d’accès appropriés pour effectuer le transfert demandé et a déjà été verrouillée par le pilote de niveau le plus élevé de la chaîne ou par le gestionnaire d’E/S. Tout pilote intermédiaire ou de niveau inférieur qui configure ses objets de périphérique pour les E/S directes ne doit pas appeler MmProbeAndLockPages , car cette opération a déjà été effectuée. Un pilote de niveau inférieur appelle MmGetSystemAddressForMdlSafe. (Les pilotes pour Windows 98 appellent à la place MmGetSystemAddressForMdl . Les pilotes pour Windows Me, Windows 2000 et versions ultérieures de Windows doivent utiliser MmGetSystemAddressForMdlSafe.)
La routine DispatchReadWrite d’un 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 faire confiance à un pilote de niveau supérieur pour transmettre uniquement les IRP avec des paramètres valides. Si la routine DispatchReadWrite trouve une erreur de paramètre, elle doit terminer l’IRP avec une valeur d’erreur appropriée STATUS_XXX , comme décrit dans Terminer les 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 Pilotes.
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 pilote et retourner STATUS_PENDING, comme décrit dans Passer des irps dans la pile des pilotes.
Notez que la 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 un débit d’E/S plus rapide en appelant IoStartPacket avec une valeur de clé déterminée par le pilote. Une autre routine dans le pilote supprime l’IRP ultérieurement, détermine si la longueur demandée doit être fractionné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 en fonction des limitations de son appareil doit reporter ces opérations jusqu’à ce que juste avant de configurer l’appareil pour une demande de transfert donnée. La routine DispatchReadWrite d’un tel pilote de périphérique ne doit pas case activée l’emplacement de la pile d’E/S des IRP entrantes pour les contraintes de transfert spécifiques au périphérique, ni tenter de calculer les plages de transfert partielles, lorsque le pilote peut reporter ces vérifications jusqu’à ce que son StartIo (ou une autre routine de pilote) programme l’appareil pour une opération de transfert.