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);
}
}