Использование общих буферов
[Применяется только к KMDF]
Драйверы для устройств DMA иногда должны выделять буферное пространство, к которому может получить доступ как устройство, так и драйвер. Например, устройство может записывать сведения о передаче, такие как количество байтов, в это буферное пространство, а драйвер может считывать их, чтобы определить количество переданных байтов. Этот тип буферного пространства называется общим буфером.
Чтобы выделить общий буфер, выполните функцию обратного вызова EvtDriverDeviceAdd драйвера:
Вызывает WdfDmaEnablerCreate , чтобы создать объект включения DMA.
Вызывает WdfCommonBufferCreate или WdfCommonBufferCreateWithConfig для создания буфера.
Вызывает WdfCommonBufferGetAlignedLogicalAddress , чтобы получить логический адрес буфера, к которому устройство может получить доступ.
Вызывает WdfCommonBufferGetAlignedVirtualAddress , чтобы получить виртуальный адрес буфера, к которому может получить доступ драйвер.
Следующий пример кода взят из файла 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.