ExAllocatePoolZero 函数 (wdm.h)
谨慎
Microsoft知道 ExAllocatePoolZero 存在问题,这可能导致在 Windows 10 版本 1909 上未实现分配。 此问题已在 2020 年 12 月 16 日 Windows 10 版本 2004 和适用于 Windows 10 版本 2004 的企业 WDK(EWDK)的安全刷新中修复。 有关下载最新 WDK 的信息,请参阅 下载 Windows 驱动程序工具包(WDK)。
此例程是 ExAllocatePoolWithTag的包装器和建议的替换选项。
ExAllocatePoolZero 分配指定类型的池内存,并返回指向已分配块的指针。 它与 ExAllocatePoolWithTag 相同,只不过零初始化分配的内存。
语法
PVOID ExAllocatePoolZero(
__drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
SIZE_T NumberOfBytes,
ULONG Tag
);
参数
PoolType
要分配的池内存的类型。 有关可用池内存类型的说明,请参阅 POOL_TYPE。
可以通过使用 wdm.h
中定义的POOL_RAISE_IF_ALLOCATION_FAILURE标志执行按位 OR 来修改枚举值。 如果无法满足请求,则此标志会导致引发异常。 不建议使用此标志,因为它成本高昂。
同样,可以通过按位 ORing 此值来修改 PoolType 值,并将此值与POOL_COLD_ALLOCATION标志(在 wdm.h
中定义)作为提示,提示内核从可能快速分页的页面分配内存。 若要尽可能减少驻留池内存量,不应经常引用这些分配。 POOL_COLD_ALLOCATION标志只是公告。
NumberOfBytes
要分配的字节数。
Tag
要用于已分配内存的池标记。 将池标记指定为一到四个字符的非零字符文本,用单引号分隔(例如,Tag1
)。 字符串通常按反向顺序指定(例如,1gaT
)。 标记中的每个 ASCII 字符都必须是区域0x20(空格)中的值才能0x7E(波形符)。 每个分配代码路径都应使用唯一的池标记来帮助调试器和验证程序标识代码路径。
返回值
如果可用池中的内存不足来满足请求,ExAllocatePoolZero 将返回 NULL。 否则,例程将返回指向已分配内存的指针。
言论
此例程用于内存的常规池分配。
若要在 Windows 10 版本 2004 之前的 Windows 版本上运行,驱动程序必须在调用此函数之前定义POOL_ZERO_DOWN_LEVEL_SUPPORT并调用 ExInitializeDriverRuntime。
此函数与 ExAllocatePoolWithTag 之间的唯一区别是内存初始化为零。 如果不需要,请改用 ExAllocatePoolUninitialized,这是 ExAllocatePoolWithTag 的包装器。
驱动程序应仅访问它分配的字节范围内的内存。 访问此范围之外的内存可能会损坏池并导致系统崩溃。
有关其他指南,请参阅 ExAllocatePoolWithTag 的“备注”部分。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 需要适用于 Windows 10 版本 2004 的 WDK。 面向 Windows 7 及更高版本的 Windows作系统。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
IRQL | IRQL <= DISPATCH_LEVEL (请参阅“备注”部分) |
DDI 符合性规则 | CheckDeviceObjectFlags、HwStorPortProhibitedDDIs、IrqlExAllocatePool、IrqlExFree1、PowerDownAllocate、PowerUpFail、SpNoWait、StorPortStartIo |