Compartilhar via


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)

Confira também

WDF_DMA_DIRECTION

WdfDmaEnablerCreate

WdfDmaEnablerGetMaximumLength