Поделиться через


функция _RxAllocatePoolWithTag

_RxAllocatePoolWithTag выделяет память из пула с четырехбайтовый тег в начале блока, который можно использовать для перехвата экземпляров корзины памяти.

Синтаксис

VOID* _RxAllocatePoolWithTag(
   ULONG Type,
   ULONG Size,
   ULONG Tag,
   PSZ   FileName,
   ULONG LineNumber
);

Параметры

Тип
Тип пула для выделения. Этот параметр может быть одним из следующих значений перечисления для POOL_TYPE:

NonPagedPool
Непагегенная системная память, доступ к которому можно получить из любого IRQL. Память NonPagedPool является дефицитным ресурсом, и драйверы должны выделять ее только при необходимости. Система может выделять буферы размером PAGE_SIZE из NonPagedPool только в нескольких PAGE_SIZE. Запросы буферов, превышающих PAGE_SIZE, но не PAGE_SIZE кратных, неотрасходоемой памяти.

PagedPool
Страничной системной памяти, которую можно выделить и получить к ней можно только на DISPATCH_LEVEL IRQL < .

Размер
Размер выделенного блока памяти (в байтах).

Тег
Четырехбайтовый тег, используемый для пометки выделенного буфера. Описание использования тегов см. в разделе 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" при дампе памяти или при отслеживании использования памяти в отладчике.

Память, выделенная _RxAllocatePoolWithTag , должна быть освобождена путем вызова _RxFreePool.

Вызывающие _RxAllocatePoolWithTag должны выполняться в IRQL <= DISPATCH_LEVEL. Вызывающий объект, выполняющий DISPATCH_LEVEL, должен указать значение NonPagedPool для параметра Type . Вызывающий объект, выполняющий команду IRQL <= APC_LEVEL, может указать любое POOL_TYPE значение для параметра Type .

Требования

Целевая платформа

Персональный компьютер

Заголовок

Ntrxdef.h (включая Ntrxdef.h)

IRQL

См. раздел "Примечания".

См. также раздел

ExAllocatePoolWithTag

_RxCheckMemoryBlock

_RxFreePool