Поделиться через


Использование общих буферов

[Применимо только к KMDF]

Драйверы для устройств DMA иногда должны выделять буферное пространство, к которому может получить доступ как устройство, так и драйвер. Например, устройство может записывать сведения о передаче, такие как количество байтов, в это буферное пространство, и драйвер может считывать его, чтобы определить количество переданных байтов. Этот тип буферного пространства называется общим буфером.

Чтобы выделить общий буфер, используйте функцию обратного вызова драйвера EvtDriverDeviceAdd.

Следующий пример кода взят из файла Init.c образца PLX9x5x. В этом коде показано, как драйвер KMDF выделяет общее буферное пространство.

// 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);

Если ваш драйвер вызовет WdfDeviceSetAlignmentRequirement перед вызовом WdfDmaEnablerCreate, то буферы, созданные WdfDmaEnablerCreate, будут выровнены по границе адреса памяти, которую драйвер указал в WdfDeviceSetAlignmentRequirement. В противном случае общие буферы выровнены по границам адреса слова. Кроме того, драйвер может вызывать WdfCommonBufferCreateWithConfig, чтобы указать выравнивание для одного буфера.

Чтобы получить длину общего буфера, выделенного драйвером, драйвер может вызвать WdfCommonBufferGetLength.

Когда драйвер завершит работу с общим буфером, драйвер вызывает WdfObjectDelete.