ExAllocatePoolWithQuota 函数 (wdm.h)

重要

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

在Windows 10版本 2004 之前开发 Windows 版本的驱动程序时,请使用 ExAllocatePoolQuotaZero

ExAllocatePoolWithQuota 为当前进程分配池内存,为配额收费。

语法

PVOID ExAllocatePoolWithQuota(
  [in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
  [in] SIZE_T                                         NumberOfBytes
);

参数

[in] PoolType

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

可以使用带POOL_COLD_ALLOCATION标志的按位 OR 修改 PoolType ,作为内核的提示,以从可能快速分页的页面分配内存。 若要尽可能减少驻留池内存量,不应经常引用这些分配。 POOL_COLD_ALLOCATION标志仅为公告,适用于 Windows XP 和更高版本的 Windows 操作系统。

[in] NumberOfBytes

指定要分配的字节数。

返回值

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

如果无法满足请求, ExAllocatePoolWithQuota 将引发异常。

注解

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

如果 NumberOfBytes PAGE_SIZE或更大,则会分配页对齐缓冲区。 配额 计入分配PAGE_SIZE或更高版本的过程。

内存分配小于PAGE_SIZE在页面中分配,并且不跨页边界。 PAGE_SIZE或更少内存分配不一定是页面对齐的,而是与 32 位系统中的 8 字节边界对齐,在 64 位系统中与 16 字节边界对齐。

注意 不要设置 NumberOfBytes = 0。 避免零长度分配,因为它们浪费了池标头空间,在许多情况下,指示调用代码中可能存在的验证问题。 因此, 驱动程序验证程序 标记此类分配可能的错误。
 
当池量 (分页或非分页) 高或低时,系统会自动设置某些标准事件对象。 驱动程序可以等待这些事件优化其池使用情况。 有关详细信息,请参阅 标准事件对象
注意ExAllocatePoolWithQuota 分配的内存未初始化。 如果内核模式驱动程序要使用户模式软件 (可见,则内核模式驱动程序必须首先为此内存零,以避免) 泄露潜在的特权内容。
 
ExAllocatePoolWithQuota 的调用方必须在 IRQL <= DISPATCH_LEVEL执行。 在 DISPATCH_LEVEL 执行的调用方必须为 PoolType 指定 NonPagedXxx 值。 在 IRQL <= APC_LEVEL 执行的调用方可以指定任何 POOL_TYPE 值,但还必须考虑 IRQL 和环境来确定池类型。

要求

   
最低受支持的客户端 已过时。 此例程仅针对现有驱动程序二进制文件导出。 请改用 ExAllocatePoolWithQuotaTag。
目标平台 通用
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Classpnp.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (请参阅“备注”部分)
DDI 符合性规则 HwStorPortProhibitedDDIS (storport) SpNoWait (storport) StorPortStartIo (storport ) 、 UnsafeAllocatePool (kmdf)

另请参阅

ExAllocatePoolWithQuotaTag

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE