共用方式為


取消 DMA 交易

[僅適用於 KMDF]

如果您的驅動程式已使用 1.11 版或更新版本的 KMDF 來建置,且使用直接記憶體存取 (DMA) 第 3 版在 Windows 8 或更新版本上執行,則驅動程式可以呼叫 WdfDmaTransactionCancel 方法,嘗試取消擱置的 DMA 交易。

呼叫 WdfDmaTransactionCancel時,驅動程式必須確保在呼叫期間未完成指定的 DMA 交易。 驅動程式可以使用下列技術,在 DMA 通道配置之前或某些數目的傳輸作業完成之後,安全地取消交易:

  1. 在驅動程式的其中一個 要求處理程式中,驅動程式會呼叫 WdfRequestMarkCancelableEx,並提供 I/O 要求的 EvtRequestCancel 回呼函式。 然後要求處理程式會呼叫 WdfDmaTransactionExecute

  2. 驅動程式的 EvtRequestCancel 回呼函式(可能會在呼叫 WdfRequestMarkCancelableEx之後立即在另一個線程中執行)將呼叫 WdfDmaTransactionCancel

  3. 如果在呼叫 WdfDmaTransactionExecute之後,但在 WdfDmaTransactionExecute 方法開始 DMA 分配之前呼叫 WdfDmaTransactionCancel,則交易取消會成功,並且 WdfDmaTransactionCancel 傳回 TRUE。 在此情況下,驅動程式的 EvtRequestCancel 回呼函式必須 完成 DMA 交易WdfDmaTransactionExecute 會傳回錯誤值。

  4. 如果驅動程式在 WdfDmaTransactionExecute 方法啟動 DMA 配置之後呼叫 WdfDmaTransactionCancel,則嘗試取消交易會失敗,WdfDmaTransactionCancel 傳回 FALSE。 在此情況下,WdfDmaTransactionExecute 會傳回STATUS_SUCCESS,而且驅動程式的要求處理程式必須 完成 DMA 交易

    此時,如果驅動程式使用系統模式 DMA,EvtRequestCancel 回呼函式可能會呼叫 WdfDmaTransactionStopSystemTransfer 嘗試停止進行中的系統模式 DMA 傳輸。 如需示範如何執行這項作業的程式碼範例,請參閱 WdfDmaTransactionStopSystemTransfer

  5. WdfDmaTransactionExecute 方法完成 DMA 配置之後,架構會呼叫驅動程式的 EvtProgramDma 回呼函式(這可能會在呼叫 WdfDmaTransactionExecute之後立即在另一個線程中執行)。 此時,呼叫 WdfDmaTransactionCancel 方法會傳回 FALSE。

    EvtProgramDma中,驅動程式可以呼叫 WdfRequestUnmarkCancelable,以結束要求被取消的可能性。 如果 WdfRequestUnmarkCancelable 傳回 STATUS_SUCCESS,回呼函式必須設定硬體以開始傳輸。 如果 WdfRequestUnmarkCancelable 傳回狀態碼 STATUS_CANCELLED,則要求已取消。 在此情況下,EvtProgramDma 必須呼叫 WdfDmaTransactionDmaCompletedFinal,才能 完成 DMA 交易

    驅動程式可以使用相同的技術,在完成一些傳輸作業之後取消 DMA 交易。 在此情況下,驅動程式在呼叫 WdfDmaTransactionDmaCompleted之後,會呼叫 WdfDmaTransactionCancel,但在架構呼叫 EvtProgramDma 以設置下一次傳輸操作之前。 如果驅動程式在呼叫 WdfDmaTransactionDmaCompleted之前呼叫 WdfDmaTransactionCancel ,則 WdfDmaTransactionDmaCompleted 傳回 TRUE,表示 DMA 交易已完成。