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


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

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

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

При разработке драйверов для версии Windows до Windows 10 версии 2004 используйте ExAllocatePoolQuotaZero.

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

Синтаксис

PVOID ExAllocatePoolWithQuota(
  [in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
  [in] SIZE_T                                         NumberOfBytes
);

Параметры

[in] PoolType

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

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

[in] NumberOfBytes

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

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

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

Если запрос не может быть выполнен, ExAllocatePoolWithQuota создает исключение.

Комментарии

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

Если значение NumberOfBytes PAGE_SIZE или больше, выделяется буфер, выровненный по страницам. Квота не взимается с процесса за выделение PAGE_SIZE или больше.

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

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

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

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

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

Требования

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

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

ExAllocatePoolWithQuotaTag

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE