ExAllocatePool2 函数 (wdm.h)
ExAllocatePool2 例程分配指定类型的池内存,并返回指向已分配块的指针。
语法
DECLSPEC_RESTRICT PVOID ExAllocatePool2(
POOL_FLAGS Flags,
SIZE_T NumberOfBytes,
ULONG Tag
);
参数
Flags
指定池内存类型以及必需属性和可选属性的ULONG64类型值。 可以使用按位 OR 组合多个标志值。 有关可能的值,请参阅 POOL_FLAGS。
NumberOfBytes
指定要分配的非零字节数。
Tag
要用于已分配内存的池标记。 将池标记指定为一到四个字符的非零字符文本,用单引号分隔(例如,Tag1
)。 字符串通常按反向顺序指定(例如,1gaT
)。 标记中的每个 ASCII 字符都必须是区域0x20(空格)中的值才能0x7E(波形符)。 每个分配代码路径都应使用唯一的池标记来帮助调试器和验证程序标识代码路径。
返回值
ExAllocatePool2 返回指向已分配内存的指针。
以下条件会导致函数默认返回 NULL。 如果指定了 POOL_FLAG_RAISE_ON_FAILURE,该函数将引发异常。
- 内存不足
- 标记 设置为 0 或指定无效POOL_FLAGS
言论
如果要生成面向 Windows 10 版本 2004 之前的 Windows 版本的驱动程序,请使用 ExAllocatePoolZero、ExAllocatePoolUninitialized、ExAllocatePoolQuotaZero或 ExAllocatePoolQuotaUninitialized。
此例程与以前的分配例程(ExAllocatePoolWithTag、ExAllocatePoolWithQuotaTag、ExAllocatePoolWithTagPriority)存在以下差异:
除非指定了 POOL_FLAG_UNINITIALIZED,否则内存将初始化为零。
如果分配失败,则返回行为。 默认情况下,ExAllocatePoolWithQuotaTag 引发异常。
值为 0 的标记无效。
将 ExAllocatePoolWithQuotaTag 替换为 ExAllocatePool2时,必须指定 POOL_FLAG_USE_QUOTA 标志。 有关池标志的详细信息,请参阅 POOL_FLAGS。
如果 NumberOfBytesPAGE_SIZE
或更高版本,则会分配页对齐缓冲区。
PAGE_SIZE
或更少的内存分配在页面中分配,并且不会跨页边界。 小于 PAGE_SIZE
的内存分配不一定是页面对齐的,而是与 32 位系统中的 8 字节边界对齐,在 64 位系统中与 16 字节边界对齐。
驱动程序最多只能使用 NumberOfBytes 显式分配。 访问此范围之外的内存可能会损坏池并导致系统崩溃。
系统将池标记与分配的内存相关联。 编程工具(如 WinDbg)可以显示与每个分配的缓冲区关联的池标记。 Gflags 是 Windows 调试工具中包含的工具,它启用从特定池分配特定池标记的系统功能。 WDK 中包含的 Poolmon 按池标记跟踪内存。
标记的值以反向(little-endian)顺序存储(有时显示)。 例如,如果调用方将 Fred
作为标记传递,则会在池转储和调试器中的池使用情况跟踪中显示为 derF
,注册表和工具中显示的 0x64657246
。
可以使用 ExFreePool 或 ExFreePoolWithTag释放分配的缓冲区。
ExAllocatePool2 的调用方必须在 IRQL <= DISPATCH_LEVEL 上运行。 在DISPATCH_LEVEL执行的调用方必须为 标志指定 POOL_FLAG_NON_PAGED 或 POOL_FLAG_NON_PAGED_EXECUTABLE。 在 IRQL 执行 <= APC_LEVEL 的调用方可以指定 POOL_FLAG_PAGED,但如果将从运行DISPATCH_LEVEL的代码访问内存,则仍必须分配非分页内存。
在非统一内存访问(NUMA)多处理器体系结构中,ExAllocatePool2 尝试将本地内存分配给调用 ExAllocatePool2的处理器。 如果没有可用的本地内存,ExAllocatePool2 分配最近的可用内存。
ExAllocatePool2 分配的内存初始化为零。 内核模式驱动程序不应选择退出将复制到不受信任的位置(用户模式、通过网络等)的分配,以避免泄露敏感信息。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 10 版本 2004 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL (请参阅“备注”部分) |
DDI 符合性规则 | HwStorPortProhibitedDDI、SpNoWait、StorPortStartIo |