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

Retornar valor

Nenhum

Comentários

Um bug marcar ocorrerá se o driver fornecer 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 às enviadas ao driver de outro driver que chama IoCallDriver.

Como o gerenciador de E/S nem sempre usa o alinhamento solicitado, o driver deve estar preparado para buffers não alinhados.

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 do computador (PAGE_SIZE), os endereços lógicos retornados pelo método WdfCommonBufferGetAlignedLogicalAddress estão sempre alinhados ao requisito de alinhamento especificado, mas os endereços virtuais retornados pelo método WdfCommonBufferGetAlignedVirtualAddress 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 de alinhamento exato 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
Plataforma de Destino Universal
Versão mínima do KMDF 1.0
Cabeçalho wdfdevice.h (inclua Wdf.h)
Biblioteca Wdf01000.sys (consulte Controle de versão da biblioteca de estrutura.)
IRQL <= DISPATCH_LEVEL
Regras de conformidade da DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Confira também

WdfCommonBufferGetAlignedLogicalAddress

WdfCommonBufferGetAlignedVirtualAddress

WdfDeviceGetAlignmentRequirement