Функция ExAllocatePoolWithQuotaTag (wdm.h)

Подпрограмма ExAllocatePoolWithQuotaTag выделяет память пула, взимая квоту для текущего процесса.

Предупреждение

ExAllocatePoolWithQuotaTag не рекомендуется использовать в Windows 10 версии 2004 и был заменен ExAllocatePool2. Дополнительные сведения см. в разделе Обновление устаревших вызовов ExAllocatePool для ExAllocatePool2 и ExAllocatePool3.

Синтаксис

PVOID ExAllocatePoolWithQuotaTag(
  [in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
  [in] SIZE_T                                         NumberOfBytes,
  [in] ULONG                                          Tag
);

Параметры

[in] PoolType

Указывает тип памяти пула для выделения. Описание доступных типов памяти пула см. в разделе POOL_TYPE.

Значение PoolType можно изменить путем побитового ORing это значение с помощью флага POOL_QUOTA_FAIL_INSTEAD_OF_RAISE. Этот флаг приводит к тому, что подпрограмма возвращает значение NULL , если запрос не может быть выполнен.

Аналогичным образом можно изменить значение PoolType путем побитового ORing это значение с флагом POOL_COLD_ALLOCATION в качестве указания для ядра, чтобы выделить память из страниц, которые, скорее всего, будут быстро выгружаться. Чтобы максимально уменьшить объем памяти постоянного пула, не следует часто ссылаться на эти выделения. Флаг POOL_COLD_ALLOCATION является только рекомендацией и поддерживается в Windows XP и более поздних версиях операционной системы Windows.

[in] NumberOfBytes

Указывает число байтов для распределения.

[in] Tag

Указывает тег пула для выделенной памяти. Дополнительные сведения см. в разделе Параметр Tagобъекта ExAllocatePoolWithTag.

Возвращаемое значение

ExAllocatePoolWithQuotaTag возвращает указатель на выделенный пул.

Если запрос не может быть выполнен, ExAllocatePoolWithQuotaTag создает исключение, если не указано POOL_QUOTA_FAIL_INSTEAD_OF_RAISE. Для повышения производительности рекомендуется использовать POOL_QUOTA_FAIL_INSTEAD_OF_RAISE.

Комментарии

Эта подпрограмма вызывается драйверами самого высокого уровня, которые выделяют память для удовлетворения запроса в контексте процесса, который изначально сделал запрос ввода-вывода. Вместо этого драйверы более низкого уровня вызывают ExAllocatePoolWithTag .

Если значение NumberOfBytes PAGE_SIZE или больше, выделяется буфер с выравниванием по страницам. Объем памяти PAGE_SIZE или менее выделяется на странице и не пересекает границы страницы. Выделение памяти меньше PAGE_SIZE не обязательно выравнивается по страницам, но выравнивается по 8-байтовой границе в 32-разрядных системах и к 16-байтовой границе в 64-разрядных системах.

Система связывает тег пула с выделенной памятью. Средства программирования, такие как WinDbg, могут отображать тег пула, связанный с каждым выделенным буфером. Значение Tag обычно отображается в обратном порядке. Например, если вызывающий объект передает "Fred" в качестве тега, он будет отображаться как "derF", если пул является дампом или при отслеживании использования пула в отладчике.

Выделенный буфер можно освободить с помощью ExFreePool или ExFreePoolWithTag.

Не устанавливайте numberOfBytes = 0. Избегайте выделения нулевой длины, так как они тратят пространство заголовков пула и, во многих случаях, указывают на потенциальную проблему проверки в вызывающем коде. По этой причине средство проверки драйверов помечает такие выделения как возможные ошибки.

Система автоматически задает определенные стандартные объекты событий, если объем пула (выгружаемого или несгружаемого) является высоким или низким. Драйверы могут ждать, пока эти события будут настроены для настройки использования пула. Дополнительные сведения см. в разделе Стандартные объекты событий.

В архитектуре с неоднородным доступом к памяти (NUMA) ExAllocatePoolWithQuotaTag пытается выделить локальную память для процессора, вызывающего ExAllocatePoolWithQuotaTag. Если локальная память недоступна, ExAllocatePoolWithQuotaTag выделяет ближайшую доступную память.

Память, выделенная ExAllocatePoolWithQuotaTag , не инициализирована. Драйвер режима ядра должен сначала обнулить эту память, если он собирается сделать ее видимой для программного обеспечения в пользовательском режиме (чтобы избежать утечки потенциально привилегированного содержимого).

Вызывающие экземпляры ExAllocatePoolWithQuotaTag должны выполняться по адресу IRQL <= DISPATCH_LEVEL. Вызывающий объект, выполняющийся в DISPATCH_LEVEL, должен указать значение непагрегированногоxxx для параметра PoolType. Вызывающий объект, выполняющий команду IRQL <= APC_LEVEL, может указать любое значение POOL_TYPE , но при определении типа пула также необходимо учитывать irQL и среду.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (см. раздел "Примечания")
Правила соответствия DDI HwStorPortProhibitedDIs(storport), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf)

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

ExAllocatePoolWithTag

ExFreePool

ExFreePoolWithTag

POOL_TYPE