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


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

Внимание!

Корпорации Майкрософт известно о проблеме с ExAllocatePoolZero, которая может привести к тому, что выделение не будет обнуляться в Windows 10 версии 1909. Эта проблема была исправлена при обновлении системы безопасности WDK для Windows 10 версии 2004 и корпоративного WDK (EWDK) для Windows 10 версии 2004 16 декабря 2020 г. Сведения о скачивании последней версии WDK см. в разделе Скачивание пакета драйверов Windows (WDK).

Эта подпрограмма является оболочкой для и рекомендуемой заменой для ExAllocatePoolWithTag.

ExAllocatePoolZero выделяет память пула указанного типа и возвращает указатель на выделенный блок. Он идентичен ExAllocatePoolWithTag , но ноль инициализирует выделенную память.

Синтаксис

PVOID ExAllocatePoolZero(
  __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
  SIZE_T                                         NumberOfBytes,
  ULONG                                          Tag
);

Параметры

PoolType

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

Значение перечисления можно изменить, выполнив побитовое ИЛИ с флагом POOL_RAISE_IF_ALLOCATION_FAILURE, определенным в wdm.h. Этот флаг вызывает исключение, если запрос не может быть удовлетворен. Использовать этот флаг не рекомендуется, так как он является дорогостоящим.

Аналогичным образом можно изменить значение PoolType , побитово oRing это значение с флагом POOL_COLD_ALLOCATION (также определенным в ) в wdm.hкачестве указания для ядра, чтобы выделить память из страниц, которые, скорее всего, будут быстро выгружатся. Чтобы как можно больше уменьшить объем памяти резидентного пула, не следует часто ссылаться на эти выделения. Флаг POOL_COLD_ALLOCATION является только советом.

NumberOfBytes

Количество байтов, которые необходимо выделить.

Tag

Тег пула, используемый для выделенной памяти. Укажите тег пула как ненулевой символьный литерал от одного до четырех символов, разделенных одними кавычками (например, Tag1). Строка обычно указывается в обратном порядке (например, 1gaT). Каждый символ ASCII в теге должен быть значением в диапазоне 0x20 (пробел) до 0x7E (тильда). Каждый путь к коду выделения должен использовать уникальный тег пула, чтобы помочь отладчикам и проверятелям определить путь к коду.

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

ExAllocatePoolZero возвращает значение NULL , если в свободном пуле недостаточно памяти для удовлетворения запроса. В противном случае подпрограмма возвращает указатель на выделенную память.

Комментарии

Эта подпрограмма используется для общего выделения памяти пулом.

Для запуска в версиях Windows до Windows 10 версии 2004 драйвер должен определить POOL_ZERO_DOWN_LEVEL_SUPPORT и вызвать ExInitializeDriverRuntime перед вызовом этой функции.

Единственное различие между этой функцией и ExAllocatePoolWithTag заключается в том, что память инициализирована нулевым образом. Если это нежелательно, используйте exAllocatePoolUninitialized , который является оболочкой для ExAllocatePoolWithTag.

Драйвер должен обращаться к памяти только в пределах выделяемого им диапазона байтов. Доступ к памяти за пределами этого диапазона может привести к повреждению пула и аварийному завершению работы системы.

Дополнительные рекомендации см. в разделе Примечания в ExAllocatePoolWithTag .

Требования

Требование Значение
Минимальная версия клиента Требуется WDK для Windows 10 версии 2004. Предназначен для Windows 7 и более поздних версий операционной системы Windows.
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
IRQL IRQL <= DISPATCH_LEVEL (см. раздел "Примечания")
Правила соответствия DDI CheckDeviceObjectFlags, HwStorPortProhibitedDIs, IrqlExAllocatePool, IrqlExFree1, PowerDownAllocate, PowerUpFail, SpNoWait, StorPortStartIo

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

ExAllocatePoolUninitialized