exAllocatePool 宏 (类pnp.h)

ExAllocatePool 例程已过时,仅针对现有二进制文件导出。 请改用 ExAllocatePoolWithTag

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

语法

PVOID ExAllocatePool(
  _In_ POOL_TYPE a,
  _In_ SIZE_T b
);

参数

a

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

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

b

要分配的字节数。

返回值

备注

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

如果 b (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。
目标平台 通用
标头 classpnp.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Classpnp.h、Smcnt.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
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