Partager via


Comment effectuer une IRP dans une routine de répartition

Si une IRP d’entrée peut être effectuée immédiatement, une routine de répartition effectue les opérations suivantes :

  1. Définit les membres Status et Information du bloc d’E/S de l’IRP status avec les valeurs appropriées, en général :

    • La routine de répartition définit Status sur STATUS_SUCCESS ou sur une erreur appropriée (STATUS_XXX), qui peut être la valeur retournée par un appel à une routine de support ou, pour certaines demandes synchrones, par un pilote inférieur.

      Si un pilote de niveau inférieur retourne STATUS_PENDING, un pilote de niveau supérieur ne doit pas appeler IoCompleteRequest pour l’IRP, à une exception près : le pilote de niveau supérieur peut utiliser un événement pour synchroniser sa routine IoCompletion et sa routine de distribution, auquel cas la routine IoCompletion signale l’événement et retourne STATUS_MORE_PROCESSING_REQUIRED. La routine de répartition attend l’événement, puis appelle IoCompleteRequest pour terminer l’IRP.

    • Il définit Information sur le nombre d’octets transférés si une demande de transfert de données, telle qu’une demande de lecture ou d’écriture, a été satisfaite.

    • Il définit Information sur une valeur qui varie en fonction de la demande spécifique pour d’autres IRP qu’elle effectue avec STATUS_SUCCESS.

    • Il définit Information sur une valeur qui varie en fonction de la demande spécifique pour les IRPs qu’elle effectue avec un avertissement STATUS_XXX. Par exemple, il définirait Information sur le nombre d’octets transférés pour un avertissement tel que STATUS_BUFFER_OVERFLOW.

    • En règle générale, il définit Information sur zéro pour les demandes qu’il termine avec une erreur STATUS_XXX.

  2. Appelle IoCompleteRequest avec l’IRP et avec PriorityBoost = IO_NO_INCREMENT.

  3. Retourne le STATUS_XXX approprié qu’il a déjà défini dans le bloc d’E/S status. Notez qu’un appel à IoCompleteRequest rend l’IRP donné inaccessible par l’appelant, de sorte que la valeur de retour d’une routine de répartition ne peut pas être définie à partir du bloc d’E/S status d’un IRP déjà terminé.

Suivez ces instructions d’implémentation pour appeler IoCompleteRequest avec un IRP :

Relâchez toujours les verrous de rotation que le pilote tient avant d’appeler IoCompleteRequest.

L’exécution d’un IRP prend un temps indéterminé, en particulier dans une chaîne de pilotes en couches. En outre, un blocage peut se produire si la routine IoCompletion d’un pilote de niveau supérieur renvoie un IRP vers le bas vers un pilote inférieur qui tient un verrou de rotation.