_RxAllocatePoolWithTag 函数
_RxAllocatePoolWithTag 从块开头具有四字节标记的池中分配内存,该标记可用于帮助捕获内存回收实例。
语法
VOID* _RxAllocatePoolWithTag(
ULONG Type,
ULONG Size,
ULONG Tag,
PSZ FileName,
ULONG LineNumber
);
参数
类型
要分配的池的类型。 此参数可以是POOL_TYPE的下列枚举值之一:
NonPagedPool
可从任何 IRQL 访问的不可分页系统内存。 NonPagedPool 内存是一种稀缺资源,驱动程序应仅在必要时分配它。 系统只能从 NonPagedPool 分配大于 PAGE_SIZE PAGE_SIZE 倍数的缓冲区。 对大于 PAGE_SIZE 但不是PAGE_SIZE倍数的缓冲区的请求会浪费不可分页内存。
PagedPool
只能在 IRQL < DISPATCH_LEVEL分配和访问的可分页系统内存。
大小
要分配的内存块的大小(以字节为单位)。
标记
用于标记分配的缓冲区的四字节标记。 有关如何使用标记的说明,请参阅 ExAllocatePoolWithTag。 标记中每个字符的 ASCII 值必须介于 0 和 127 之间。
FileName
指向发生内存分配的源文件名称的指针。 当前未使用此参数。
LineNumber
发生内存分配的源文件中的行号。 当前未使用此参数。
返回值
如果可用池中没有足够的内存来满足请求,RxAllocatePoolWithTag 将返回 NULL。 否则,例程返回指向已分配内存的指针。
注解
建议调用 RxAllocatePoolWithTag 宏,而不是直接使用此例程。 在零售版本中,此宏定义为调用 ExAllocatePoolWithTag。 在选中的生成中,此宏定义为调用 _RxAllocatePoolWithTag。
_RxAllocatePoolWithTag例程调用 ExAllocatePoolWithTagPriority,其优先级 (请求的重要性) 设置为 LowPoolPriority。 当资源不足时,系统可能会使 LowPoolPriority 请求失败。 使用此例程时,驱动程序应准备好从分配失败中恢复。
当系统从池内存中分配PAGE_SIZE或更大的缓冲区时,它会在页面边界上对齐缓冲区。 小于 PAGE_SIZE 的内存请求不一定在页面边界上对齐,但始终适合单个页面,并且与 8 字节边界对齐。 请求大于 PAGE_SIZE 块(不是PAGE_SIZE倍数)的任何成功分配都会浪费上次分配的页面上所有未使用的字节。
系统将池标记与分配的内存相关联。 WinDbg 等编程工具可以显示与每个分配的缓冲区关联的池标记。 Tag 的值通常以相反的顺序显示。 例如,如果调用方将“Fred”作为 标记传递,则当内存转储或在调试器中跟踪内存使用情况时,它将显示为“derF”。
应通过调用 _RxFreePool 释放使用 _RxAllocatePoolWithTag 分配的内存。
_RxAllocatePoolWithTag的调用方必须在 IRQL <= DISPATCH_LEVEL 执行。 在 DISPATCH_LEVEL 处执行的调用方必须为 Type 参数指定 NonPagedPool 值。 在 IRQL <= APC_LEVEL 执行的调用方可以为 Type 参数指定任何POOL_TYPE值。
要求
目标平台 |
桌面 |
标头 |
Ntrxdef.h (包括 Ntrxdef.h) |
IRQL |
请参见“备注”部分。 |