Condividi tramite


Requisiti per la routine di controllo del controller

Come suggerisce il nome, una routine ControllerControl è associata a un oggetto controller. Quando viene eseguita la routine ControllerControl , l'hardware rappresentato dall'oggetto controller è libero e l'estensione del controller in genere non è accessibile da un'altra routine driver, a meno che l'estensione del controller non contenga il contesto condiviso con l'ISR del driver.

In genere, una routine ControllerControl esegue almeno le operazioni seguenti:

  1. Aggiorna o inizializza qualsiasi contesto gestito dal driver nell'estensione del dispositivo di destinazione e nell'estensione del controller

    Se il driver usa DMA, la routine ControllerControl in genere è responsabile di determinare se una determinata richiesta di trasferimento deve essere suddivisa in trasferimenti parziali a causa di eventuali limitazioni imposte dal sistema o imposte dal dispositivo sulle dimensioni di ogni trasferimento DMA. In queste circostanze, la routine ControllerControl è anche responsabile della chiamata di AllocateAdapterChannel se il driver ha una routine AdapterControl .

    Se il driver usa PIO, la routine ControllerControl è anche responsabile della suddivisione delle richieste di trasferimento, se l'hardware lo richiede, in intervalli di trasferimento parziale e per chiamare MmGetSystemAddressForMdlSafe con MDL in Irp-MdlAddress>.

  2. Programma l'hardware per l'operazione di I/O richiesta

    Se è possibile accedere all'estensione del dispositivo o del controller dall'ISR, la routine ControllerControl deve usare una routine SynchCritSection richiamata chiamando KeSynchronizeExecution. Per altre informazioni, vedere Uso di sezioni critiche.

Se il driver ha una routine Cancel, la routine ControllerControl deve anche controllare il campo Irp-Cancel> per determinare se l'IRP corrente deve essere annullata ed eseguire una delle operazioni seguenti:

Se Irp-Cancel> è impostato su TRUE, la routine ControllerControl deve eseguire le operazioni seguenti:

  1. Impostare STATUS_CANCELLED per Stato e zero per Informazioni nel blocco di stato di I/O dell'IRP.

  2. Chiama IoFreeController per rilasciare l'oggetto controller in modo che l'operazione successiva del dispositivo possa essere avviata tempestivamente.

  3. Chiamare IoStartNextPacket o rimuovere dalla coda il successivo IRP se il driver gestisce il proprio accodamento.

  4. Completare l'IRP annullato con IoCompleteRequest e restituire il controllo.

Se Irp-Cancel> non è impostato su TRUE, la routine ControllerControl deve invece eseguire le operazioni seguenti:

  1. Chiamare IoSetCancelRoutine per reimpostare il punto di ingresso della routine Cancel per IRP su NULL. Acquisire il blocco di selezione di annullamento per questa chiamata se il driver usa la coda del dispositivo fornita dal gestore di I/O nell'oggetto dispositivo.

  2. Programmare l'hardware per l'operazione di I/O richiesta usando una routine SynchCritSection richiamata chiamando KeSynchronizeExecution. Per altre informazioni, vedere Uso di sezioni critiche

Per altre informazioni sulla gestione di IRP annullabili, vedere Annullamento degli IRP.

Per la maggior parte delle operazioni di I/O basate su interrupt, ad eccezione delle operazioni sovrapposte su dispositivi diversi collegati al controller fisico/adattatore, una routine ControllerControl deve restituire KeepObject perché la routine DpcForIsr o CustomDpc completa l'operazione e l'IRP.

Non appena vengono eseguite le operazioni di I/O per soddisfare la richiesta corrente, la routine che completerà l'IRP deve chiamare IoFreeController e IoStartNextPacket in modo che la richiesta successiva possa essere elaborata il più rapidamente possibile.

Se la routine ControllerControl stessa completa un IRP o se può configurare un'operazione, ad esempio una ricerca su disco, per un oggetto dispositivo di destinazione (disco) che potrebbe essere sovrapposto a un'operazione per un altro oggetto dispositivo, la routine ControllerControl deve restituire DeallocateObject.