Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Come minimo, una routine AdapterControl deve eseguire le operazioni seguenti:
Salvare il valore MapRegisterBase di input insieme alle altre informazioni di contesto necessarie al driver per eseguire una o più operazioni di trasferimento DMA per l'IRP corrente. Il driver deve passare il valore MapRegisterBase a FlushAdapterBuffers al termine di ogni operazione di trasferimento DMA.
Restituisce il valore IO_ALLOCATION_ACTION appropriato:
KeepObject se il dispositivo è un dispositivo subordinato in modo che il driver usi DMA di sistema.
DeallocateObjectKeepRegisters se il dispositivo è un bus master, in modo che il driver utilizzi la DMA basata su pacchetti e bus master.
A seconda della progettazione del driver, la routine AdapterControl può anche eseguire le operazioni seguenti prima di restituire il controllo:
Determinare la posizione iniziale per il trasferimento nel dispositivo.
Calcolare le dimensioni del trasferimento possibile, date eventuali limitazioni del dispositivo a causa della posizione iniziale del trasferimento.
In generale, è responsabilità della routine che chiama AllocateAdapterChannel determinare se una richiesta di trasferimento deve essere suddivisa in trasferimenti parziali a causa di eventuali limitazioni specifiche della piattaforma sul NumberOfMapRegisters disponibili per ogni operazione di trasferimento DMA, come indicato nella sezione precedente e dettagliato in Suddivisione delle richieste di trasferimento.
Configurare qualsiasi stato gestito dal driver su ogni richiesta di trasferimento nell'estensione del dispositivo (o del controller).
Ad esempio, una routine AdapterControl potrebbe chiamare KeSetTimer con il punto di ingresso per una routine CustomTimerDpc che verifica il timeout delle operazioni di trasferimento DMA per il driver.
Chiamare MmGetMdlVirtualAddress con il puntatore MDL passato in Irp-MdlAddress> per ottenere un indice per l'inizio del trasferimento, adatto per il passaggio a MapTransfer.
Chiamare MapTransfer per configurare il controller DMA di sistema o per ottenere un mapping di indirizzi fisici-logici per un dispositivo bus-master.
Programmare il dispositivo del driver per un'operazione di trasferimento usando una routine SynchCritSection richiamata chiamando KeSynchronizeExecution. Per altre informazioni, vedere Uso di sezioni critiche.
Se una richiesta di trasferimento richiede al driver di eseguire una sequenza di operazioni di trasferimento parziale per soddisfare l'IRP corrente, la routine DpcForIsr o CustomDpc del driver è in genere responsabile della riprogrammazione del dispositivo per le successive operazioni di trasferimento. Una routine AdapterControl viene chiamata una sola volta per ogni IRP di trasferimento in ingresso.
La routine del driver che completa l'IRP di trasferimento corrente, in genere la routine DpcForIsr o CustomDpc, è anche responsabile del rilascio del controller DMA di sistema o dell'adattatore bus-master chiamandoli rispettivamente FreeAdapterChannel o FreeMapRegisters. Questa routine del driver deve effettuare la chiamata appropriata il prima possibile quando viene eseguita l'ultima operazione di trasferimento parziale in modo che i driver dei dispositivi DMA subordinati possano allocare il controller DMA di sistema o un driver master del bus può iniziare a elaborare tempestivamente il successivo IRP di trasferimento.