Skapa kontrollantobjekt och kontrollanttillägg

Om en drivrutin använder ett kontrollantobjekt måste den anropa IoCreateController när den har skapat enhetsobjekt och dess enhet är redo för I/O, vanligtvis efter att en PnP-IRP_MN_START_DEVICE begäran har tagits emot. Följande bild illustrerar anropet.

diagram som illustrerar ett kontrollantobjekt.

Varje kontrollantobjekt har ett associerat kontrollanttillägg. Som föregående bild visar, avgör anroparen av IoCreateController storleken på kontrollertillägget. Dess struktur och innehåll är drivrutinsdefinierade.

Förutom den enhetsspecifika tillståndsinformation som drivrutinen har om den fysiska kontrollanten (eller enheten med kanaler) visar föregående bild en representativ uppsättning drivrutinsdefinierade data för ett kontrollanttillägg.

PtrToControllerObject pekare som returneras av IoCreateController, måste skickas i drivrutinsanropen till IoAllocateController och IoFreeController, som beskrivs i Allokering av kontrollerobjekt för I/O-operationer. Drivrutinen måste lagra den returnerade styrenhetsobjektpekaren i enhetstilläggen för sina enhetsobjekt som skapats av drivrutinen eller i ett annat lagringsområde som är tillgängligt för drivrutiner (icke-sidsidig pool, allokerad av drivrutinen). Om drivrutinen tas bort måste den också skicka kontrollantobjektpekaren till IoDeleteController.

De flesta drivrutiner som konfigurerar kontrollantobjekt tycker att det är praktiskt att lagra en pekare till det aktuella målenhetsobjektet eller enhetstillägget i kontrollanttillägget. Vanligtvis lagrar en sådan drivrutin kontrollantobjektpekaren i vart och ett av dess enhetstillägg så att den kan använda ControllerObject–>ControllerExtension pekare för åtkomst till drivrutinsunderhållna, kontrollantspecifika tillstånd om I/O-åtgärder för varje målenhetsobjekt.

Om den fysiska kontrollant som representeras av ett kontrollantobjekt genererar avbrott kan en drivrutin också använda kontrollanttillägget som lagring för PtrToInterruptObject pekare som returneras av IoConnectInterrupt. Mer information finns i Avbrottstjänstrutiner.

IoCreateController allokerar resident lagring för kontrollantobjektet och tillägget, vilket initieras med nollor. Om det inte går att allokera minnet returnerar IoCreateController en NULL- pekare. Om detta inträffar måste drivrutinen misslyckas med att starta enheten och returnera STATUS_INSUFFICIENT_RESOURCES.