exAllocatePoolZero 函数 (wdm.h)

注意

Microsoft 知道 ExAllocatePoolZero 存在一个问题,该问题可能导致Windows 10版本 1909 上的分配未归零。 此问题已在 2020 年 12 月 16 日对适用于 Windows 10 版本 2004 的 WDK 和适用于 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 来修改枚举值。 如果无法满足请求,此标志会导致引发异常。 不建议使用此标志,因为它的成本很高。

同样,可以修改 PoolType 值,方法是使用POOL_COLD_ALLOCATION标志对此值进行按位 ORing, () 中 wdm.h 也定义为内核的提示,以便从可能快速分页的页中分配内存。 若要尽可能减少驻留池内存量,不应频繁引用这些分配。 POOL_COLD_ALLOCATION标志只是公告。

NumberOfBytes

要分配的字节数。

Tag

要用于已分配内存的池标记。 将池标记指定为由单引号分隔的 1 到 4 个字符的非零字符文本 (例如 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)
Library NtosKrnl.lib
IRQL IRQL <= DISPATCH_LEVEL (请参阅备注部分)
DDI 符合性规则 CheckDeviceObjectFlags、HwStorPortProhibitedDDI、IrqlExAllocatePool、IrqlExFree1、PowerDownAllocate、PowerUpFail、SpNoWait、StorPortStartIo

另请参阅

ExAllocatePoolUninitialized