Condividi tramite


Requisiti delle routine ControllerControl

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 quanto segue:

  1. Aggiornamenti 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 della determinazione 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, anche la routine ControllerControl è 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 delle sezioni critiche.

Se il driver ha una routine Cancel, anche la routine ControllerControl deve 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. Chiamare IoFreeController per rilasciare l'oggetto controller in modo che l'operazione successiva del dispositivo possa essere avviata tempestivamente.

  3. Chiamare IoStartNextPacket o annullare la coda dell'IRP successivo se il driver gestisce la propria accodamento.

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

Se Irp-Cancel> non è impostato su TRUE, la routine ControllerControl deve 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 delle sezioni critiche

Per altre informazioni sulla gestione di IRP annullabili, vedere Annullamento dei runtime di integrazione.

Per la maggior parte delle operazioni di I/O basate su interrupt, ad eccezione delle operazioni sovrapposte su dispositivi diversi collegati al controller/adattatore fisico, 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 è in grado di 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.