Compartilhar via


Função WdfDeviceSetAlignmentRequirement (wdfdevice.h)

[Aplica-se somente ao KMDF]

O método WdfDeviceSetAlignmentRequirement registra o alinhamento de endereço preferencial do driver para os buffers de dados que o dispositivo usa durante operações de transferência de memória.

Sintaxe

void WdfDeviceSetAlignmentRequirement(
  [in] WDFDEVICE Device,
  [in] ULONG     AlignmentRequirement
);

Parâmetros

[in] Device

Um identificador para um objeto de dispositivo de estrutura.

[in] AlignmentRequirement

O requisito de alinhamento dependente de hardware para um buffer de dados. Esse valor deve ser um a menos que o limite de alinhamento. Por exemplo, você pode especificar 15 para um limite de alinhamento de 16 bytes e 31 para um limite de alinhamento de 32 bytes. Você também pode usar uma das constantes_ALIGNMENT xxxx FILE_definidas em Wdm.h, por exemplo:

//
// Define alignment requirement values
//
#define FILE_BYTE_ALIGNMENT             0x00000000
#define FILE_WORD_ALIGNMENT             0x00000001
#define FILE_LONG_ALIGNMENT             0x00000003
#define FILE_QUAD_ALIGNMENT             0x00000007
#define FILE_OCTA_ALIGNMENT             0x0000000f
#define FILE_32_BYTE_ALIGNMENT          0x0000001f
#define FILE_64_BYTE_ALIGNMENT          0x0000003f
#define FILE_128_BYTE_ALIGNMENT         0x0000007f
#define FILE_256_BYTE_ALIGNMENT         0x000000ff
#define FILE_512_BYTE_ALIGNMENT         0x000001ff

Valor de retorno

Nenhum

Observações

Uma verificação de bug ocorre se o driver fornece um identificador de objeto inválido.

Um driver que usa E/S direta pode chamar WdfDeviceSetAlignmentRequirement para registrar um requisito de alinhamento preferencial. O alinhamento se aplica a solicitações de E/S que passam pelo Gerenciador de E/S, e não aquelas enviadas ao driver de outro driver que chama IoCallDriver.

Como o gerente de E/S nem sempre usa o alinhamento solicitado, o driver deve estar preparado para buffers não atribuídos.

O driver pode chamar WdfDeviceGetAlignmentRequirement para obter o valor atual para o requisito de alinhamento do dispositivo.

O gerenciador de E/S define um valor de requisito de alinhamento para o dispositivo quando o driver chama WdfDeviceCreate. Para obter mais informações sobre o valor do requisito de alinhamento de um dispositivo e quando um driver deve alterar o valor, consulte Inicializando um objeto de dispositivo na documentação do WDM.

Se o driver especificar um requisito de alinhamento maior que o tamanho da página (PAGE_SIZE) do computador, os endereços lógicos que o WdfCommonBufferGetAlignedLogicalAddress método retornar estarão sempre alinhados ao requisito de alinhamento especificado, mas os endereços virtuais que o método WdfCommonBufferGetAlignedVirtualAddress retorna podem não estar alinhados ao requisito de alinhamento.

Se o driver especificar um requisito de alinhamento menor que o tamanho da página do computador, todos os endereços lógicos e virtuais serão alinhados ao requisito de alinhamento especificado.

Para obter mais informações sobre como chamar WdfDeviceSetAlignmentRequirement, consulte Habilitando transações de DMA e usando buffers comuns.

Exemplos

O exemplo de código a seguir é do driver de exemplo AMCC5933. Este exemplo verifica o requisito de alinhamento atual de um dispositivo e define o requisito de alinhamento como um novo valor, se necessário. Observe que o valor exato de alinhamento depende do hardware.

ULONG alignReq;

alignReq = WdfDeviceGetAlignmentRequirement(device);
if (alignReq < AMCC5933_ALIGNMENT__32BITS) {
//
// Set the S5933 alignment requirement to a new value.
//
WdfDeviceSetAlignmentRequirement(
                                 device,
                                 AMCC5933_ALIGNMENT__32BITS
                                 );
}

Requisitos

Requisito Valor
da Plataforma de Destino Universal
versão mínima do KMDF 1.0
cabeçalho wdfdevice.h (inclua Wdf.h)
biblioteca Wdf01000.sys (consulte o Controle de Versão da Biblioteca da Estrutura.)
IRQL <= DISPATCH_LEVEL
regras de conformidade de DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Consulte também

WdfCommonBufferGetAlignedLogicalAddress

WdfCommonBufferGetAlignedVirtualAddress

WdfDeviceGetAlignmentRequirement