Delen via


Routinevereisten voor ControllerControl

Zoals de naam al aangeeft, wordt een ControllerControl-routine gekoppeld aan een controllerobject. Wanneer de ControllerControl-routine wordt uitgevoerd, is de hardware die wordt vertegenwoordigd door het controllerobject vrij en wordt de controllerextensie over het algemeen niet geopend door een andere stuurprogrammaroutine, tenzij de controllerextensie context bevat die wordt gedeeld met de ISR van het stuurprogramma.

Normaal gesproken doet een ControllerControl-routine ten minste het volgende:

  1. Update of initialiseer de context die het stuurprogramma onderhoudt in de apparaatextensie van het doelapparaatobject en in de controllerextensie.

    Als het stuurprogramma DMA gebruikt, is de ControllerControl-routine meestal verantwoordelijk voor het bepalen of een bepaalde overdrachtsaanvraag moet worden opgesplitst in gedeeltelijke overdrachten vanwege eventuele door het systeem opgelegde of apparaatgebonden beperkingen voor de grootte van elke DMA-overdracht. In deze omstandigheden is de ControllerControl-routine ook verantwoordelijk voor het aanroepen van AllocateAdapterChannel als het stuurprogramma een AdapterControl-routine heeft.

    Als het stuurprogramma PIO gebruikt, is de ControllerControl-routine ook verantwoordelijk voor het splitsen van overdrachtsaanvragen, indien de hardware dit vereist, in gedeeltelijke overdrachtsbereiken en voor het aanroepen van MmGetSystemAddressForMdlSafe met de MDL bij >Irp-MdlAddress.

  2. Stelt de hardware in voor de gevraagde I/O-bewerking

    Als de apparaat- of controllerextensie toegankelijk is vanuit de ISR, moet de ControllerControl-routine een SynchCritSection-routine gebruiken die wordt aangeroepen door KeSynchronizeExecution aan te roepen. Voor meer informatie, zie Kritieke secties gebruiken.

Als het stuurprogramma een annuleringsroutine heeft, moet de ControllerControl-routine ook het veld Irp-Annuleren> controleren om te bepalen of de huidige IRP moet worden geannuleerd en een van de volgende handelingen uitvoeren:

Als Irp-Cancel> is ingesteld op TRUE, moet de ControllerControl-routine het volgende doen:

  1. Stel STATUS_CANCELLED in voor Status en nul voor Informatie in het I/O-statusblok van de IRP.

  2. Roep IoFreeController aan om het controllerobject vrij te geven, zodat de volgende apparaatbewerking onmiddellijk kan worden gestart.

  3. Roep IoStartNextPacket aan of verwijder de volgende IRP als het stuurprogramma een eigen wachtrij beheert.

  4. Voltooi de geannuleerde IRP met IoCompleteRequest en geef de controle terug.

Als Irp-Cancel> niet is ingesteld op TRUE, moet de ControllerControl-routine in plaats daarvan het volgende doen:

  1. Roep IoSetCancelRoutine aan om het routineinvoerpunt Annuleren voor de IRP opnieuw in te stellen op NULL. Verwerf de annuleerspinlock voor deze aanroep als het stuurprogramma gebruikmaakt van de door de I/O-manager geleverde apparaatwachtrij in het apparaatobject.

  2. Programmeer de hardware voor de aangevraagde I/O-bewerking met behulp van een SynchCritSection-routine die wordt aangeroepen door KeSynchronizeExecution aan te roepen. Zie Kritieke secties gebruiken voor meer informatie

Zie Annuleer-IR's voor meer informatie over het afhandelen van annuleerbare IR's.

Voor de meeste interruptgestuurde I/O-bewerkingen behalve overlappende bewerkingen op verschillende apparaten die zijn gekoppeld aan de fysieke controller/adapter, moet een ControllerControl-routineKeepObject retourneren omdat de DpcForIsr - of CustomDpc-routine de bewerking en de IRP voltooit.

Zodra de I/O-bewerking(en) om te voldoen aan de huidige aanvraag zijn voltooid, moet de routine die het IRP voltooit IoFreeController en IoStartNextPacket aanroepen, zodat de volgende aanvraag zo snel mogelijk kan worden verwerkt.

Als de ControllerControl-routine zelf een IRP voltooit of als deze een bewerking kan instellen, zoals een schijfzoekactie, voor één doelapparaatobject (schijf) dat kan worden overlapt met een bewerking voor een ander apparaatobject, moet de ControllerControl-routineDeallocateObject retourneren.