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

如果驅動程式提供無效的物件句柄,就會發生錯誤檢查。

備註

當您的驅動程式呼叫 WdfDmaTransactionDmaCompletedWithLength 方法時,架構會結束目前的傳輸,並視需要啟動新的傳輸。

WdfDmaTransactionDmaCompletedWithLength 方法的行為與 WdfDmaTransactionDmaCompleted 相同,不同之處在於驅動程式會呼叫 WdfDmaTransactionDmaCompletedWithLength 來報告已傳輸位元組數目的裝置。 如果需要多個傳輸才能完成交易,架構會使用報告位元組計數來判斷指定 DMA 交易的下一個 DMA 傳輸的開頭。

如需完成 DMA 傳輸的詳細資訊,請參閱 完成 DMA 傳輸

範例

下列程式代碼範例來自 PLX9x5x 範例驅動程式。 此範例會呼叫 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
                           );
}

規格需求

需求
目標平台 Universal
最小 KMDF 版本 1.0
標頭 wdfdmatransaction.h (包含 Wdf.h)
程式庫 Wdf01000.sys (請參閱 Framework Library Versioning.)
IRQL <=DISPATCH_LEVEL
DDI 合規性規則 DriverCreate (kmdf) KmdfIrql (kmdf) KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf)

另請參閱

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength