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

如果驱动程序提供无效的对象句柄,则会发生 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)
图书馆 Wdf01000.sys(请参阅框架库版本控制。
IRQL <=DISPATCH_LEVEL
DDI 符合性规则 DriverCreate(kmdf)KmdfIrql(kmdf)KmdfIrql2(kmdf),KmdfIrqlExplicit(kmdf)

另请参阅

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength