exAllocatePoolWithQuotaTag 函数 (wdm.h)

ExAllocatePoolWithQuotaTag 例程分配池内存,对当前进程收取配额费用。

警告

exAllocatePoolWithQuotaTag 在 Windows 10 版本 2004 中已弃用,并已由 ExAllocatePool2 取代。 有关详细信息,请参阅 将已弃用的 ExAllocatePool 调用更新到 ExAllocatePool2 和 ExAllocatePool3

语法

PVOID ExAllocatePoolWithQuotaTag(
  [in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
  [in] SIZE_T                                         NumberOfBytes,
  [in] ULONG                                          Tag
);

参数

[in] PoolType

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

可以通过使用 POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 标志对此值进行按位操作来修改 PoolType 值。 如果无法满足请求,此标志会导致例程返回 NULL 值。

同样,可以修改 PoolType 值,方法是使用POOL_COLD_ALLOCATION标志对此值进行按位操作,作为内核的提示,以便从可能快速分页的页中分配内存。 若要尽可能减少驻留池内存量,不应频繁引用这些分配。 POOL_COLD_ALLOCATION标志只是公告,在 Windows XP 和更高版本的 Windows 操作系统中受支持。

[in] NumberOfBytes

指定要分配的字节数。

[in] Tag

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

返回值

ExAllocatePoolWithQuotaTag 返回指向已分配池的指针。

如果无法满足请求,除非指定POOL_QUOTA_FAIL_INSTEAD_OF_RAISE, 否则 ExAllocatePoolWithQuotaTag 将引发异常。 出于性能原因,首选使用 POOL_QUOTA_FAIL_INSTEAD_OF_RAISE。

注解

此例程由最高级别的驱动程序调用,这些驱动程序分配内存以满足最初发出 I/O 请求的进程上下文中的请求。 较低级别的驱动程序改为调用 ExAllocatePoolWithTag

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

系统将池标记与分配的内存相关联。 WinDbg 等编程工具可以显示与每个分配的缓冲区关联的池标记。 Tag 的值通常以相反的顺序显示。 例如,如果调用方将“Fred”作为 标记传递,则当池被转储或在调试器中跟踪池使用情况时,它将显示为“derF”。

可以使用 ExFreePool 或 ExFreePoolWithTag 释放分配的缓冲区。

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

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

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

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

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

要求

要求
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (请参阅备注部分)
DDI 符合性规则 HwStorPortProhibitedDDI (storport) SpNoWait (storport) StorPortStartIo (storport) UnsafeAllocatePool (kmdf)

另请参阅

ExAllocatePoolWithTag

ExFreePool

ExFreePoolWithTag

POOL_TYPE