Compartir a través de


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 sola transferencia de DMA.

Sintaxis

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

Parámetros

[in] DmaEnabler

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

[in] DmaDirection

Valor de tipo WDF_DMA_DIRECTIONque especifica la dirección de la operación de transferencia DMA. Para obtener más información, vea la siguiente sección Comentarios.

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.

Observaciones

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

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 al llamar a WdfDmaEnablerCreate, el DmaDirection valor del parámetro debe ser WdfDmaDirectionReadFromDevice para obtener la longitud máxima de transferencia para las operaciones de lectura y WdfDmaDirectionWriteToDevic e 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 direcciones de lectura y escritura que especifica el parámetro DmaDirection. Esta diferencia se debe a que el marco crea un objeto de adaptador de independiente para cada dirección y el sistema operativo podría 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 Valor
de la plataforma de destino de Universal
versión mínima de KMDF 1.1
encabezado wdfdmaenabler.h (incluya Wdf.h)
Biblioteca 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

WdfDmaEnablerCrear

WdfDmaEnablerGetMaximumLength