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) |