共用方式為


WdfDmaTransactionDmaCompletedWithLength 函式 (wdfdmatransaction.h)

[僅適用於 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)

另請參閱

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength