Partager via


DispatchReadWrite dans les pilotes Higher-Level

À l’exception des pilotes de système de fichiers, un pilote de niveau supérieur n’a généralement pas de files d’attente de pilotes internes pour les IRPs. La routine DispatchReadWrite d’un tel pilote peut transmettre des IRPs avec des paramètres valides aux pilotes inférieurs, éventuellement après avoir configuré sa routine IoCompletion , comme décrit dans Passer des IIP dans la pile des pilotes.

Toutefois, la routine DispatchReadWrite d’un pilote de classe SCSI est chargée de fractionner les demandes de transfert volumineuses, si nécessaire, avant d’envoyer un IRP avec le code de fonction principal IRP_MJ_READ ou IRP_MJ_WRITE à la paire de pilotes SCSI/miniport. Pour plus d’informations, consultez La routine SplitTransferRequest du pilote de classe de stockage.

Si un pilote de niveau supérieur alloue un ou plusieurs IRPs, qu’il configure pour le pilote inférieur suivant dans sa routine DispatchReadWrite , pour demander un certain nombre de transferts partiels, la routine DispatchReadWrite doit appeler IoSetCompletionRoutine avec chaque IRP alloué au pilote. Le pilote doit inscrire sa routine IoCompletion pour suivre la quantité de données transférées dans chaque opération de transfert partiel afin que la routine IoCompletion puisse libérer tous les IIP alloués au pilote et, finalement, terminer la demande d’origine.

Si le pilote sous-jacent contrôle un périphérique multimédia amovible, tous les IRP alloués par le pilote de niveau supérieur doivent avoir un contexte de thread. Pour configurer un contexte de thread, le pilote d’allocation doit définir la superposition Irp-Tail.Overlay>. Thread dans chaque IRP nouvellement alloué à partir de la même valeur dans l’IRP de transfert entrant. Pour plus d’informations, consultez Prise en charge du support amovible.

Si le pilote de périphérique sous-jacent retourne un IRP pour un transfert partiel avec une erreur, la routine IoCompletion peut réessayer la demande de transfert partiel ou terminer l’IRP d’origine avec son bloc d’E/S status défini avec l’erreur retournée, après avoir libéré tous les IRP et la mémoire que le pilote de niveau supérieur a alloués.

Si la routine DispatchReadWrite d’un pilote de niveau supérieur alloue de la mémoire pour les opérations de transfert partiel et que son allocation est accessible par la routine IoCompletion du pilote (ou par le pilote de périphérique sous-jacent), la routine DispatchReadWrite doit allouer cette mémoire à partir d’un pool non paginé.