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.
Elk frameworkstuurprogramma moet uiteindelijk elke I/O-aanvraag voltooien die het ontvangt van het framework. Stuurprogramma's handelen verzoeken af door de methode WdfRequestComplete, WdfRequestCompleteWithInformation of WdfRequestCompleteWithPriorityBoost aan te roepen.
Wanneer moet u een aanvraag voltooien
Een stuurprogramma moet een aanvraag voltooien wanneer wordt bepaald dat een van de volgende gevallen waar is:
De aangevraagde I/O-bewerking is voltooid.
De aangevraagde I/O-bewerking is gestart, maar is mislukt voordat deze is voltooid.
De aangevraagde I/O-bewerking wordt niet ondersteund of is niet geldig op het moment dat deze is ontvangen en kan niet worden gestart.
De aangevraagde I/O-bewerking is geannuleerd.
Als het stuurprogramma de I/O-aanvraag afhandelt door I/O-activiteit op het apparaat te creëren, roept het doorgaans WdfRequestComplete aan vanuit zijn EvtInterruptDpc of EvtDpcFunc callback-functie.
Als het stuurprogramma een niet-ondersteunde of anderszins ongeldige aanvraag ontvangt, roept het meestal WdfRequestComplete aan bij de aanvraaghandler die de aanvraag heeft ontvangen.
Als de I/O-bewerking is geannuleerd, roept het stuurprogramma doorgaans WdfRequestComplete aan vanuit de functie EvtRequestCancel callback.
Als het stuurprogramma de I/O-aanvraag doorstuurt naar een I/O-doel, voltooit het stuurprogramma de aanvraag nadat het I/O-doel de aanvraag heeft voltooid, als volgt:
Als uw stuurprogramma de I/O-aanvraag synchroon doorstuurt naar het I/O-doel, retourneert de aanroep van het stuurprogramma naar het I/O-doel pas nadat een stuurprogramma op een lager niveau de aanvraag heeft voltooid (tenzij er een fout optreedt). Wanneer het I/O-doel terugkeert, moet uw driver WdfRequestComplete aanroepen.
Als uw stuurprogramma de I/O-aanvraag asynchroon doorstuurt, moet u uw stuurprogramma op de hoogte stellen wanneer een stuurprogramma op een lager niveau de aanvraag voltooit. Als uw stuurprogramma een CompletionRoutine callback-functie registreert, roept het framework deze callback-functie aan nadat het I/O-doel de aanvraag heeft voltooid. De callback-functie CompletionRoutine roept doorgaans WdfRequestComplete aan.
Als u een CompletionRoutine callback-functie wilt registreren, moet het stuurprogramma WdfRequestSetCompletionRoutine aanroepen voordat de I/O-aanvraag wordt doorgestuurd naar een I/O-doel.
Als uw stuurprogramma geen melding hoeft te ontvangen wanneer een I/O-doel een asynchroon doorgestuurde I/O-aanvraag voltooit, hoeft het stuurprogramma geen CompletionRoutine callback-functie te registreren. In plaats daarvan kan het stuurprogramma de WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET vlag instellen bij het aanroepen van WdfRequestSend. In dit geval roept de driver WdfRequestComplete niet aan.
Een stuurprogramma voltooit geen I/O-aanvraag die is gemaakt door WdfRequestCreate of WdfRequestCreateFromIrp aan te roepen. In plaats daarvan moet het stuurprogramma WdfObjectDelete aanroepen om het aanvraagobject te verwijderen, meestal nadat een I/O-doel de aanvraag heeft voltooid.
Een stuurprogramma kan bijvoorbeeld een lees- of schrijfaanvraag ontvangen voor een hoeveelheid gegevens die groter is dan de I/O-doelen van het stuurprogramma tegelijk kunnen verwerken. Het stuurprogramma moet de gegevens verdelen in verschillende kleinere aanvragen en deze kleinere aanvragen verzenden naar een of meer I/O-doelen. Technieken voor het afhandelen van deze situatie zijn:
WdfRequestCreate aanroepen om één extra aanvraagobject te maken dat een kleinere aanvraag vertegenwoordigt.
Het stuurprogramma kan deze aanvraag synchroon verzenden naar een I/O-doel. De callback-functie CompletionRoutine van de kleinere aanvraag kan WdfRequestReuse aanroepen, zodat het stuurprogramma de aanvraag opnieuw kan gebruiken en opnieuw naar het I/O-doel kan verzenden. Nadat het I/O-doel de laatste van de kleinere aanvragen heeft voltooid, kan de callbackfunctie CompletionRoutineWdfObjectDelete aanroepen om het door het stuurprogramma gemaakte aanvraagobject te verwijderen en kan het stuurprogramma WdfRequestComplete aanroepen om de oorspronkelijke aanvraag te voltooien.
WdfRequestCreate aanroepen om verschillende extra aanvraagobjecten te maken die de kleinere aanvragen vertegenwoordigen.
De I/O-doelen van het stuurprogramma kunnen deze meerdere kleinere aanvragen asynchroon verwerken. Het stuurprogramma kan een CompletionRoutine-callbackfunctie registreren voor elk van de kleinere aanvragen. Telkens wanneer de callback-functie CompletionRoutine wordt aangeroepen, kan deze WdfObjectDelete aanroepen om een door het stuurprogramma gemaakte aanvraagobject te verwijderen. Nadat het I/O-doel alle kleinere aanvragen heeft voltooid, kan het stuurprogramma WdfRequestComplete aanroepen om de oorspronkelijke aanvraag te voltooien.
Het opgeven van informatie over voltooiing
Wanneer een stuurprogramma een aanvraag heeft voltooid, kan het eventueel aanvullende informatie verstrekken waartoe andere stuurprogramma's toegang hebben. Een stuurprogramma kan bijvoorbeeld het aantal bytes opgeven dat is overgedragen voor een lees- of schrijfaanvraag. Om deze informatie op te geven, kan het stuurprogramma een van de volgende handelingen uitvoeren:
Roep WdfRequestSetInformation aan voordat u WdfRequestComplete aanroept.
Roep WdfRequestCompleteWithInformation aan.
Voltooiingsgegevens verkrijgen
Een stuurprogramma kan het volgende doen om informatie te verkrijgen over een I/O-aanvraag die een ander stuurprogramma heeft voltooid:
Roep WdfRequestGetStatus aan om de voltooiingsstatuswaarde te verkrijgen die het stuurprogramma op lager niveau heeft opgegeven toen WdfRequestComplete werd genoemd.
Roep WdfRequestGetCompletionParams aan om een WDF_REQUEST_COMPLETION_PARAMS structuur te verkrijgen die aanvullende informatie over de voltooide aanvraag bevat, zoals ingangen voor geheugenobjecten die de buffers van de aanvraag vertegenwoordigen of busspecifieke informatie.
Een stuurprogramma kan WdfRequestGetCompletionParams alleen aanroepen nadat WdfRequestSend is aangeroepen om de I/O-aanvraag synchroon of asynchroon naar een I/O-doel te verzenden. Het stuurprogramma mag WdfRequestGetCompletionParams niet aanroepen nadat het een van de methoden aanroept die I/O-aanvragen naar I/O-doelen alleen synchroon verzenden (zoals WdfIoTargetSendReadSynchronly).
Roep WdfRequestGetInformation aan om aanvullende I/O-voltooiingsgegevens te verkrijgen die het stuurprogramma op lager niveau heeft opgegeven bij de naam WdfRequestSetInformation of WdfRequestCompleteWithInformation, als stuurprogramma's in de stuurprogrammastack dergelijke informatie verstrekken.
Als een stuurprogramma een I/O-aanvraag synchroon verzendt, wordt meestal WdfRequestGetStatus, WdfRequestGetCompletionParams en WdfRequestGetInformation aangeroepen nadat de synchrone aanroep is geretourneerd. Als een stuurprogramma asynchroon een I/O-aanvraag verzendt, worden deze methoden meestal aangeroepen vanuit een callback-functie CompletionRoutine .
Zie Voor meer informatie over het voltooien van I/O-aanvragen het synchroniseren van de annulerings- en voltooiingscode.