重复使用 DMA 事务对象

[仅适用于 KMDF]

在驱动程序处理与 DMA 事务关联的所有 DMA 传输后,驱动程序可以删除或重用事务对象。 通常,驱动程序的 EvtInterruptDpc 回调函数通过调用 WdfObjectDelete) 删除 (事务对象。 随后,当驱动程序创建新的 DMA 事务时,它会调用 WdfDmaTransactionCreate 来创建新的事务对象。

但是,有时,驱动程序重用事务对象是有益的。 在这种情况下,驱动程序调用 WdfDmaTransactionRelease 而不是 WdfObjectDelete

例如,假设驱动程序和设备必须在计算机内存资源不足时运行。 若要处理此内存问题,驱动程序可以使用以下过程:

  1. 驱动程序的 EvtDriverDeviceAdd 回调函数可以调用 WdfDmaTransactionCreate 来创建一个或多个事务对象。 驱动程序将句柄保存到这些事务对象。

  2. 每次驱动程序准备好创建和初始化新事务时,它都会调用 WdfDmaTransactionCreate。 如果此方法返回STATUS_INSUFFICIENT_RESOURCES,驱动程序可以使用其中一个存储的事务对象。

  3. 如果驱动程序使用其中一个存储的事务对象,则应在事务完成时重用事务对象,而不是删除它。 驱动程序通过调用 WdfDmaTransactionRelease 而不是 WdfObjectDelete 来设置事务对象以供重复使用。

PLX9x5x 示例重复使用 DMA 事务对象。