Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In deze sectie worden richtlijnen besproken voor het implementeren van een annuleringsroutine en het afhandelen van annuleerbare IR's. Zie de stroom van controle voor Cancel-Safe IRP Queuing voor meer informatie over het verwerken van annuleerbare IRP's.
Algemene richtlijnen voor alle annuleringsroutines
De I/O-manager houdt de cancel spin lock vast wanneer het de Annuleringsroutine van een stuurprogramma aanroept. Daarom moet elke annuleringsroutine het volgende doen:
Roep IoReleaseCancelSpinLock aan voordat de controle terugkeert.
Roep IoAcquireCancelSpinLock niet aan , tenzij ioReleaseCancelSpinLock eerst wordt aangeroepen.
Maak een wederzijdse aanroep naar IoReleaseCancelSpinLock voor elke aanroep die wordt gedaan naar IoAcquireCancelSpinLock.
Telkens wanneer de routine AnnulerenIoReleaseCancelSpinLock aanroept, moet deze de IRQL doorgeven die wordt geretourneerd door de meest recente aanroep naar IoAcquireCancelSpinLock. Bij het vrijgeven van de spinvergrendeling die door de I/O-manager is verkregen (en werd vastgehouden toen de Annuleringsroutine werd aangeroepen), moet de AnnuleringsroutineIrp->CancelIrql doorgeven.
Een stuurprogramma mag geen externe routines (zoals IoCompleteRequest) aanroepen terwijl het een spinvergrendeling vasthoudt, omdat dit tot een impasse kan leiden.
De wachtrij gebruiken die is gedefinieerd door I/O-beheer
Tenzij een stuurprogramma zijn eigen interne wachtrijen van IRP's beheert, wordt de routine Annuleren aangeroepen met een binnenkomende IRP die een van de volgende opties kan zijn:
CurrentIrp in het invoerdoelapparaatobject
Een vermelding in de apparaatwachtrij die is gekoppeld aan het doelapparaatobject
Tenzij een stuurprogramma zijn eigen interne wachtrijen met IRP's beheert, moet de routine CancelKeRemoveEntryDeviceQueue aanroepen met de invoer-IRP om te testen of het een vermelding is in de apparaatwachtrij die is gekoppeld aan het doelapparaatobject. De routine Annuleren van het stuurprogramma kanKeRemoveDeviceQueue of KeRemoveByKeyDeviceQueue niet aanroepen omdat niet kan worden aangenomen dat de opgegeven IRP zich op een bepaalde positie in de apparaatwachtrij bevindt.
Huidige status van de invoer-IRP
Als een Annuleren-routine wordt aangeroepen met een IRP waarvoor het stuurprogramma al met I/O-verwerking is begonnen en de aanvraag binnenkort wordt voltooid, moet de Annuleren-routine de systeem-cancel-spin-lock vrijgeven en het beheer teruggeven.
Als de huidige status van de invoer-IRP in behandeling is, moet een Annuleringsroutine het volgende doen:
Stel het I/O-statusblok van de invoer-IRP in met STATUS_CANCELLED voor status en nul voor informatie.
Laat alle spinvergrendelingen los die het systeem vasthoudt, waaronder de spinvergrendeling voor annuleren van het systeem.
Roep IoCompleteRequest aan met de opgegeven IRP.
IRP's in een annuleerbare status
Elke stuurprogrammaroutine met een IRP met een status die kan worden geannuleerd, moet IoMarkIrpPending aanroepen en IoSetCancelRoutine aanroepen om het toegangspunt in te stellen voor de routine Annuleren in de IRP. Alleen dan kan die besturingsroutine extra ondersteuningsroutines aanroepen, zoals IoStartPacket, IoAllocateController of een ExInterlockedInsert..Lijstroutine.
Elke stuurprogrammaroutine die vervolgens annuleerbare IR's verwerkt, moet controleren of een IRP al is geannuleerd voordat de bewerkingen worden gestart om aan de aanvraag te voldoen. De routine moet IoSetCancelRoutine aanroepen om het ingangspunt voor de routine Annuleren opnieuw in te stellen op NULL in de IRP. Alleen dan kan die routine beginnen met de I/O-verwerking voor de invoer-IRP.
Een routine moet het ingangspunt voor een routine Annuleren mogelijk opnieuw instellen in een IRP als deze ook IRPs doorgeeft voor verdere verwerking door andere stuurprogrammaroutines en deze IRPs mogelijk in een annuleerbare status worden gehouden.
Elk stuurprogramma op een hoger niveau dat een IRP in een annuleerbare status heeft, moet het ingangspunt Annuleren opnieuw instellen op NULL voordat het IRP wordt doorgegeven aan het volgende lagere stuurprogramma met IoCallDriver.
Een IRP annuleren
Elk stuurprogramma op een hoger niveau kan IoCancelIrp aanroepen met een IRP die het heeft toegewezen en doorgegeven voor verdere verwerking door stuurprogramma's op lager niveau. Een dergelijk stuurprogramma kan echter niet aannemen dat de opgegeven IRP wordt voltooid met STATUS_CANCELLED door lagere stuurprogramma's.
Synchronisatie
Een stuurprogramma kan (of moet, afhankelijk van het ontwerp) aanvullende statusinformatie behouden in de apparaatextensie om de annuleringsstatus van IRP's bij te houden. Als deze status wordt gedeeld door stuurprogrammaroutines die worden uitgevoerd op IRQL <= DISPATCH_LEVEL, moeten de gedeelde gegevens worden beveiligd met een door het stuurprogramma toegewezen en geïnitialiseerde spinvergrendeling.
De bestuurder moet zijn overnames en releases van de systeemannuleringsspinlock en zijn eigen spinlocks zorgvuldig beheren. Het moet de systeemmatige annulatieslot voor zo kort mogelijke intervallen houden. Voordat u toegang krijgt tot een annuleerbaar IRP, moet een dergelijk stuurprogramma altijd de retourwaarde van IoSetCancelRoutine controleren om te bepalen of de routine Annuleren al wordt uitgevoerd (of op het punt staat te worden uitgevoerd); Als dit het geval is, moet de routine Annuleren de IRP voltooien.
Als een apparaatstuurprogramma statusinformatie onderhoudt over annuleerbare IR's die verschillende stuurprogrammaroutines delen met de ISR, moeten deze andere routines de toegang tot de gedeelde status synchroniseren met de ISR. Alleen een door het stuurprogramma geleverde SynchCritSection-routine heeft toegang tot statusgegevens die op een veilige manier met de ISR worden gedeeld.
Zie Synchronisatietechnieken voor meer informatie.