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 值。 如果请求无法满足,则此标志会导致引发异常。

同样,可以修改 PoolType 值,方法是使用 POOL_COLD_ALLOCATION 标志按位 ORing 此值作为内核的提示,以从可能快速分页的页面分配内存。 若要尽可能减少驻留池内存量,不应频繁引用这些分配。 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 返回 NULL,除非指定了POOL_RAISE_IF_ALLOCATION_FAILURE。 否则,例程返回指向已分配内存的指针。

注解

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)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL (请参阅备注部分)
DDI 符合性规则 HwStorPortProhibitedDDI (storport) IrqlExAllocatePool (wdm) IrqlExFree2 (wdm) SpNoWait (storport) StorPortStartIo (storport) UnsafeAllocatePool (kmdf) UnsafeAllocatePool (wdm)

另请参阅

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE