exAllocatePool 函数 (wdm.h)

警告

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

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

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

语法

PVOID ExAllocatePool(
  [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

指定要分配的字节数。

返回值

如果可用池中没有足够的内存来满足请求,ExAllocatePool 将返回 NULL。 否则,例程返回指向已分配内存的指针。

注解

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

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

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

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

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

另请参阅

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE