Allocazione di oggetti controller per operazioni di I/O

Dopo che un driver che usa un oggetto controller ha avviato il dispositivo, è pronto per elaborare i runtime di integrazione inviati agli oggetti dispositivo di destinazione. Ogni volta che un IRP richiede al driver di programmare il dispositivo fisico rappresentato dall'oggetto controller per un'operazione di I/O, il driver chiama IoAllocateController. Nella figura seguente viene illustrata una chiamata di questo tipo.

Diagramma che illustra l'allocazione di un oggetto controller per i/o.

Come illustrato nella figura precedente, un driver deve fornire più del puntatore ControllerObjectrestituito da IoCreateController quando chiama IoAllocateController. Insieme a questo puntatore, deve passare puntatori all'oggetto dispositivo che rappresenta la destinazione della richiesta di I/O corrente, a una routine ControllerControl fornita dal driver e a qualsiasi routine ControllerControlcontesto dovrà configurare il dispositivo per l'operazione di I/O richiesta.

IoAllocateController accoda la routine ControllerControl fornita dal driver se il dispositivo rappresentato dall'oggetto controller è occupato. In caso contrario, la routine ControllerControl viene chiamata immediatamente con i parametri di input illustrati nella figura precedente. Il puntatore di contesto di input a IoAllocateController viene passato alla routine ControllerControl del driver quando viene eseguita.

Usare le linee guida seguenti per determinare dove archiviare le informazioni sul contesto:

  • L'area del contesto fornita dal driver non deve trovarsi nell'estensione del controller, a meno che il driver non elabori ogni IRP fino al completamento prima di avviare un'altra operazione sul controller fisico. In caso contrario, un'area di contesto nell'estensione del controller potrebbe essere sovrascritta da altre routine del driver o al ricevimento di un nuovo IRP.

  • Anche se il driver si sovrappone a un'operazione di I/O del dispositivo per un altro oggetto dispositivo, non è possibile sovrascrivere un'area di contesto nell'estensione del dispositivo di destinazione dell'oggetto dispositivo di destinazione.

  • Se viene effettuata un'altra richiesta di I/O per un oggetto dispositivo specifico e il driver ha una routine StartIo , non è possibile sovrascrivere un'area di contesto nella relativa estensione del dispositivo perché l'IRP in ingresso verrà accodato quando il driver chiama IoStartPacket e lo stesso IRP rimarrà nella coda del dispositivo fino a quando il driver chiama IoStartNextPacket appena prima di completare l'IRP corrente per tale oggetto dispositivo.

Il gestore di I/O passa un puntatore alla routine DeviceObject-CurrentIrp> a una routine ControllerControl se il driver ha una routine StartIo. Se un driver gestisce la propria accodamento di irP invece di avere una routine StartIo , il gestore di I/O non può assegnare alla routine ControllerControl un puntatore all'IRP corrente. Quando il driver chiama IoAllocateController, deve passare l'IRP corrente come parte dei dati accessibili dal contesto.

La routine del driver che chiama IoAllocateController deve essere in esecuzione in IRQL = DISPATCH_LEVEL quando viene eseguita la chiamata. Un driver che effettua questa chiamata dalla routine StartIo è già in esecuzione in DISPATCH_LEVEL.

La routine ControllerControl configura il controller fisico per l'operazione richiesta di IRP.

Come illustrato nella figura precedente, la routine ControllerControl restituisce un valore di tipo IO_ALLOCATION_ACTION, che può essere uno dei valori definiti dal sistema seguenti:

  • Se la routine ControllerControl può avviare un'altra operazione nel controller fisico, deve restituire DeallocateObject in modo che il driver possa sovrapporsi all'operazione di I/O richiesta successiva.

    Ad esempio, se la routine ControllerControl può programmare un controller disco per un'operazione di ricerca su un disco, completare l'IRP e restituire DeallocateObject, la routine ControllerControl può essere chiamata di nuovo per programmare il controller del disco per un'operazione di trasferimento sull'altro disco se le richieste di trasferimento sono attualmente accodate all'altro disco.

  • Se l'IRP corrente richiede un'ulteriore elaborazione da parte di altre routine driver, la routine ControllerControl deve restituire KeepObject.

    Ad esempio, se il driver programma un controller disco per un'operazione di trasferimento ma non può completare l'IRP fino al completamento del trasferimento, la routine ControllerControl deve restituire KeepObject.

Quando una routine ControllerControl restituisce KeepObject, in genere l'ISR del driver viene eseguito quando il dispositivo interrompe e la routine DpcForIsr o CustomDpc completa l'operazione di I/O e l'IRP corrente per l'oggetto dispositivo di destinazione.

Ogni volta che la routine ControllerControl restituisce KeepObject, la routine che completa l'IRP deve chiamare IoFreeController. Una routine del driver di questo tipo deve chiamare IoFreeController il prima possibile in modo che la successiva operazione di I/O del dispositivo possa essere configurata tempestivamente.