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.
De actieve I/O-bewerking van een apparaat (zoals een aanvraag om meerdere blokken van een schijf te lezen) kan worden geannuleerd door een toepassing, het systeem of een stuurprogramma. Als de I/O-bewerking van een apparaat wordt geannuleerd, probeert de I/O-manager alle niet-verwerkte I/O-aanvragen te annuleren die zijn gekoppeld aan de I/O-bewerking. De stuurprogramma's van het apparaat kunnen worden geregistreerd om op de hoogte te worden gesteld wanneer de I/O-manager I/O-aanvragen probeert te annuleren. De stuurprogramma's kunnen de aanvragen die ze bezitten annuleren door te voltooien met de voltooiingsstatus van STATUS_CANCELLED.
Het framework verwerkt enkele annuleringswerkzaamheden voor frameworkgebaseerde stuurprogramma's. Als de I/O-bewerking van een apparaat wordt geannuleerd, worden de volgende I/O-aanvragen (met de voltooiingsstatus van STATUS_CANCELLED) voltooid die zijn gekoppeld aan de geannuleerde bewerking:
Ongeleverde I/O-aanvragen die het framework heeft geplaatst in de standaard I/O-wachtrij van de bestuurder.
Onafgemaakte I/O-aanvragen die het framework naar een andere wachtrij heeft doorgestuurd omdat de driver WdfDeviceConfigureRequestDispatchingheeft aangeroepen.
Omdat het framework deze aanvragen annuleert, worden deze niet aan het stuurprogramma geleverd.
Nadat het framework een I/O-aanvraag aan het stuurprogramma heeft geleverd, is het stuurprogramma eigenaar de aanvraag en kan het framework deze niet annuleren. Op dit moment kan alleen het stuurprogramma de I/O-aanvraag annuleren, maar het framework moet het stuurprogramma waarschuwen dat een aanvraag moet worden geannuleerd. Drivers ontvangen deze melding door een EvtRequestCancel callback-functie op te geven.
Soms ontvangt een stuurprogramma een I/O-aanvraag uit een I/O-wachtrij, maar in plaats van de aanvraag te verwerken, verzendt het stuurprogramma de aanvraag opnieuw naar dezelfde of een andere I/O-wachtrij voor latere verwerking. Voorbeelden van deze situatie zijn:
Het framework levert een I/O-aanvraag aan een van de aanvraaghandlers van het stuurprogrammaen het stuurprogramma roept vervolgens WdfRequestForwardToIoQueue (of WdfRequestForwardToParentDeviceIoQueue) aan om de aanvraag in een andere wachtrij te plaatsen of WdfRequestRequeue om de aanvraag weer in dezelfde wachtrij te plaatsen.
Het framework levert een I/O-aanvraag aan de EvtIoInCallerContext callback-functie van het stuurprogramma, het stuurprogramma roept WdfDeviceEnqueueRequest om de aanvraag terug te geven aan het framework en het framework plaatst de aanvraag vervolgens in een van de I/O-wachtrijen van het stuurprogramma.
In deze gevallen kan het framework de I/O-aanvraag annuleren omdat de aanvraag zich in een I/O-wachtrij bevindt. Als het stuurprogramma echter een EvtIoCanceledOnQueue callback-functie heeft geregistreerd voor de I/O-wachtrij waarin de aanvraag zich bevindt, roept het framework de callback-functie aan in plaats van de aanvraag te annuleren wanneer de bijbehorende I/O-bewerking wordt geannuleerd. Als het framework de callbackfunctie EvtIoCanceledOnQueue van het stuurprogramma aanroept, moet het stuurprogramma het verzoek voltooien.
Kortom, wanneer een I/O-bewerking wordt geannuleerd, annuleert het framework altijd alle bijbehorende I/O-aanvragen die nooit aan het stuurprogramma zijn geleverd. Als het stuurprogramma een aanvraag ontvangt en deze vervolgens opnieuw in de wachtrij plaatst, annuleert het framework de aanvraag (als de aanvraag in de wachtrij staat), tenzij het stuurprogramma een EvtIoCanceledOnQueue callback-functie voor de I/O-wachtrij biedt.
Het aanroepen van WdfRequestMarkCancelable of WdfRequestMarkCancelableEx
Een stuurprogramma kan WdfRequestMarkCancelable of WdfRequestMarkCancelableEx aanroepen om een EvtRequestCancel callback-functie te registreren. Als het stuurprogramma WdfRequestMarkCancelable of WdfRequestMarkCancelableExheeft aangeroepen en als de I/O-bewerking die is gekoppeld aan de aanvraag wordt geannuleerd, roept het framework de EvtRequestCancel callback-functie aan, zodat het stuurprogramma de I/O-aanvraag kan annuleren.
Een stuurprogramma moet WdfRequestMarkCancelable of WdfRequestMarkCancelableEx aanroepen als het een aanvraag gedurende een relatief lange tijd zal aanhouden. Een stuurprogramma moet bijvoorbeeld wachten totdat een apparaat reageert, of het kan wachten tot lagere stuurprogramma's een set aanvragen hebben voltooid die het stuurprogramma heeft gemaakt toen het één aanvraag ontving.
Als een stuurprogramma geen WdfRequestMarkCancelable of WdfRequestMarkCancelableExaanroept of als een stuurprogramma WdfRequestUnmarkCancelable aanroept na het aanroepen van WdfRequestMarkCancelable of WdfRequestMarkCancelableEx, is het stuurprogramma niet op de hoogte van de annulering en verwerkt het de aanvraag zoals gebruikelijk.
WdfRequestIsCanceled aanroepen
Als een stuurprogramma geen WdfRequestMarkCancelable of WdfRequestMarkCancelableEx heeft aangeroepen om een EvtRequestCancel callback-functie te registreren, kan deze WdfRequestIsCanceled aanroepen om te bepalen of de I/O-manager heeft geprobeerd een I/O-aanvraag te annuleren. Als WdfRequestIsCanceledTRUE retourneert en het stuurprogramma eigenaar is van het verzoek, moet het stuurprogramma het verzoek annuleren. Als het stuurprogramma niet eigenaar is van de aanvraag, moet het niet WdfRequestIsCanceledaanroepen.
Een stuurprogramma dat WdfRequestMarkCancelable of WdfRequestMarkCancelableEx niet heeft aangeroepen, kan in de volgende omstandigheden WdfRequestIsCanceled aanroepen:
Een stuurprogramma dat wacht op apparaatonderbrekingen, kan WdfRequestIsCanceled aanroepen vanuit de EvtInterruptDpc callback-functie.
Een stuurprogramma dat het apparaat peilt, kan WdfRequestIsCanceled aanroepen vanuit de polling-thread.
Een stuurprogramma dat een DMA-transactie in verschillende kleinere overdrachten opsplitst, kan WdfRequestIsCanceled aanroepen nadat elke overdracht voltooid is.
Een stuurprogramma dat een grote lees- of schrijfaanvraag ontvangt die in verschillende kleinere aanvragen wordt ingebroken, kan WdfRequestIsCanceled aanroepen nadat het I/O-doel van het stuurprogramma elk van de kleinere aanvragen heeft voltooid, als het stuurprogramma niet WdfRequestMarkCancelable of WdfRequestMarkCancelableEx voor de ontvangen aanvraag heeft aangeroepen.
De aanvraag annuleren
Het annuleren van een I/O-aanvraag kan een van de volgende oorzaken hebben:
Een actieve I/O-bewerking stoppen.
De aanvraag niet doorsturen naar een I/O-doel.
Het oproepen van WdfRequestCancelSentRequest om te proberen een verzoek te annuleren dat het stuurprogramma eerder had ingediend bij een I/O-doelwit.
Als een stuurprogramma een I/O-aanvraag annuleert voor een aanvraagobject dat het stuurprogramma van het framework heeft ontvangen, moet het stuurprogramma altijd de aanvraag voltooien door WdfRequestCompleteaan te roepen, WdfRequestCompleteWithInformationof WdfRequestCompleteWithPriorityBoost, met een parameter Status van STATUS_CANCELLED. (Als het stuurprogramma WdfRequestCreate heeft aangeroepen om een aanvraagobject te maken, roept het stuurprogramma WdfObjectDelete aan in plaats van de aanvraag af te ronden.)
Annuleringen synchroniseren
Zie voor meer informatie over het synchroniseren van code die I/O-aanvragen annuleert: