Creazione di oggetti controller ed estensioni controller

Se un driver usa un oggetto controller, deve chiamare IoCreateController dopo aver creato gli oggetti dispositivo e quando il dispositivo è pronto per l'I/O, in genere dopo aver ricevuto una richiesta PnP di IRP_MN_START_DEVICE. La figura seguente illustra la chiamata.

diagramma che illustra un oggetto controller.

Ogni oggetto controller ha un'estensione associata del controller. Come illustrato nella figura precedente, il chiamante di IoCreateController determina le dimensione dell'estensione del controller. La struttura e il contenuto sono definiti dal driver.

Oltre alle informazioni sullo stato specifico del dispositivo che il driver gestisce sul controller fisico (o sul dispositivo con canali), la figura precedente mostra un set rappresentativo di dati definiti dal driver per un'estensione del controller.

Il puntatore PtrToControllerObject, restituito da IoCreateController, deve essere passato nelle chiamate del driver a IoAllocateController e IoFreeController, descritto in Allocating Controller Objects for I/O Operations. Il driver deve archiviare il puntatore all'oggetto controller restituito nelle estensioni dei dispositivi creati dal driver o in un'altra area di archiviazione residente accessibile al driver (pool non di paging, allocato dal driver). Se il driver viene scaricato, deve anche passare il puntatore dell'oggetto controller a IoDeleteController.

La maggior parte dei driver che configura oggetti controller trova conveniente memorizzare un puntatore all'oggetto dispositivo di destinazione corrente o all'estensione del dispositivo nell'estensione del controller. In genere, un driver di questo tipo archivia il puntatore dell'oggetto controller in ognuna delle sue estensioni del dispositivo affinché possa utilizzare il puntatore ControllerObject->ControllerExtension per accedere allo stato mantenuto dal driver e specifico del controller in relazione alle operazioni di I/O per ogni oggetto dispositivo di destinazione.

Se il controller fisico rappresentato da un oggetto controller genera interrupt, un driver può usare anche l'estensione del controller come risorsa di archiviazione per PtrToInterruptObject puntatori restituiti da IoConnectInterrupt. Per ulteriori informazioni, vedere routine di servizio di interruzione.

IoCreateController alloca la memoria residente per l'oggetto controller e l'estensione, che inizializza con zeri. Se non è in grado di allocare la memoria, IoCreateController restituisce un puntatore NULL. In questo caso, il driver deve fallire l'avvio del dispositivo e deve restituire STATUS_INSUFFICIENT_RESOURCES.