Función WdfDmaEnablerGetFragmentLength (wdfdmaenabler.h)

[Solo se aplica a KMDF]

El método WdfDmaEnablerGetFragmentLength devuelve la longitud máxima de transferencia que admite el sistema operativo para una única transferencia DMA.

Sintaxis

size_t WdfDmaEnablerGetFragmentLength(
  [in] WDFDMAENABLER     DmaEnabler,
  [in] WDF_DMA_DIRECTION DmaDirection
);

Parámetros

[in] DmaEnabler

Identificador de un objeto de habilitador DMA que el controlador obtuvo de una llamada anterior a WdfDmaEnablerCreate.

[in] DmaDirection

Valor WDF_DMA_DIRECTION con tipo que especifica la dirección de la operación de transferencia de DMA. Para obtener más información, vea la sección Comentarios que se muestra más adelante.

Valor devuelto

WdfDmaEnablerGetFragmentLength devuelve la longitud máxima de una transferencia DMA, en bytes, que el sistema operativo puede admitir o cero si el valor del parámetro DmaDirection no es válido.

Se produce una comprobación de errores si el controlador proporciona un identificador de objeto no válido.

Comentarios

La longitud máxima de transferencia de DMA que el sistema operativo puede admitir depende del número de registros de mapa disponibles. Si hay suficientes registros de mapa disponibles, WdfDmaEnablerGetFragmentLength devuelve el mismo valor que devuelve WdfDmaEnablerGetMaximumLength . De lo contrario, el valor que devuelve WdfDmaEnablerGetFragmentLength será menor que el valor que devuelve WdfDmaEnablerGetMaximumLength .

El controlador puede determinar el número de registros de mapa disponibles mediante la macro BYTE_TO_PAGES, como se indica a continuación:

BYTE_TO_PAGES(WdfDmaEnablerGetFragmentLength()) + 1

Si el controlador especificó un perfil dúplex cuando llamó a WdfDmaEnablerCreate, el valor del parámetro DmaDirection debe ser WdfDmaDirectionReadFromDevice para obtener la longitud máxima de transferencia para las operaciones de lectura y WdfDmaDirectionWriteToDevice para obtener la longitud máxima de transferencia para las operaciones de escritura. Si el controlador no ha especificado un perfil dúplex, el controlador puede especificar WdfDmaDirectionReadFromDevice o WdfDmaDirectionWriteToDevice para DmaDirection.

Tenga en cuenta que si el dispositivo del controlador admite la operación dúplex, WdfDmaEnablerGetFragmentLength puede devolver valores diferentes para las instrucciones de lectura y escritura que especifica el parámetro DmaDirection . Esta diferencia se debe a que el marco crea un objeto de adaptador independiente para cada dirección y el sistema operativo puede proporcionar un número diferente de registros de mapa a cada objeto de adaptador.

Ejemplos

En el ejemplo de código siguiente se determina el número mínimo de registros de mapa necesarios para controlar las operaciones de lectura de un dispositivo NIC, se calcula el número de registros de mapa disponibles y se notifica un error si el número de registros de mapa asignados no es suficiente.

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;
}

Requisitos

Requisito Value
Plataforma de destino Universal
Versión mínima de KMDF 1.1
Encabezado wdfdmaenabler.h (incluya Wdf.h)
Library Wdf01000.sys (consulte Control de versiones de la biblioteca de marcos).
IRQL <=DISPATCH_LEVEL
Reglas de cumplimiento de DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Consulte también

WDF_DMA_DIRECTION

WdfDmaEnablerCreate

WdfDmaEnablerGetMaximumLength