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


Функция WdfDmaTransactionDmaCompletedWithLength (wdfdmatransaction.h)

[Применяется только к KMDF]

Метод WdfDmaTransactionDmaCompletedWithLength уведомляет платформу о том, что операция передачи DMA устройства завершена, и предоставляет длину завершенной передачи.

Синтаксис

BOOLEAN WdfDmaTransactionDmaCompletedWithLength(
  [in]  WDFDMATRANSACTION DmaTransaction,
  [in]  size_t            TransferredLength,
  [out] NTSTATUS          *Status
);

Параметры

[in] DmaTransaction

Дескриптор объекта транзакции DMA, полученного драйвером при предыдущем вызове WdfDmaTransactionCreate.

[in] TransferredLength

Число байтов, переданных устройством при текущей передаче DMA.

[out] Status

Указатель на расположение, которое получает состояние передачи DMA. Дополнительные сведения см. в разделе Примечания для WdfDmaTransactionDmaCompleted.

Возвращаемое значение

WdfDmaTransactionDmaCompletedWithLength возвращает значение FALSE , а Status получает STATUS_MORE_PROCESSING_REQUIRED, если для завершения транзакции DMA требуются дополнительные передачи. Если дополнительная передача не требуется, метод возвращает значение TRUE .

Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.

Комментарии

Когда драйвер вызывает метод WdfDmaTransactionDmaCompletedWithLength , платформа завершает текущую передачу и при необходимости запускает новую.

Метод WdfDmaTransactionDmaCompletedWithLength ведет себя так же, как WdfDmaTransactionDmaCompleted, за исключением того, что драйверы вызывают WdfDmaTransactionDmaCompletedWithLength для устройств, которые сообщают количество переданных байтов. Платформа использует сообщаемое число байтов, чтобы определить начало следующей передачи DMA для указанной транзакции DMA, если для завершения транзакции требуется несколько передач.

Дополнительные сведения о выполнении передачи DMA см. в разделе Завершение передачи DMA.

Примеры

Следующий пример кода из примера драйвера PLX9x5x . В этом примере вызывается метод WdfDmaTransactionGetCurrentDmaTransferLength для определения исходной длины текущей передачи, а затем вычисляется фактическая длина передачи. Далее в примере вызывается WdfDmaTransactionDmaCompletedWithLength, чтобы сообщить о фактической длине передачи в платформу. Если текущая передача является последней для транзакции, в примере вызывается частная подпрограмма, которая завершает запрос ввода-вывода.

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