Функция ExAllocatePoolWithTagPriority (wdm.h)
Подпрограмма exAllocatePoolWithTagPriority выделяет память пула указанного типа.
Предупреждение
ExAllocatePoolWithTagPriority устарел в Windows 10 версии 2004 и заменен ExAllocatePool3. Дополнительные сведения см. в разделе Обновление устаревших вызовов ExAllocatePool к ExAllocatePool2 и ExAllocatePool3.
Синтаксис
PVOID ExAllocatePoolWithTagPriority(
[in] __drv_strictTypeMatch(__drv_typeCond)POOL_TYPE PoolType,
[in] SIZE_T NumberOfBytes,
[in] ULONG Tag,
[in] __drv_strictTypeMatch(__drv_typeExpr)EX_POOL_PRIORITY Priority
);
Параметры
[in] PoolType
Тип выделяемой памяти пула. Описание доступных типов памяти пула см. в POOL_TYPE.
Можно изменить значение PoolType, побитово-ORing это значение с помощью флага POOL_RAISE_IF_ALLOCATION_FAILURE. Этот флаг вызывает исключение, если запрос не может быть удовлетворен.
Аналогичным образом можно изменить значение PoolType, побитово-ORing это значение с флагом POOL_COLD_ALLOCATION в качестве указания на ядро, чтобы выделить память из страниц, которые, скорее всего, будут выгружаются быстро. Чтобы уменьшить объем памяти пула резидентов максимально возможно, не следует часто ссылаться на эти выделения. Флаг POOL_COLD_ALLOCATION доступен только для рекомендаций и доступен начиная с Windows XP.
[in] NumberOfBytes
Количество выделенных байтов.
[in] Tag
Тег пула, используемый для выделенной памяти. Дополнительные сведения см. в параметр е тега тега ExAllocatePoolWithTag.
[in] Priority
Приоритет этого запроса. Задайте для этого параметра одно из следующих значений перечисления EX_POOL_PRIORITY.
Значение приоритета | Описание |
---|---|
LowPoolPriority | Указывает, что система может завершить запрос сбоем при низком уровне ресурсов. Выделения драйверов, которые могут восстановиться после сбоя выделения, используют этот приоритет. |
NormalPoolPriority | Указывает, что система может завершить запрос сбоем при выполнении очень низкого уровня ресурсов. Большинство драйверов должны использовать это значение. |
HighPoolPriority | Указывает, что система не должна завершаться сбоем запроса, если она не полностью не выходит за пределы ресурсов. Драйверы используют это значение только в том случае, если оно крайне важно для успешного выполнения запроса. |
Перечисление EX_POOL_PRIORITY определяет XxxSpecialPoolOverrun и XxxSpecialPoolUnderrun варианты, чтобы указать, как следует выделять память при включении проверки драйвера (или специального пула). Если драйвер указывает XxxSpecialPoolUnderrun, когда диспетчер памяти выделяет память от специального пула, он выделяет его в начале физической страницы. Если драйвер указывает XxxSpecialPoolOverrun, диспетчер памяти выделяет его в конце физической страницы.
Возвращаемое значение
ExAllocatePoolWithTagPriority возвращает NULL, если в свободном пуле недостаточно памяти, если POOL_RAISE_IF_ALLOCATION_FAILURE не указано. В противном случае подпрограмма возвращает указатель на выделенную память.
Замечания
Вызывающие ExAllocatePoolWithTagPriority должны выполняться в IRQL <= DISPATCH_LEVEL. Вызывающий объект, выполняющийся в DISPATCH_LEVEL, должен указать значение NonPagedXxx для PoolType. Вызывающий объект, выполняющийся в IRQL <= APC_LEVEL, может указывать любое POOL_TYPE значение, но для определения типа страницы также следует учитывать irQL и среду.
Если NumberOfBytes PAGE_SIZE или больше, выделяется буфер с выравниванием страницы. Выделение памяти PAGE_SIZE или меньше выделяется на странице и не пересекает границы страницы. Выделения памяти меньше PAGE_SIZE не обязательно выровнены по страницам, но выровнены по 8-байтовой границе в 32-разрядных системах и 16-байтовых границах в 64-разрядных системах.
Не устанавливайте NumberOfBytes = 0. Избегайте выделения нулевой длины, так как они занимают место заголовка пула отходов и, во многих случаях, указывают на потенциальную проблему проверки в вызывающем коде. По этой причине проверяющего драйвера флаги таких выделений, как возможные ошибки.
Система автоматически задает определенные стандартные объекты событий, если объем пула (страницы или непагированные) имеет высокий или низкий уровень. Драйверы могут ждать, пока эти события будут настроены на использование пула. Дополнительные сведения см. в разделе Стандартные объекты событий.
В многопроцессорной архитектуре доступа к памяти (NUMA) ExAllocatePoolWithTagPriority пытается выделить память, которая является локальной для процессора, вызывающего ExAllocatePoolWithTagPriority. Если локальная память недоступна, exAllocatePoolWithTagPriority выделяет ближайшую доступную память.
Память, которая exAllocatePoolWithTagPriority выделяется неинициализируется. Драйвер в режиме ядра должен сначала ноль этой памяти, если он будет отображаться в программном обеспечении в пользовательском режиме (чтобы избежать утечки потенциально привилегированного содержимого).
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL (см. раздел "Примечания") |
правил соответствия DDI | HwStorPortProhibitedDDIs(storport), IrqlExAllocatePool(wdm), IrqlExFree2(wdm), SpNoWa,StorPortStartIo(storport), UnsafeAllocatePool(kmdf), UnsafeAllocatePool(wdm) |