共用方式為


保留 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 次。

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