Функция 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
Указывает тег пула для выделенной памяти. Дополнительные сведения см. в параметр е тега тега 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, могут отображать тег пула, связанный с каждым выделенным буфером. Значение тега обычно отображается в обратном порядке. Например, если вызывающий объект передает Fred в качестве тега, он будет отображаться как derF, если пул дампируется или при отслеживании использования пула в отладчике.
Выделенный буфер можно освободить с помощью ExFreePool или ExFreePoolWithTag.
Не устанавливайте NumberOfBytes = 0. Избегайте выделения нулевой длины, так как они занимают место заголовка пула отходов и, во многих случаях, указывают на потенциальную проблему проверки в вызывающем коде. По этой причине проверяющего драйвера флаги таких выделений, как возможные ошибки.
Система автоматически задает определенные стандартные объекты событий, если объем пула (страницы или непагированные) имеет высокий или низкий уровень. Драйверы могут ждать, пока эти события будут настроены на использование пула. Дополнительные сведения см. в разделе Стандартные объекты событий.
В архитектуре многопроцессорного доступа к памяти (NUMA) ExAllocatePoolWithQuotaTag пытается выделить память, которая является локальной для процессора, вызывающего ExAllocatePoolWithQuotaTag. Если локальная память недоступна, ExAllocatePoolWithQuotaTag выделяет ближайшую доступную память.
Память, которая ExAllocatePoolWithQuotaTag выделяется неинициализировано. Драйвер в режиме ядра должен сначала ноль этой памяти, если он будет отображаться в программном обеспечении в пользовательском режиме (чтобы избежать утечки потенциально привилегированного содержимого).
Вызывающие ExAllocatePoolWithQuotaTag должны выполняться в IRQL <= DISPATCH_LEVEL. Вызывающий объект, выполняющийся в DISPATCH_LEVEL, должен указать значение NonPagedXxx для PoolType. Вызывающий объект, выполняющийся в IRQL <= APC_LEVEL может указывать любое POOL_TYPE значение, но для определения типа пула также следует учитывать irQL и среду.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (см. раздел "Примечания") |
правил соответствия DDI | HwStorPortProhibitedDDIs(storport), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf) |