ExAllocatePool 函数 (wdm.h)

警告

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

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

ExAllocatePool 分配指定类型的池内存,并返回指向已分配块的指针。

语法

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

参数

[in] PoolType

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

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

[in] NumberOfBytes

指定要分配的字节数。

返回值

如果可用池中内存不足,则 exAllocatePool 返回 NULL 以满足请求。 否则,例程将返回指向已分配内存的指针。

言论

此例程用于内存的常规池分配。

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

请求非分页池 NumberOfBytes< PAGE_SIZE 的成功分配为调用方提供所请求的内存字节数。 如果 NumberOfBytes> PAGE_SIZE 分配请求成功,并且 NumberOfBytes 不是PAGE_SIZE的确切倍数,则分配中的最后一页包含不属于调用方分配的字节数。 如果可能,池分配器使用这些字节。 为了避免损坏属于其他内核模式组件的数据,驱动程序必须仅访问显式分配的存储地址。

如果 ExAllocatePool 返回 NULL,则调用方应返回 NTSTATUS 值STATUS_INSUFFICIENT_RESOURCES或延迟处理到另一个时间点。

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

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

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

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

要求

要求 价值
最低支持的客户端 过时。 此例程仅针对现有二进制文件导出。 请改用 ExAllocatePoolWithTag。
目标平台 普遍
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Classpnp.h、Smcnt.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL (请参阅“备注”部分)
DDI 符合性规则 CheckDeviceObjectFlags(wdm)HwStorPortProhibitedDDIs(storport)IrqlExAllocatePool(wdm)PowerDownAllocate(wdm)PowerUpFail(wdm)SpNoWait(storport)StorPortStartIo(storport)UnsafeAllocatePool(kmdf)UnsafeAllocatePool(wdm)

另请参阅

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE