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) |