Usando buffers comuns

[Aplica-se somente ao KMDF]

Os drivers para dispositivos DMA às vezes devem alocar espaço em buffer que um dispositivo e o driver podem acessar. Por exemplo, um dispositivo pode gravar informações de transferência, como contagens de bytes, nesse espaço de buffer e o driver pode lê-lo para determinar o número de bytes que foram transferidos. Esse tipo de espaço em buffer é chamado de buffer comum.

Para alocar um buffer comum, a função de retorno de chamada EvtDriverDeviceAdd do driver:

O exemplo de código a seguir é obtido do arquivo Init.c do exemplo PLX9x5x . Esse código mostra como um driver KMDF aloca espaço em buffer comum.

// Allocate common buffer for building writes
DevExt->WriteCommonBufferSize = 
         sizeof( DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
                                DevExt->WriteCommonBufferSize,
                                WDF_NO_OBJECT_ATTRIBUTES, 
                                &DevExt->WriteCommonBuffer );
if (!NT_SUCCESS(status)) {
    . . . //Error-handling code omitted 
    }
DevExt->WriteCommonBufferBase = 
             WdfCommonBufferGetAlignedVirtualAddress(
                      DevExt->WriteCommonBuffer);
DevExt->WriteCommonBufferBaseLA = 
             WdfCommonBufferGetAlignedLogicalAddress(
                      DevExt->WriteCommonBuffer);
RtlZeroMemory( DevExt->WriteCommonBufferBase, DevExt->WriteCommonBufferSize);

Se o driver chamar WdfDeviceSetAlignmentRequirement antes de chamar WdfDmaEnablerCreate, os buffers criados por WdfDmaEnablerCreate serão alinhados ao limite de endereço de memória especificado pelo driver para WdfDeviceSetAlignmentRequirement. Caso contrário, os buffers comuns são alinhados aos limites de endereço de palavras. Como alternativa, o driver pode chamar WdfCommonBufferCreateWithConfig para especificar um alinhamento para um único buffer.

Para obter o comprimento de um buffer comum alocado pelo driver, o driver pode chamar WdfCommonBufferGetLength.

Quando o driver terminar de usar um buffer comum, o driver chamará WdfObjectDelete.