Partilhar via


Usando buffers comuns

[Aplica-se apenas ao KMDF]

Em determinadas situações, os drivers para dispositivos DMA devem alocar espaço de memória em buffer que tanto o dispositivo quanto o driver possam aceder. 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ê-las para determinar o número de bytes que foram transferidos. Esse tipo de espaço de 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 é retirado do arquivo de Init.c do PLX9x5x exemplo. Este código mostra como um driver KMDF aloca espaço de 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 que WdfDmaEnablerCreate cria serão alinhados ao limite de endereço de memória que o driver especificou 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 que seu driver alocou, o driver pode chamar WdfCommonBufferGetLength.

Quando o driver terminar de usar um buffer comum, este chama WdfObjectDelete.