完成 DMA 交易
[僅適用于 KMDF]
每次驅動程式的裝置 完成 DMA 傳輸時,驅動程式都必須呼叫 WdfDmaTransactionDmaCompleted、 WdfDmaTransactionDmaCompletedWithLength或 WdfDmaTransactionDmaCompletedFinal ,然後檢查傳回值。
當傳回值為 TRUE時,DMA 交易不需要更多傳輸,而且驅動程式必須完成 DMA 交易。 一般而言,驅動程式尚未從其 EvtInterruptDpc 回呼函式傳回。 因此,此回呼函式會透過下列方式完成 DMA 交易:
呼叫WdfObjectDelete以刪除交易對象,如果驅動程式重複使用 DMA 交易對象,則呼叫WdfDmaTransactionRelease。
如果交易與架構要求物件相關聯,則呼叫WdfRequestComplete 或 WdfRequestCompleteWithInformation。
如果驅動程式呼叫 WdfRequestCompleteWithInformation,通常會先呼叫 WdfDmaTransactionGetBytesTransferred ,以取得所有交易傳輸 (位元組總數) 。
下列步驟說明于下列程式碼範例中,取自Isrdpc.c檔案中PLX9x5x範例的EvtInterruptDpc回呼函式:
if (readComplete) {
BOOLEAN transactionComplete;
WDFDMATRANSACTION dmaTransaction;
size_t bytesTransferred;
// Get the current Read DmaTransaction.
dmaTransaction = devExt->CurrentReadDmaTransaction;
// Indicate that this DMA operation has completed:
// This may start the transfer on the next packet if
// there is still data to be transferred.
transactionComplete =
WdfDmaTransactionDmaCompleted( dmaTransaction, &status );
if (transactionComplete) {
// Complete the DmaTransaction and the request.
devExt->CurrentReadDmaTransaction = NULL;
bytesTransferred =
((NT_SUCCESS(status)) ?
WdfDmaTransactionGetBytesTransferred(dmaTransaction): 0 );
WdfDmaTransactionRelease(dmaTransaction);
WdfRequestCompleteWithInformation(request, status, bytesTransferred);
}
}