Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Применимо только к 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) |