Delen via


Routines annuleren in stuurprogramma's zonder StartIo-routines

De I/O-manager onderhoudt het CurrentIrp-veld in een apparaatobject alleen als IRP's in de wachtrij worden geplaatst in het bijbehorende apparaatwachtrijobject.

Stuurprogramma's die geen StartIo-routines hebben, beheren hun eigen interne wachtrijen met IRP's. In een dergelijk stuurprogramma kan een routine Annuleren worden aangeroepen met een invoer-IRP die niet de CurrentIrp is voor het object van het invoerdoelapparaat, noch een IRP in de interne wachtrij van het stuurprogramma. Het stuurprogramma moet een eigen status behouden over welk IRP momenteel wordt verwerkt en moet een annuleringsroutine hebben voor elk van de wachtrijen. De interne wachtrij van het stuurprogramma moet een ingesloten wachtrij zijn, omdat de interne wachtrij moet worden beveiligd door een executive spin lock.

Wanneer de routine Annuleren van het stuurprogramma wordt aangeroepen, doet dit meestal het volgende:

  1. Roept IoReleaseCancelSpinLock aan, waarbij Irp-CancelIrql> wordt doorgegeven.

  2. Verkrijgt de spinlock die zijn interlocked wachtrij beveiligt en doorloopt de wachtrij om een IRP te vinden met Irp-Cancel> ingesteld op TRUE.

    • Als een dergelijk IRP in de tussenvergrendelde wachtrij wordt gevonden, wordt deze uit de wachtrij verwijderd, wordt de spinvergrendeling voor de wachtrij losgelaten, wordt het I/O-statusblok van de IRP ingesteld.

      STATUS_CANCELLED voor status en nul voor informatie, start de volgende IRP in de wachtrij, roept IoCompleteRequest aan met de geannuleerde IRP en retourneert het besturingselement

    • Als een dergelijke IRP niet wordt gevonden, laat de Cancel-routine eventuele spinvergrendelingen los die het vasthoudt en retourneert de controle.

      Het stuurprogramma gaat er meestal van uit dat I/O-verwerking voor de invoer-IRP al is gestart als de IRP niet in de wachtrij staat.

Stuurprogramma's met -routines kunnen ook IRP_MJ_CLEANUP aanvragen annuleren en verwerken. Zie DispatchCleanup voor meer informatie over IRP_MJ_CLEANUP-aanvragen.