Riservare risorse DMA

[Si applica solo a KMDF]

In genere, i driver basati su framework non riservano i registri della mappa in anticipo. Tuttavia, in determinate circostanze, i driver potrebbero dover riservare queste risorse in anticipo.

I driver basati su framework in esecuzione in Windows 8 o versioni successive possono riservare un numero specificato di registri mappa per un abilitatore DMA che specifica un pacchetto o un profilo di sistema. A tale scopo, il driver chiama WdfDmaTransactionAllocateResources e registra una funzione di callback EvtReserveDma .

Il framework chiama la funzione EvtReserveDma del driver quando ha riservato i registri della mappa e il blocco della scheda DMA WDM. Il driver può quindi inizializzare e avviare la transazione più volte usando lo stesso oggetto transazione prima di rilasciare l'oggetto transazione. Per rilasciare nuovamente le risorse DMA nel sistema, il driver chiama WdfDmaTransactionFreeResources.

Per determinare il numero di registri di mappa necessari per una transazione, il driver può chiamare WdfDmaTransactionGetTransferInfo prima di chiamare WdfDmaTransactionAllocateResources. Il driver deve inizializzare la transazione prima di chiamare WdfDmaTransactionGetTransferInfo.

La procedura seguente illustra come un driver può riservare e rilasciare un abilitatore DMA per l'uso esclusivo con una transazione specificata:

  1. Il driver riceve una richiesta di I/O.

  2. Il gestore delle richieste del driver chiama WdfDmaTransactionCreate per creare un oggetto transazione DMA per la richiesta.

  3. Il gestore delle richieste del driver chiama WdfDmaTransactionAllocateResources per riservare le risorse.

  4. Il framework chiama EvtReserveDma quando ha riservato le risorse richieste.

  5. In EvtReserveDma il driver chiama WdfDmaTransactionInitializeUsingRequest o WdfDmaTransactionInitialize per inizializzare l'oggetto transazione.

  6. In EvtReserveDma il driver chiama il metodo WdfDmaTransactionExecute per avviare la transazione. Poiché la transazione ha risorse riservate, il framework chiama immediatamente la funzione di callback evtProgramDma del driver.

  7. Da EvtInterruptDpc o EvtDmaTransactionDmaTransferComplete, il driver chiama WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength o WdfDmaTransactionDmaCompletedFinal, seguito da WdfObjectDelete o WdfDmaTransactionRelease. Il driver non deve eliminare o rilasciare la transazione finché la transazione non è stata completata o annullata. Al termine di questo passaggio, i registri della mappa rimangono riservati.

  8. Il driver può ripetere i passaggi da 5 a 7 volte più necessario.

    Quando il driver non ha più bisogno della prenotazione, il driver chiama WdfDmaTransactionFreeResources da EvtInterruptDpc o EvtDmaTransactionDmaTransferComplete. In alternativa, il driver può chiamare WdfDmaTransactionFreeResources dalla relativa funzione di callback degli eventi EvtReserveDma .