[僅適用於 KMDF]
WdfDmaTransactionDmaCompletedWithLength 方法會通知架構裝置的 DMA 傳輸作業已完成,並提供已完成傳輸的長度。
語法
BOOLEAN WdfDmaTransactionDmaCompletedWithLength(
[in] WDFDMATRANSACTION DmaTransaction,
[in] size_t TransferredLength,
[out] NTSTATUS *Status
);
參數
[in] DmaTransaction
驅動程式從先前呼叫 WdfDmaTransactionCreate取得的 DMA 交易物件的句柄。
[in] TransferredLength
裝置在目前 DMA 傳輸中傳輸的位元組數目。
[out] Status
接收 DMA 傳輸狀態之位置的指標。 如需詳細資訊,請參閱 WdfDmaTransactionDmaCompleted的一節。
返回值
WdfDmaTransactionDmaCompletedWithLength 會傳回 FALSE ,如果需要額外的傳輸才能完成 DMA 交易,狀態 會收到STATUS_MORE_PROCESSING_REQUIRED。 如果沒有額外的傳輸,此方法會傳回 true TRUE。
如果驅動程式提供無效的物件句柄,就會發生錯誤檢查。
備註
當驅動程式呼叫 WdfDmaTransactionDmaCompletedWithLength 方法時,架構會結束目前的傳輸,並視需要啟動新的傳輸。
WdfDmaTransactionDmaCompletedWithLength 方法的行為與 WdfDmaTransactionDmaCompleted相同,不同之處在於驅動程式會針對回報已傳輸位元組數目的裝置呼叫 WdfDmaTransactionDmaCompletedWithLength。 如果需要多個傳輸才能完成交易,架構會使用報告的位元組計數來判斷指定 DMA 交易的下一個 DMA 傳輸的開頭。
如需完成 DMA 傳輸的詳細資訊,請參閱 完成 DMA 傳輸。
範例
下列程式代碼範例來自 PLX9x5x5x 範例驅動程式。 本範例會呼叫 WdfDmaTransactionGetCurrentDmaTransferLength 來判斷目前傳輸的原始長度,然後計算實際的傳輸長度。 接下來,此範例會呼叫 WdfDmaTransactionDmaCompletedWithLength 報告架構的實際傳輸長度。 如果目前的傳輸是交易的最後一個,此範例會呼叫完成 I/O 要求的私用例程。
BOOLEAN hasTransitioned;
PDMA_TRANSFER_ELEMENT dteVA;
ULONG length;
//
// Use "DMA Clear-Count Mode" to get the complementary
// transferred byte count.
//
length = WdfDmaTransactionGetCurrentDmaTransferLength(dmaTransaction);
dteVA = (PDMA_TRANSFER_ELEMENT) devExt->ReadCommonBufferBase;
while(dteVA->DescPtr.LastElement == FALSE) {
length -= dteVA->TransferSize;
dteVA++;
}
length -= dteVA->TransferSize;
//
// Indicate that this DMA operation has completed.
//
hasTransitioned =
WdfDmaTransactionDmaCompletedWithLength(
dmaTransaction,
length,
&status
);
if (hasTransitioned) {
//
// Complete this DMA transaction.
//
devExt->CurrentReadDmaTransaction = NULL;
PLxReadRequestComplete(
dmaTransaction,
status
);
}
需求
要求 | 價值 |
---|---|
目標平臺 | 普遍 |
最低 KMDF 版本 | 1.0 |
標題 | wdfdmatransaction.h (包括 Wdf.h) |
程式庫 | Wdf01000.sys (請參閱架構連結庫版本控制。) |
IRQL | <=DISPATCH_LEVEL |
DDI 合規性規則 | DriverCreate(kmdf),KmdfIrql(kmdf),KmdfIrql2(kmdf),KmdfIrqlExplicit(kmdf) |