Delen via


BuildRequest Routine van Storage Class Driver

Net als alle stuurprogramma's op een hoger niveau in de kernelmodus, moet een stuurprogramma voor opslagklasse de I/O-stacklocatie van de IRP instellen voor het volgende lagere stuurprogramma bij het verwerken van aanvragen naar opslagrandapparatuur. In IRPs die het klassestuurprogramma instelt met SRBs voor het door het systeem geleverde poortstuurprogramma, wordt de I/O-stacklocatie van het poortstuurprogramma ingesteld met het volgende:

  • MajorFunction bevat IRP_MJ_SCSI

  • Parameters.Scsi.Srb bevat een aanwijzer naar de SRB

Elk klassestuurprogramma is verantwoordelijk voor het toewijzen van geheugen voor SRBS en voor het instellen ervan met CDBs voor het onderliggende stuurprogramma voor opslagpoorten. Het stuurprogrammadriver kan een lookaside-lijst instellen voor zijn SRB's met ExInitializeNPageLookasideList of ExAllocatePool aanroepen voor niet-gepageerd geheugen. Zie Lookaside-lijsten gebruiken voor meer informatie over het gebruik van lookaside-lijsten en niet-gepagineerde pool.

Of het nu geheugen toewijst vanuit een pool of vanuit een door het stuurprogramma gemaakte lookaside-lijst, elk opslagklassestuurprogramma is verantwoordelijk voor het vrijmaken van het geheugen dat wordt toegewezen aan SRB's. IoCompletion-routines van opslagklassestuurprogramma's, zoals beschreven in IoCompletion-routines van storage class-stuurprogramma's, geven meestal het geheugen vrij dat voor SRBS is toegewezen aan een lijst met lookasides.

De BuildRequest-routine van een klassestuurprogramma moet de juiste waarden instellen in de SRB-leden, inclusief de lengte van de CDB die is ingesteld om met het apparaat te communiceren. Voor aanvragen die verzoek-zin-informatie retourneren en/of waarvoor het stuurprogramma mogelijk opnieuw moet proberen, wordt een IoCompletion-routine ingesteld in de IRP. Voor lees- of schrijfaanvragen ORt het de SrbFlags met de juiste overdrachtsrichting, SRB_FLAGS_DATA_IN of SRB_FLAGS_DATA_OUT, respectievelijk.

Een BuildRequest-routine kan de verantwoordelijkheid voor het instellen van een SRB delen met een paar SendSrbSynchronous - en SendSrbAsynchronous routines. Dat wil gezegd, de BuildRequest-routine kan de SRB-leden instellen die doorgaans zijn ingesteld voor alle aanvragen, terwijl de SendSrbXxx-routines elke set SRB-waarden alleen relevant zijn voor elk type aanvraag. Wanneer een IRP wordt doorgegeven aan het poortstuurprogramma vanuit een SendSrbAsynchronous routine, moet de IRP worden ingesteld met een door het stuurprogramma geleverde IoCompletion-routine .

Nadat het klassestuurprogramma is geladen, worden de meeste SRBs ingesteld met het Function-lid ingesteld op SRB_FUNCTION_EXECUTE_SCSI, wat aangeeft dat een apparaat-I/O-verzoek via de bus moet worden verzonden.

Zie SCSI_REQUEST_BLOCK voor meer informatie over de door het systeem gedefinieerde SRB-leden en hun waarden.

SRBs instellen voor Request Sense

Een klassestuurprogramma kan aanvragen dat het poortstuurprogramma SCSI-aanvraagingevoel of equivalente informatie retourneert wanneer de doelcontroller een controlevoorwaarde retourneert. Hiervoor stelt het klassestuurprogramma de SenseInfoBuffer-pointer en SenseInfoBufferLength in de SRB in, zodat het poortstuurprogramma de aanvraag-senseinformatie kan retourneren als er een controlevoorwaarde optreedt. Het poortstuurprogramma geeft aan dat er request sense-informatie is geretourneerd door het SrbStatus-lid in te stellen met SRB_STATUS_AUTOSENSE_VALID wanneer het de IRP retourneert. Zie voor meer informatie over InterpretSenseInfo-routines, de InterpretRequestSense-routine van de opslagklassestuurprogramma.

Pogingen

Stuurprogramma's voor opslagklassen zijn verantwoordelijk voor het opnieuw proberen van verzoeken die falen vanwege controller-/doelfouten, busresets of time-outs voor verzoeken. Daarom beheren veel klassestuurprogramma's een pogingenherhalingsaantal in hun eigen I/O-stacklocatie van de IRP. Een dergelijke BuildRequest-routine van een klassestuurprogramma kan ook de limiet voor herhaalde pogingen van een bepaalde aanvraag initialiseren voordat de IoCompletion-routine wordt ingesteld en de IRP naar het poortstuurprogramma wordt verzonden. Zie Voor meer informatie over RetryRequest-routines de RetryRequest-routine van het opslagklassestuurprogramma.