Поделиться через


Повторное использовать объекты транзакций DMA

[Относится только к KMDF]

После того как драйвер обработает все передачи DMA, связанные с транзакцией DMA, драйвер может удалить или повторно использовать объект транзакции. Как правило, функция обратного вызова EvtInterruptDpc драйвера удаляет объект транзакции (путем вызова WdfObjectDelete). Затем, когда драйвер создает новую транзакцию DMA, он вызывает WdfDmaTransactionCreate для создания нового объекта транзакции.

Однако иногда драйверу полезно повторно использовать объекты транзакций. В таких случаях драйвер вызывает WdfDmaTransactionRelease вместо WdfObjectDelete.

Например, предположим, что драйвер и устройство должны работать при нехватке ресурсов памяти компьютера. Чтобы устранить эту проблему с памятью, драйвер может использовать следующую процедуру:

  1. Функция обратного вызова EvtDriverDeviceAdd драйвера может вызывать WdfDmaTransactionCreate для создания одного или нескольких объектов транзакций. Драйвер сохраняет дескрипторы в этих объектах транзакций.

  2. Каждый раз, когда драйвер готов к созданию и инициализации новой транзакции, он вызывает WdfDmaTransactionCreate. Если этот метод возвращает STATUS_INSUFFICIENT_RESOURCES, драйвер может использовать один из сохраненных объектов транзакций.

  3. Если драйвер использует один из своих хранимых объектов транзакций, он должен повторно использовать объект транзакции, а не удалять его после завершения транзакции. Драйвер настраивает объект транзакции для повторного использования, вызывая WdfDmaTransactionRelease вместо WdfObjectDelete.

В примере PLX9x5x повторно используются объекты транзакций DMA.