Partager via


DispatchReadWrite dans les pilotes de niveau supérieur

À 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 fournisseurs d’intégration. Une telle routine DispatchReadWrite d’un pilote peut transmettre des IRP avec des paramètres valides à des pilotes inférieurs, éventuellement après avoir configuré sa routine IoCompletion, comme décrit dans Transmettre les IRP 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 de port/miniport SCSI. 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ée par le 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 irps alloués au pilote et, finalement, terminer la requête d’origine.

Si le pilote sous-jacent contrôle un périphérique multimédia amovible, les irps 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 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 des supports amovibles.

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’état d’E/S défini avec l’erreur retournée, après avoir libéré les irps et la mémoire allouées par le pilote de niveau supérieur.

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é.