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.
Fysieke stuurprogramma's op het laagste niveau hebben bepaalde standaardroutines die stuurprogramma's op een hoger niveau niet nodig hebben. De set standaardroutines voor stuurprogramma's op het laagste niveau varieert ook op basis van de volgende criteria:
De aard van het apparaat dat door elk stuurprogramma wordt bestuurd
Of het stuurprogramma de apparaatobjecten instelt voor directe of gebufferde I/O
Het ontwerp van de individuele bestuurder
Ter illustratie van de rollen van de standaardstuurprogrammaroutines toont de volgende afbeelding het pad dat een voorbeeld-IRP kan nemen wanneer deze wordt verwerkt door een apparaatstuurprogramma op het laagste niveau voor massaopslag. De bestuurder in de figuur heeft de volgende kenmerken:
Het apparaat genereert interrupts aan het einde van elke I/O-bewerking, dus dit stuurprogramma heeft ISR- en DpcForIsr-routines .
Het stuurprogramma heeft een StartIo-routine in plaats van interne wachtrijen voor IRP's in te stellen en zijn eigen wachtrijen te beheren.
Het stuurprogramma maakt gebruik van systeem-DMA, dus stelt het de vlaggen van de apparaatobjecten in voor directe I/O en heeft een AdapterControl-routine .
Zoals in deze afbeelding wordt weergegeven, maakt de I/O-manager een IRP en verzendt deze naar de verzendroutine van het stuurprogramma voor de opgegeven primaire functiecode. Ervan uitgaande dat de functiecode IRP_MJ_READ of IRP_MJ_WRITE is, is de verzendroutine DDDispatchReadWrite.
IoGetCurrentIrpStackLocation aanroepen
Elke stuurprogrammaroutine waarvoor IRP-parameters zijn vereist, moet IoGetCurrentIrpStackLocation aanroepen om de I/O-stacklocatie van het stuurprogramma te verkrijgen. Dergelijke routines omvatten verzendroutines die meer dan één belangrijke I/O-functiecode (IRP_MJ_*XXX) verwerken, een functie verwerken die ondersteuning biedt voor secundaire functies (IRP_MN_XXX) of apparaat-I/O-besturingsaanvragen verwerken (*IRP_MJ_DEVICE_CONTROL en/of IRP_MJ_INTERNAL_DEVICE_CONTROL), samen met elke andere stuurprogrammaroutine die een IRP verwerkt.
De I/O-stacklocatie van dit stuurprogramma is de laagste, terwijl er een onbeperkt aantal op een hoger niveau gelegen I/O-stacklocaties van andere stuurprogramma's gearceerd wordt weergegeven. Voor het gemak worden aanroepen naar IoGetCurrentIrpStackLocation vanuit de DispatchReadWrite-, StartIo-, AdapterControl- en DpcForIsr-routines niet weergegeven in de vorige afbeelding.
IoMarkIrpPending en IoStartPacket aanroepen
Het voorbeeldstuurprogramma voltooit de IRP niet in de verzendroutine, maar verwerkt in plaats daarvan de IRP in de StartIo-routine . Voordat dit kan, roept de verzendroutine IoMarkIrpPending aan om aan te geven dat de IRP nog niet is voltooid. Vervolgens wordt IoStartPacket aangeroepen om de IRP in de wachtrij te plaatsen voor verdere verwerking door de StartIo-routine van het stuurprogramma. De verzendroutine retourneert ook de NTSTATUS-waarde STATUS_PENDING.
In de volgende afbeelding ziet u de aanroep van IoStartPacket.
Als het stuurprogramma bezig is met het verwerken van een andere IRP op het apparaat, voegt IoStartPacket de IRP in de apparaatwachtrij die aan het apparaatobject is gekoppeld. Het stuurprogramma kan eventueel een de sleutelwaarde opgeven als parameter voor IoStartPacket om een door het stuurprogramma bepaalde volgorde op te leggen voor IRP's in de apparaatwachtrij.
Als het stuurprogramma niet bezet is en de apparaatwachtrij leeg is, roept de I/O-manager onmiddellijk de StartIo-routine aan, waarbij de invoer-IRP wordt doorgegeven.
Voor massaopslagapparaten hoeft het stuurprogramma op het laagste niveau geen routine annuleren op te geven wanneer IoStartPacket om twee redenen wordt aanroepen:
Een bestandssysteem gelaagd over een dergelijk stuurprogramma verwerkt doorgaans de annulering van I/O-aanvragen van bestanden.
Apparaatstuurprogramma's voor massaopslag verwerken IRP's snel.
Meestal verwerkt het stuurprogramma op het hoogste niveau in een keten van gelaagde stuurprogramma's de annulering van IRP's.
ToewijzenAdapterChannel en MapTransfer aanroepen
Ervan uitgaande dat de StartIo-routine , die wordt weergegeven in de afbeelding die een IRP-pad illustreert via stuurprogrammaroutines op het laagste niveau, bepaalt dat de overdrachtsaanvraag kan worden uitgevoerd door één DMA-bewerking, de StartIo-routinewijst AllocateAdapterChannel aan met het ingangspunt van de AdapterControl-routine van het stuurprogramma en de IRP.
Wanneer de systeem-DMA-controller beschikbaar is, roept de I/O-manager de AdapterControl-routine van het stuurprogramma aan om de overdrachtsbewerking in te stellen. De AdapterControl-routine roept MapTransfer aan om de DMA-controller van het systeem in te stellen. Vervolgens programmat het stuurprogramma het apparaat voor de DMA-bewerking en retourneert het. (Zie Input/Output Techniques voor meer informatie over het gebruik van DMA- en adapterobjecten.)
IoRequestDpc aanroepen vanuit de ISR van het stuurprogramma
Wanneer het apparaat een interrupt genereert om aan te geven dat de overdrachtsbewerking is voltooid, voorkomt de ISR van het stuurprogramma dat het apparaat nog meer interrupts genereert en roept IoRequestDpc aan, zoals weergegeven in de afbeelding die een IRP-pad illustreert via stuurprogrammaroutines op het laagste niveau.
Met deze oproep wordt de DpcForIsr-routine van het stuurprogramma in de wachtrij geplaatst om zoveel mogelijk van de overdrachtsbewerking met een lagere hardwareprioriteit (IRQL) te voltooien.
IoStartNextPacket en IoCompleteRequest aanroepen
Wanneer de DpcForIsr-routine klaar is met het verwerken van de overdracht, wordt IoStartNextPacket onmiddellijk aangeroepen, zodat de StartIo-routine van het stuurprogramma wordt aangeroepen met de volgende IRP in de apparaatwachtrij, indien aanwezig. De DpcForIsr-routine stelt ook het zojuist voltooide I/O-statusblok van IRP in en roept vervolgens IoCompleteRequest aan voor de IRP.
In de volgende afbeelding ziet u de aanroepen van dit stuurprogramma naar IoStartNextPacket en IoCompleteRequest.
Stuurprogramma's moeten IoStartNextPacket of IoStartNextPacketByKey aanroepen om zo snel mogelijk de volgende aangevraagde I/O-bewerking te starten, bij voorkeur voordat ze IoCompleteRequest aanroepen.
Als er IRP's in de wachtrij voor het apparaat staan, roept IoStartNextPacketKeRemoveDeviceQueue aan om de volgende IRP uit de wachtrij te verwijderen. De I/O-manager roept vervolgens de StartIo-routine van de chauffeur aan, waarbij de afbakende IRP wordt doorgegeven. Als er momenteel geen IRP's in de apparaatwachtrij staan, geeft IoStartNextPacket alleen de controle terug aan de aanroeper.
Het I/O-statusblok instellen in een IRP
Elk stuurprogramma op het laagste niveau moet het I/O-statusblok van de IRP instellen voordat IoCompleteRequest wordt aangeroepen. (In de vorige afbeelding geeft het tweede gearceerde gebied het statusblok aan.) Het I/O-statusblok levert informatie aan stuurprogramma's op een hoger niveau en uiteindelijk aan de oorspronkelijke aanvrager van de I/O-bewerking. Elk stuurprogramma op een hoger niveau dat boven het stuurprogramma in de vorige afbeelding is geplaatst, heeft mogelijk een IoCompletion-routine ingesteld waarmee het I/O-statusblok wordt gelezen dat door dit stuurprogramma is ingesteld. Stuurprogramma's op een hoger niveau wijzigen meestal het I/O-statusblok niet in een IRP die is voltooid door een apparaatstuurprogramma, tenzij het stuurprogramma op een hoger niveau de IRP opnieuw probeert uit te voeren. In dat geval wordt het I/O-statusblok opnieuw geïnitialiseerd.
Elk stuurprogramma op een hoger niveau dat een IRP voltooit zonder het naar het volgende lagere stuurprogramma te verzenden, moet ook het I/O-statusblok in die IRP instellen voordat IoCompleteRequest wordt aangeroepen. Voor een goede algemene I/O-doorvoer moet een stuurprogramma op een hoger niveau de parameters controleren op een eigen I/O-stacklocatie van elke IRP en, als de parameters ongeldig zijn, het I/O-statusblok instellen en de aanvraag zelf voltooien. Indien mogelijk moet een stuurprogramma voorkomen dat een ongeldige aanvraag wordt doorgestuurd naar lagere stuurprogramma's binnen de keten.
Ervan uitgaande dat de overdrachtsbewerking in de vorige afbeelding is geslaagd, stelt de DpcForIsr-routine, weergegeven in de afbeelding die een IRP-pad illustreert door laagste-niveau stuurprogramma-routines, STATUS_SUCCESS in Status en het aantal overgedragen bytes in Informatie voor het statusblok van de IRP.
Veel van de standaardstuurprogrammaroutines retourneren ook NTSTATUS-typewaarden. Zie Logboekregistratiefouten voor meer informatie over NTSTATUS-constanten zoals STATUS_SUCCESS.