保留 DMA 資源

[僅適用于 KMDF]

一般而言,架構型驅動程式不會事先保留對應暫存器。 不過,在某些情況下,驅動程式可能需要事先保留這些資源。

在 Windows 8 或更新版本上執行的架構型驅動程式可以針對指定封包或系統設定檔的 DMA 啟用程式保留指定的對應暫存器數目。 若要這樣做,驅動程式會呼叫 WdfDmaTransactionAllocateResources 並註冊 EvtReserveDma 回 呼函式。

當驅動程式保留對應暫存器和 WDM DMA 配接器的鎖定時,架構會呼叫驅動程式的 EvtReserveDma 函式。 驅動程式接著可以使用相同的交易對象多次初始化和起始交易,最後再釋放交易對象。 若要將 DMA 資源釋放回系統,驅動程式會呼叫 WdfDmaTransactionFreeResources

若要判斷交易所需的對應暫存器數目,驅動程式可以在呼叫 WdfDmaTransactionGetTransferInfo 之前呼叫 WdfDmaTransactionAllocateResources。 驅動程式必須先初始化交易,才能呼叫 WdfDmaTransactionGetTransferInfo

下列步驟示範驅動程式如何保留和釋放 DMA 啟用器,以便與指定的交易獨佔使用:

  1. 驅動程式會收到 I/O 要求。

  2. 驅動程式 的要求處理常式 會呼叫 WdfDmaTransactionCreate 來建立要求的 DMA 交易對象。

  3. 驅動程式 的要求處理常式 會呼叫 WdfDmaTransactionAllocateResources 來保留資源。

  4. 當架構已保留要求的資源時,架構會呼叫 EvtReserveDma

  5. EvtReserveDma中,驅動程式會呼叫 WdfDmaTransactionInitializeUsingRequestWdfDmaTransactionInitialize 來初始化交易對象。

  6. EvtReserveDma中,驅動程式會呼叫 WdfDmaTransactionExecute 方法來啟動交易。 因為交易有保留的資源,所以架構會立即呼叫驅動程式的 EvtProgramDma 回 呼函式。

  7. EvtInterruptDpcEvtDmaTransactionDmaTransferComplete,驅動程式會呼叫 WdfDmaTransactionDmaCompletedWdfDmaTransactionDmaCompletedWithLengthWdfDmaTransactionDmaCompletedFinal,後面接著 WdfObjectDeleteWdfDmaTransactionRelease。 在交易完成或取消之前,驅動程式不得刪除或釋放交易。 完成此步驟之後,地圖暫存器會保留保留。

  8. 驅動程式可以視需要重複步驟 5-7 多次。

    當驅動程式不再需要保留時,驅動程式會從EvtInterruptDpcEvtDmaTransactionDmaTransactionDmaTransferComplete呼叫WdfDmaTransactionFreeResources。 或者,驅動程式可以從其 EvtReserveDma事件回呼函式呼叫WdfDmaTransactionFreeResources