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


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

[Применяется только к 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.