Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
[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:
Chama WdfDmaEnablerCreate para criar um objeto habilitador DMA.
Chama WdfCommonBufferCreate ou WdfCommonBufferCreateWithConfig para criar o buffer.
Chama WdfCommonBufferGetAlignedLogicalAddress para obter o endereço lógico do buffer, que o dispositivo pode aceder.
Chama WdfCommonBufferGetAlignedVirtualAddress para obter o endereço virtual do buffer, que o driver pode acessar.
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.