ExAllocatePoolWithQuota 宏 (classpnp.h)
ExAllocatePoolWithQuota 例程 过时,并且仅导出现有驱动程序二进制文件。 请改用 ExAllocatePoolWithQuotaTag。
ExAllocatePoolWithQuota 分配池内存,针对当前进程收取配额。
语法
PVOID ExAllocatePoolWithQuota(
_In_ POOL_TYPE a,
_In_ SIZE_T b
);
参数
a
指定要分配的池内存的类型。 有关可用池内存类型的说明,请参阅 POOL_TYPE。
可以通过将按位 OR 与POOL_COLD_ALLOCATION标志一起使用来修改 (PoolType),以提示内核从可能快速分页的页面分配内存。 若要尽可能减少驻留池内存量,不应经常引用这些分配。 POOL_COLD_ALLOCATION标志仅供咨询,适用于 Windows XP 和更高版本的 Windows作系统。
b
指定要分配的字节数。
返回值
没有
言论
此例程由最高级别的驱动程序调用,这些驱动程序分配内存以满足最初发出 I/O 请求的进程上下文中的请求。 较低级别的驱动程序改为调用 ExAllocatePoolWithTag。
如果 b (NumberOfBytes) PAGE_SIZE或更高版本,则会分配页对齐的缓冲区。 配额 不 分配给PAGE_SIZE或更高版本的分配过程。
小于PAGE_SIZE的内存分配在页面中分配,并且不会跨页边界。 PAGE_SIZE或更少的内存分配不一定是页面对齐的,而是与 32 位系统中的 8 字节边界对齐,在 64 位系统中与 16 字节边界对齐。
注意
不要 NumberOfBytes = 0 设置。 避免零长度分配,因为它们会浪费池标头空间,在许多情况下,指示调用代码中可能存在验证问题。 因此,驱动程序验证程序 标志,如可能的分配错误。
当池量(分页或非分页)为高或低时,系统会自动设置某些标准事件对象。 驱动程序可以等待这些事件来优化其池使用情况。 有关详细信息,请参阅 标准事件对象。
注意
ExAllocatePoolWithQuota 分配的内存未初始化。 如果内核模式驱动程序要使用户模式软件可见(以避免泄露潜在特权内容),内核模式驱动程序必须首先为此内存零。
ExAllocatePoolWithQuota 的调用方必须在 IRQL <= DISPATCH_LEVEL执行。 在 DISPATCH_LEVEL 执行的调用方必须为 PoolType指定 NonPagedXxx 值。 在 IRQL <= APC_LEVEL 执行的调用方可以指定任何POOL_TYPE值,但还必须考虑 IRQL 和环境来确定池类型。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 过时。 此例程仅针对现有驱动程序二进制文件导出。 请改用 ExAllocatePoolWithQuotaTag。 |
目标平台 | 普遍 |
标头 | classpnp.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Classpnp.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (请参阅“备注”部分) |
DDI 符合性规则 | HwStorPortProhibitedDIS(storport)、SpNoWait(storport)、StorPortStartIo(storport)、UnsafeAllocatePool(kmdf) |