Gestion des transferts de manière asynchrone
À l’exception des pilotes de niveau supérieur, tous les pilotes gèrent les requêtes IRP_MJ_READ et IRP_MJ_WRITE de manière asynchrone. Les routines DispatchRead et DispatchWrite , même dans un pilote de niveau supérieur, ne peuvent pas attendre que les pilotes de niveau inférieur terminent le traitement d’une demande asynchrone de lecture ou d’écriture ; ils doivent transmettre une telle demande aux conducteurs inférieurs et retourner STATUS_PENDING.
De même, la routine DispatchReadWrite d’un pilote de périphérique de niveau le plus bas doit transmettre la demande de transfert à d’autres routines de pilotes qui traitent les demandes d’E/S d’appareil, puis retournent STATUS_PENDING.
Un pilote de niveau supérieur doit parfois configurer des IIP à transfert partiel et les transmettre aux pilotes inférieurs. Le pilote de niveau supérieur peut effectuer l’IRP d’origine en lecture/écriture uniquement lorsque ses demandes de transfert partiel ont été effectuées par les pilotes inférieurs.
Par exemple, la routine DispatchReadWrite d’un pilote de classe SCSI est requise pour fractionner les demandes de transfert volumineuses qui dépassent les capacités de transfert du HBA sous-jacent en un ensemble de demandes de transfert partiel. Le pilote de classe doit configurer les paramètres dans ses IIP à transfert partiel afin que les pilotes de port/miniport SCSI puissent répondre à chaque demande de transfert partiel dans une seule opération DMA.
D’autres pilotes de périphérique qui utilisent DMA ou PIO peuvent également avoir besoin de fractionner les demandes de transfert volumineuses pour eux-mêmes.
Pour plus d’informations sur l’utilisation de DMA et PIO, consultez Techniques d’entrée/sortie.