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

如果驱动程序提供无效的对象句柄,则会发生 bug 检查。

注解

当驱动程序调用 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
                           );
}

要求

要求
目标平台 通用
最低 KMDF 版本 1.0
标头 wdfdmatransaction.h (包括 Wdf.h)
Library Wdf01000.sys (请参阅框架库版本控制.)
IRQL <=DISPATCH_LEVEL
DDI 符合性规则 DriverCreate (kmdf) KmdfIrql (kmdf) KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf)

另请参阅

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength