共用方式為


取消 DMA 交易

[僅適用于 KMDF]

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

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

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

  2. 驅動程式的EvtRequestCancel回呼函式 (,可能會在呼叫 WdfRequestMarkCancelableEx) 呼叫 WdfDmaTransactionCancel之後立即在不同的執行緒中執行。

  3. 如果 呼叫 WdfDmaTransactionCancel 發生在 呼叫 WdfDmaTransactionExecute之後,但在 WdfDmaTransactionExecute 方法啟動 DMA 配置之前,交易取消會成功,而 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 之後呼叫 WdfDmaTransactionDmaCompleted,但在架構呼叫EvtProgramDma之前呼叫WdfDmaTransactionCancel,以撰寫下一個傳輸作業的程式。 如果驅動程式在呼叫WdfDmaTransactionDmaCompleted之前呼叫WdfDmaTransactionCancelWdfDmaTransactionDmaCompleted會傳回TRUE,表示 DMA 交易已完成。