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


Функция 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_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 (include Wdf.h)
Библиотека Wdf01000.sys (см. управление версиями библиотеки Платформы).)
IRQL <=DISPATCH_LEVEL
правил соответствия DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

См. также

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength