Функция WdfDmaEnablerGetFragmentLength (wdfdmaenabler.h)
[Относится только к KMDF]
Метод WdfDmaEnablerGetFragmentLength возвращает максимальную длину передачи, которую операционная система поддерживает для одной передачи DMA.
Синтаксис
size_t WdfDmaEnablerGetFragmentLength(
[in] WDFDMAENABLER DmaEnabler,
[in] WDF_DMA_DIRECTION DmaDirection
);
Параметры
[in] DmaEnabler
Дескриптор объекта включения DMA, который драйвер получил из предыдущего вызова WdfDmaEnablerCreate.
[in] DmaDirection
WDF_DMA_DIRECTION типизированное значение, указывающее направление операции передачи DMA. Дополнительные сведения см. в разделе "Примечания".
Возвращаемое значение
WdfDmaEnablerGetFragmentLength возвращает максимальную длину передачи DMA в байтах, которую может поддерживать операционная система, или ноль, если значение параметра DmaDirection недопустимо.
Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Комментарии
Максимальная длина передачи DMA, которую может поддерживать операционная система, зависит от количества доступных регистров карты . Если доступно достаточно регистров карты, WdfDmaEnablerGetFragmentLength возвращает то же значение, что и WdfDmaEnablerGetMaximumLength . В противном случае значение, возвращаемое WdfDDmaEnablerGetFragmentLength , будет меньше значения, возвращаемого WdfDmaEnablerGetMaximumLength .
Драйвер может определить количество доступных регистров карты с помощью макроса BYTE_TO_PAGES следующим образом:
BYTE_TO_PAGES(WdfDmaEnablerGetFragmentLength()) + 1
Если драйвер указал дуплексный профиль при вызове WdfDmaEnablerCreate, значение параметра DmaDirection должно быть WdfDmaDirectionReadFromDevice для получения максимальной длины передачи для операций чтения и WdfDmaDirectionWriteToDevice для получения максимальной длины передачи для операций записи. Если драйвер не указал дуплексный профиль, драйвер может указать WdfDmaDirectionReadFromDevice или WdfDmaDirectionWriteToDevice для DmaDirection.
Обратите внимание, что если устройство драйвера поддерживает дуплексные операции, WdfDmaEnablerGetFragmentLength может возвращать различные значения для направлений чтения и записи, которые заданы параметром DmaDirection . Это различие связано с тем, что платформа создает отдельный объект адаптера для каждого направления, а операционная система может предоставить разное количество регистров карты для каждого объекта адаптера.
Примеры
В следующем примере кода определяется минимальное количество регистров карты, необходимых для обработки операций чтения устройства сетевой карты, вычисляется количество доступных регистров карты и выводится сообщение об ошибке, если количество выделенных регистров карты недостаточно.
ULONG minimumMapRegisters;
ULONG maxLengthSupported;
ULONG mapRegistersAllocated;
miniMapRegisters = BYTES_TO_PAGES(NIC_MAX_PACKET_SIZE) + 1;
maxLengthSupported =
(ULONG) WdfDmaEnablerGetFragmentLength(
FdoData->WdfDmaEnabler,
WdfDmaDirectionReadFromDevice
);
mapRegistersAllocated = BYTES_TO_PAGES(maxLengthSupported) + 1;
if (mapRegistersAllocated < minimumMapRegisters) {
status = STATUS_INSUFFICIENT_RESOURCES;
return status;
}
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия KMDF | 1,1 |
Верхняя часть | wdfdmaenabler.h (включая Wdf.h) |
Библиотека | Wdf01000.sys (см. раздел Управление версиями библиотеки Платформы). |
IRQL | <=DISPATCH_LEVEL |
Правила соответствия DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |