функция _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 |
См. раздел "Примечания". |