Delen via


Stroomaanvraagblokken verwerken

Het besturingssysteem verzendt alle I/O-aanvragen op het apparaat naar het klassestuurprogramma. Het klassestuurprogramma vraagt op zijn beurt hardwarespecifieke informatie van de minidriver aan door SRBs door te geven aan de minidriver. Het klassestuurprogramma geeft de bewerking op die wordt aangevraagd in het opdrachtlid van het stroomaanvraagblok.

Zowel de minidriver als geheel en elke stream binnen de minidriver kunnen I/O-aanvragen ontvangen. De minidriver moet een StrMiniReceiveDevicePacket-routine bieden om aanvragen voor het hele apparaat af te handelen. Elke stream moet twee routines ondersteunen voor het afhandelen van I/O-aanvragen: één voor gegevensaanvragen en één voor controleaanvragen. Het klassestuurprogramma roept de callback van de gegevensaanvraag, StrMiniReceiveStreamDataPacket, aan om alle lees- en schrijfaanvragen in een stream af te handelen. Alle andere aanvragen voor een stream worden doorgegeven aan StrMiniReceiveStreamControlPacket.

Als het klassestuurprogramma de synchronisatie voor de minidriver verzorgt, worden streamverzoeken in de wachtrij geplaatst en vervolgens één voor één naar de minidriver verzonden. Het klassestuurprogramma onderhoudt drie afzonderlijke wachtrijen: één voor apparaataanvragen en één voor het streamen van gegevens en beheeraanvragen. De minidriver kan als volgt aangeven dat deze gereed is voor een nieuwe aanvraag vanuit een van deze wachtrijen:

Aanvraagtype Routine NotificationType-parameter van routine

apparaataanvraag

StreamClassDeviceNotification

KlaarVoorVolgendApparaatVerzoek

aanvraag voor stroombeheer

StreamClassStreamNotification

GereedVoorVolgendeStreamControlVerzoek

gegevensaanvraag streamen

StreamClassStreamNotification

KlaarVoorVolgendeStreamDataVerzoek

Wanneer het klasstuurprogramma StrMiniReceiveXXXPacket aanroept, wordt het aanvraagblok van de stream naar de minidriver verzonden. De routine van de minidriver heeft alleen toegang tot het stroomaanvraagblok totdat deze aangeeft aan het klassestuurprogramma dat de aanvraag heeft voltooid.

Wanneer de minidriver klaar is met het verwerken van een aanvraag, moet deze aangeven dat het klassestuurprogramma de aanvraag als volgt heeft voltooid:

  1. De minidriver moet de status van de aanvraag instellen in het veld Status van het stroomaanvraagblok.

  2. De minidriver moet aangeven dat deze de aanvraag heeft voltooid door StreamClassDeviceNotification of StreamClassStreamNotification aan te roepen. Om een apparaataanvraag te voltooien, roept de minidriver StreamClassDeviceNotification aan met een NotificationType-parameter van DeviceRequestComplete. Om een streamaanvraag te voltooien, roept de minidriver StreamClassStreamNotification aan met een NotificationType-parameter van StreamRequestComplete.

  3. Als het klassestuurprogramma synchronisatie verwerkt en als de minidriver het klassestuurprogramma nog niet heeft gesignaleerd dat het gereed is voor een andere aanvraag in deze wachtrij, moet dit nu worden gedaan.

De minidriver kan 2 en 3 combineren door StreamClassCompleteRequestAndMarkQueueReady aan te roepen.

De minidriver verwerkt aanvragen asynchroon, dus de classdriver moet mogelijk een aanvraag annuleren of een time-out geven. Voor deze doeleinden moet de minidriver een StrMiniCancelPacket en een StrMiniRequestTimeout-routine bieden. Het class-stuurprogramma roept de betreffende minidriverroutine aan wanneer een aanvraag wordt geannuleerd of een time-out optreedt.

Het klassestuurprogramma annuleert een aanvraag wanneer de onderliggende I/O-aanvraag wordt geannuleerd door het besturingssysteem. Er treedt een time-out op voor aanvragen van het klassestuurprogramma die te lang duren om te worden verwerkt. Hiermee wordt een teller afgebouwd van het aantal seconden totdat er een time-out optreedt voor een aanvraag in het timeoutCounter-lid van het stroomaanvraagblok. Als de minidriver de verwerking van een aanvraag gedurende een lange periode moet uitstellen, moet de TimeoutCounter op nul worden ingesteld. Het klassestuurprogramma zal de aanvraag dan niet laten verlopen. Zodra de minidriver de verwerking van de aanvraag hervat, moet TimeoutCounter opnieuw worden ingesteld op het TimeoutOriginal-lid van het stroomaanvraagblok. De minidriver kan TimeoutOriginal opnieuw instellen om de tijdsduur te wijzigen voordat er een time-out optreedt voor de aanvraag. Zie HW_STREAM_REQUEST_BLOCK voor meer informatie.