使用常用缓冲区
[仅适用于 KMDF]
DMA 设备的驱动程序有时必须分配设备和驱动程序都可以访问的缓冲区空间。 例如,设备可能会将传输信息(如字节计数)写入此缓冲区空间,驱动程序可以读取它以确定传输的字节数。 这种类型的缓冲区空间称为 通用缓冲区。
若要分配公共缓冲区,驱动程序的 EvtDriverDeviceAdd 回调函数:
调用 WdfDmaEnablerCreate 来创建 DMA 启用程序对象。
调用 WdfCommonBufferCreate 或 WdfCommonBufferCreateWithConfig 来创建缓冲区。
调用 WdfCommonBufferGetAlignedLogicalAddress 以获取设备可以访问的缓冲区的逻辑地址。
调用 WdfCommonBufferGetAlignedVirtualAddress 以获取缓冲区的虚拟地址,驱动程序可以访问该地址。
以下代码示例取自 PLX9x5x 示例的 Init.c 文件。 此代码演示 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);
如果驱动程序在调用 WdfDmaEnablerCreate 之前调用 WdfDeviceSetAlignmentRequirement,则 WdfDmaEnablerCreate 创建的缓冲区与驱动程序指定给 WdfDeviceSetAlignmentRequirement 的内存地址边界对齐。 否则,通用缓冲区与字地址边界对齐。 或者,驱动程序可以调用 WdfCommonBufferCreateWithConfig 来指定单个缓冲区的对齐方式。
若要获取驱动程序已分配的公共缓冲区的长度,驱动程序可以调用 WdfCommonBufferGetLength。
当驱动程序使用完公共缓冲区时,驱动程序将调用 WdfObjectDelete。