Função WdfDmaEnablerGetFragmentLength (wdfdmaenabler.h)
[Aplica-se somente ao KMDF]
O método WdfDmaEnablerGetFragmentLength retorna o comprimento máximo de transferência que o sistema operacional dá suporte para uma única transferência de DMA.
Sintaxe
size_t WdfDmaEnablerGetFragmentLength(
[in] WDFDMAENABLER DmaEnabler,
[in] WDF_DMA_DIRECTION DmaDirection
);
Parâmetros
[in] DmaEnabler
Um identificador para um objeto de habilitador de DMA que o driver obteve de uma chamada anterior para WdfDmaEnablerCreate.
[in] DmaDirection
Um valor de tipo WDF_DMA_DIRECTION que especifica a direção da operação de transferência de DMA. Para obter mais informações, consulte a seção Comentários a seguir.
Retornar valor
WdfDmaEnablerGetFragmentLength retorna o comprimento máximo de uma transferência de DMA, em bytes, que o sistema operacional pode dar suporte ou zero se o valor do parâmetro DmaDirection for inválido.
Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.
Comentários
O comprimento máximo de transferência de DMA que o sistema operacional pode dar suporte depende do número de registros de mapa disponíveis. Se registros de mapa suficientes estiverem disponíveis, WdfDmaEnablerGetFragmentLength retornará o mesmo valor que WdfDmaEnablerGetMaximumLength retorna. Caso contrário, o valor que WdfDmaEnablerGetFragmentLength retorna será menor que o valor que WdfDmaEnablerGetMaximumLength retorna.
O driver pode determinar o número de registros de mapa disponíveis usando a macro BYTE_TO_PAGES, da seguinte maneira:
BYTE_TO_PAGES(WdfDmaEnablerGetFragmentLength()) + 1
Se o driver tiver especificado um perfil duplex quando ele chamou WdfDmaEnablerCreate, o valor do parâmetro DmaDirection deverá ser WdfDmaDirectionReadFromDevice para obter o comprimento máximo de transferência para operações de leitura e WdfDmaDirectionWriteToDevice para obter o comprimento máximo de transferência para operações de gravação. Se o driver não tiver especificado um perfil duplex, o driver poderá especificar WdfDmaDirectionReadFromDevice ou WdfDmaDirectionWriteToDevice para DmaDirection.
Observe que, se o dispositivo do driver der suporte à operação duplex, WdfDmaEnablerGetFragmentLength poderá retornar valores diferentes para as instruções de leitura e gravação especificadas pelo parâmetro DmaDirection . Essa diferença ocorre porque a estrutura cria um objeto de adaptador separado para cada direção e o sistema operacional pode fornecer um número diferente de registros de mapa para cada objeto adaptador.
Exemplos
O exemplo de código a seguir determina o número mínimo de registros de mapa necessários para lidar com as operações de leitura de um dispositivo NIC, calcula o número de registros de mapa disponíveis e relata um erro se o número de registros de mapa alocados for insuficiente.
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 |
---|---|
Plataforma de Destino | Universal |
Versão mínima do KMDF | 1,1 |
Cabeçalho | wdfdmaenabler.h (inclua Wdf.h) |
Biblioteca | Wdf01000.sys (consulte Controle de versão da biblioteca de estrutura.) |
IRQL | <=DISPATCH_LEVEL |
Regras de conformidade de DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |