ExAllocatePoolWithTagPriority 函数 (wdm.h)

ExAllocatePoolWithTagPriority 例程分配指定类型的池内存。

警告

ExAllocatePoolWithTagPriority 已在 Windows 10 版本 2004 中弃用,已替换为 ExAllocatePool3。 有关详细信息,请参阅 更新对 ExAllocatePool2 和 ExAllocatePool3的已弃用 ExAllocatePool 调用。

语法

PVOID ExAllocatePoolWithTagPriority(
  [in] __drv_strictTypeMatch(__drv_typeCond)POOL_TYPE        PoolType,
  [in] SIZE_T                                                NumberOfBytes,
  [in] ULONG                                                 Tag,
  [in] __drv_strictTypeMatch(__drv_typeExpr)EX_POOL_PRIORITY Priority
);

参数

[in] PoolType

要分配的池内存的类型。 有关可用池内存类型的说明,请参阅 POOL_TYPE

可以使用 POOL_RAISE_IF_ALLOCATION_FAILURE 标志按位 ORing 此值来修改 PoolType 值。 如果无法满足请求,则此标志会导致引发异常。

同样,可以通过按位 ORing 此值来修改 PoolType 值,并将POOL_COLD_ALLOCATION标志作为内核提示,以从可能快速分页的页面分配内存。 若要尽可能减少驻留池内存量,不应经常引用这些分配。 POOL_COLD_ALLOCATION标志仅提供公告,从 Windows XP 开始可用。

[in] NumberOfBytes

要分配的字节数。

[in] Tag

要用于已分配内存的池标记。 有关详细信息,请参阅 ExAllocatePoolWithTagTag 参数。

[in] Priority

此请求的优先级。 将此参数设置为以下 EX_POOL_PRIORITY 枚举值之一。

优先级值 描述
LowPoolPriority 指定在资源上运行不足时,系统可能会失败请求。 可以从分配失败中恢复的驱动程序分配使用此优先级。
NormalPoolPriority 指定在资源上运行非常低时,系统可能会失败请求。 大多数驱动程序应使用此值。
HighPoolPriority 指定系统不能失败请求,除非它完全超出资源。 驱动程序仅在请求成功至关重要时使用此值。

EX_POOL_PRIORITY 枚举定义 XxxSpecialPoolOverrunXxxSpecialPoolUnderrun 变体来指定启用驱动程序验证程序 (或特殊池) 时应如何分配内存。 如果驱动程序指定了 XxxSpecialPoolUnderrun,则当 内存管理器特殊池分配内存时,它会在物理页的开头分配内存。 如果驱动程序指定了 XxxSpecialPoolOverrun,则内存管理器会在物理页的末尾分配它。

返回值

ExAllocatePoolWithTagPriority 在可用池中没有足够的内存来满足请求,除非指定POOL_RAISE_IF_ALLOCATION_FAILURE,否则返回 null。 否则,例程将返回指向已分配内存的指针。

言论

ExAllocatePoolWithTagPriority 的调用方必须在 IRQL <= DISPATCH_LEVEL执行。 在 DISPATCH_LEVEL 执行的调用方必须为 PoolType指定 NonPagedXxx 值。 在 IRQL 执行 <= APC_LEVEL的调用方可以指定任何 POOL_TYPE 值,但还必须考虑 IRQL 和环境来确定页面类型。

如果 NumberOfBytes PAGE_SIZE或更高版本,则会分配页对齐的缓冲区。 PAGE_SIZE或更少的内存分配在页面中分配,并且不会跨页边界。 小于PAGE_SIZE的内存分配不一定是页面对齐的,而是与 32 位系统中的 8 字节边界对齐,在 64 位系统中与 16 字节边界对齐。

不要 NumberOfBytes = 0 设置。 避免零长度分配,因为它们会浪费池标头空间,在许多情况下,指示调用代码中可能存在验证问题。 因此,驱动程序验证程序 标志,如可能的分配错误。

当池量(分页或非分页)为高或低时,系统会自动设置某些标准事件对象。 驱动程序可以等待这些事件来优化其池使用情况。 有关详细信息,请参阅 标准事件对象

在非统一内存访问(NUMA)多处理器体系结构中,ExAllocatePoolWithTagPriority 尝试将本地内存分配给调用 ExAllocatePoolWithTagPriority的处理器。 如果没有本地内存可用,ExAllocatePoolWithTagPriority 分配最近的可用内存。

ExAllocatePoolWithTagPriority 分配的内存未初始化。 如果内核模式驱动程序要使用户模式软件可见(以避免泄露潜在特权内容),内核模式驱动程序必须首先为此内存零。

要求

要求 价值
目标平台 普遍
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL (请参阅“备注”部分)
DDI 符合性规则 HwStorPortProhibitedDIS(storport)IrqlExAllocatePool(wdm)IrqlExFree2(wdm)SpNoWait(storport)StorPortStartIo(storport)UnsafeAllocatePool(kmdf)UnsafeAllocatePool(wdm)

另请参阅

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE