Delen via


Verzendmethoden voor I/O-aanvragen

Wanneer een stuurprogramma WdfIoQueueCreate aanroept om een I/O-wachtrij te maken, wordt een verzendmethode voor de wachtrij opgegeven. Het framework biedt drie verzendmethoden: opeenvolgend, parallel en handmatig. Het stuurprogramma kan een van deze verzendmethoden opgeven voor elke I/O-wachtrij, inclusief de standaard I/O-wachtrij van een apparaat.

Het stuurprogramma stelt de verzendmethode van een wachtrij in door een WDF_IO_QUEUE_DISPATCH_TYPE-getypte waarde op te geven in de WDF_IO_QUEUE_CONFIG structuur van de wachtrij.

Zie Voorbeeldgebruik van I/O-wachtrijen voor elk verzendmethode.

Sequentiële verzending

Als uw stuurprogramma of apparaat slechts één I/O-aanvraag uit een wachtrij tegelijk kan verwerken, moet u de I/O-wachtrijen van het apparaat instellen voor het gebruik van sequentiële verzending, ook wel synchrone verzending genoemd. Met dit type verzending levert het framework aanvragen één voor één aan het stuurprogramma. Het framework geeft de volgende aanvraag pas vrij nadat het stuurprogramma de vorige aanvraag heeft voltooid, annuleert of opnieuw uitvoert.

Nadat het framework een aanvraag aan een van de aanvraaghandlers van het stuurprogramma heeft geleverd, verwerkt het stuurprogramma de aanvraag. Als het stuurprogramma de aanvraag doorstuurt naar een algemeen I/O-doel, wordt meestal een van de synchrone methoden van het I/O-doelobject aangeroepen. Zie I/O-aanvragen synchroon verzenden voor meer informatie over deze methoden. Het stuurprogramma moet uiteindelijk elke aanvraag die het ontvangt van een I/O-wachtrij voltooien of annuleren .

Een stuurprogramma dat een I/O-wachtrij voor sequentiële verzending heeft ingesteld, kan WdfIoQueueRetrieveNextRequest of WdfIoQueueRetrieveRequestByFileObject aanroepen voordat de laatste ontvangen aanvraag is voltooid of geannuleerd. U kunt dit doen in een functiestuurprogramma, zodat het stuurprogramma de volgende hardwarebewerking kan starten terwijl de callback-functie evtInterruptDpc van het stuurprogramma nog steeds gegevens van de vorige hardwarebewerking verwerkt.

Als u meerdere I/O-wachtrijen maakt en deze allemaal instelt voor sequentiële verzending, verzendt het framework aanvragen van elke wachtrij sequentieel, maar worden de wachtrijen parallel uitgevoerd. Als uw stuurprogramma of apparaat slechts één aanvraag tegelijk van elk type kan verwerken, moet u één I/O-wachtrij gebruiken met een EvtIoDefault-callback-functie .

Parallelle verzending

Als uw stuurprogramma en apparaat gelijktijdig meerdere I/O-aanvragen kunnen verwerken, kunt u de I/O-wachtrijen van het apparaat instellen om parallelle verzending te gebruiken, zodat het stuurprogramma de aanvragen asynchroon kan verwerken. Deze verzendmethode wordt ook wel asynchrone verzending genoemd.

Als een stuurprogramma een I/O-wachtrij instelt om parallelle verzending te gebruiken, levert het framework I/O-aanvragen aan het stuurprogramma zodra deze beschikbaar zijn in de wachtrij. Het resultaat is dat het stuurprogramma mogelijk meerdere aanvragen tegelijk moet verwerken.

Telkens wanneer een van de aanvraaghandlers van het stuurprogramma een aanvraag ontvangt, moet het stuurprogramma de aanvraag verwerken en vervolgens de aanvraag voltooien . Als het stuurprogramma de aanvraag doorstuurt naar een algemeen I/O-doel, wordt meestal een van de asynchrone methoden van het I/O-doelobject aangeroepen. Zie I/O-aanvragen asynchroon verzenden voor meer informatie over deze methoden. Het stuurprogramma moet uiteindelijk elke aanvraag die het ontvangt van een I/O-wachtrij voltooien of annuleren .

Een stuurprogramma dat gebruikmaakt van parallelle verzending, kan WdfIoQueueStop of WdfIoQueueStopSynchronously aanroepen om een wachtrij tijdelijk te stoppen en vervolgens WdfIoQueueStart aanroepen om de wachtrij opnieuw op te starten.

Handmatig verzenden

Als u wilt dat uw stuurprogramma volledige controle heeft over de levering van I/O-aanvragen, kunt u de I/O-wachtrij van een apparaat instellen voor het gebruik van handmatige verzending, wat betekent dat het framework geen aanvragen levert aan het stuurprogramma, tenzij het stuurprogramma expliciet om een aanvraag vraagt.

Het stuurprogramma kan WdfIoQueueRetrieveNextRequest of WdfIoQueueRetrieveRequestByFileObject aanroepen in een lus die de wachtrij controleert. Alternatief kan het stuurprogramma WdfIoQueueReadyNotify aanroepen om een callback-functie te registreren die door het framework wordt aangeroepen wanneer een of meer aanvragen beschikbaar zijn in de wachtrij. Nadat het framework de callback-functie heeft aangeroepen, kan het stuurprogramma WdfIoQueueRetrieveNextRequest of WdfIoQueueRetrieveRequestByFileObject in een lus aanroepen om de aanvragen op te halen.

Nadat het stuurprogramma een aanvraag uit de wachtrij heeft ontvangen, moet deze de aanvraag verwerken. Het stuurprogramma moet uiteindelijk elke aanvraag voltooien of annuleren .