[仅适用于 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) |