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
要用于已分配内存的池标记。 有关详细信息,请参阅 ExAllocatePoolWithTag 的 Tag 参数。
[in] Priority
此请求的优先级。 将此参数设置为以下 EX_POOL_PRIORITY 枚举值之一。
优先级值 | 说明 |
---|---|
LowPoolPriority | 指定在资源不足时,系统可能会使请求失败。 可从分配失败中恢复的驱动程序分配使用此优先级。 |
NormalPoolPriority | 指定系统在资源上运行非常低时可能会使请求失败。 大多数驱动程序应使用此值。 |
HighPoolPriority | 指定系统不能使请求失败,除非它完全超出资源。 驱动程序仅在对请求成功至关重要时才使用此值。 |
EX_POOL_PRIORITY枚举定义 XxxSpecialPoolOverrun 和 XxxSpecialPoolUnderrun 变体,以指定在启用驱动程序验证程序 (或特殊池) 时应如何分配内存。 如果驱动程序指定 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) |