PALLOCATE_COMMON_BUFFER_WITH_BOUNDS回调函数 (wdm.h)

此回调函数为公共缓冲区分配内存并将其映射,以便主设备和 CPU 可以访问该内存。 公共缓冲区可由可选的最小和最大逻辑地址绑定。

语法

PALLOCATE_COMMON_BUFFER_WITH_BOUNDS PallocateCommonBufferWithBounds;

PVOID PallocateCommonBufferWithBounds(
  [in]           PDMA_ADAPTER DmaAdapter,
  [in, optional] PPHYSICAL_ADDRESS MinimumAddress,
  [in, optional] PPHYSICAL_ADDRESS MaximumAddress,
  [in]           ULONG Length,
  [in]           ULONG Flags,
  [in, optional] MEMORY_CACHING_TYPE *CacheType,
  [in]           NODE_REQUIREMENT PreferredNode,
  [out]          PPHYSICAL_ADDRESS LogicalAddress
)
{...}

参数

[in] DmaAdapter

指向DMA_ADAPTER结构的指针。 此结构是适配器对象,表示驱动程序的总线主 DMA 设备或系统 DMA 通道。 调用方从对 IoGetDmaAdapter 例程的上一次调用中获取了此指针。

[in, optional] MinimumAddress

指向包含公共缓冲区的最小逻辑地址的变量的指针。 此参数指示应从此地址及其上方的内存中分配缓冲区。 此参数是可选的,可以指定为 NULL 以指示没有最小地址。

[in, optional] MaximumAddress

指向包含公共缓冲区的最大逻辑地址的变量的指针。 此参数指示应从此地址下方的内存中分配缓冲区。 此参数是可选的,可以指定为 NULL 以指示没有最大地址。

[in] Length

要为 DMA 操作分配的公共缓冲区的大小(以字节为单位)。

[in] Flags

要为 DMA 操作分配的公共缓冲区的大小(以字节为单位)。

标志 含义
DOMAIN_COMMON_BUFFER_LARGE_PAGE 公共缓冲区将使用更大的页面粒度(PAGE_SIZE * 512)进行分配。 请注意,这会增加分配失败的可能性。

[in, optional] CacheType

指向 MEMORY_CACHING_TYPE 枚举的指针,指示例程是否必须在要分配的公共缓冲区中启用或禁用缓存内存。 仅支持 MmNonCachedMmCached 的值。 参数是可选的,可以指定为 NULL,以指定缓存将取决于硬件平台默认值。

[in] PreferredNode

要从中分配内存的首选 NUMA 节点。 如果 N 是多处理器系统中的 NUMA 节点数, 则 PreferredNode 是介于 0 到 N–1 范围内的数字。 对于单处理器系统或非 NUMA 多处理器系统,请将 PreferredNode 设置为零。

[out] LogicalAddress

指向变量的指针,此例程在其中写入设备可用于访问公共缓冲区的逻辑地址。 DMA 设备应使用此逻辑地址,而不是由例程(如 MmGetPhysicalAddress)返回的物理地址。

返回值

返回 PVOID,它是为公共缓冲区分配的内存的虚拟地址。 如果无法分配缓冲区,则返回 NULL。

注解

此回调函数是 PALLOCATE_COMMON_BUFFER_EX 例程的扩展版本。 以下列表汇总了仅在扩展版本中可用的功能:

  • 调用方可以为要分配的公共缓冲区指定最小逻辑地址。

  • 无论硬件平台如何,调用方都可以提供将遵循的缓存类型替代。

  • 调用方可以指定对其公共缓冲区分配使用更大的粒度。

要求

要求
最低受支持的客户端 Windows 10 版本 1803
目标平台 桌面
标头 wdm.h (包括 Wdm.h)
IRQL PASSIVE_LEVEL

另请参阅

DMA_OPERATIONS

PALLOCATE_COMMON_BUFFER_EX