Partager via


Synchronisation de l'annulation dans les routines des pilotes qui traitent les IRP

Toute routine de pilote qui file d’attente ou est appelée avec un IRP qui est conservé dans un état annulable, y compris la routine StartIo d’un pilote, doit effectuer les opérations suivantes :

  1. Appelez IoAcquireCancelSpinLock.

  2. Vérifiez que Irp est égal à DeviceObject-CurrentIrp>. Si ce n’est pas le cas, appelez IoReleaseCancelSpinLock et retournez le contrôle.

    Si les deux ne sont pas identiques, CurrentIrp a peut-être été annulé entre le moment où IoStartPacket a publié le verrou de rotation d’annulation et que cette routine l’a acquise.

  3. Appelez IoSetCancelRoutine avec un pointeur Null CancelRoutine pour supprimer l’IRP de l’état annulable.

  4. Vérifiez le champ Irp-Cancel> pour déterminer s’il faut annuler l’IRP ou commencer à traiter la demande d’E/S.

    Si Irp-Cancel> a la valeur TRUE, procédez comme suit :

    • Appelez IoReleaseCancelSpinLock.

    • Définissez Irp-IoStatus.Status> sur STATUS_CANCELLED.

    • Définissez Irp-IoStatus.Information> sur 0.

    • Appelez IoStartNextPacket (dans une routine StartIo ) pour démarrer le paquet suivant.

    • Appelez IoCompleteRequest avec une priorité de IO_NO_INCREMENT pour terminer l’IRP.

    Si Irp-Cancel> est défini sur FALSE, appelez IoReleaseCancelSpinLock et démarrez le traitement demandé de la demande d’E/S ou transmettez l’IRP au pilote inférieur suivant, le cas échéant.

Les pilotes qui gèrent leurs propres files d’attente d’IRPs, plutôt que d’utiliser la file d’attente d’appareils fournie par le gestionnaire d’E/S, n’ont pas besoin d’acquérir le verrou de rotation d’annulation lors de l’appel d’IoSetCancelRoutine. Toutefois, ces pilotes doivent vérifier le pointeur de routine Annuler que IoSetCancelRoutine retourne pour déterminer si la routine d’annulation a déjà démarré.

Dans tout pilote qui gère les IRP annulables, chaque routine de pilote qui traite un IRP avant que l’appareil sous-jacent ait été programmé pour l’opération d’E/S demandée doit vérifier l’état annulable de toutes les IRP entrantes. Plus précisément, un pilote de périphérique de niveau supérieur avec les routines StartIo et ControllerControl doit traiter les adresses IP virtuelles entrantes dans ces deux routines de pilotes, comme décrit déjà.