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


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

Осторожность

Корпорация Майкрософт знает о проблеме с ExAllocatePoolZero, которая может привести к тому, что выделение не отсчитывается от нуля в Windows 10 версии 1909. Эта проблема устранена в обновлении системы безопасности WDK для Windows 10 версии 2004 и Enterprise 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 путем побитового ввода-вывода этого значения с флагом 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 (include Wdm.h, Ntddk.h, Ntifs.h)
библиотеки NtosKrnl.lib
IRQL IRQL <= DISPATCH_LEVEL (см. раздел "Примечания")
правил соответствия DDI CheckDeviceObjectFlags, HwStorPortProhibitedDDIs, IrqlExAllocatePool, IrqlExFree1, PowerDownAllocate, PowerUpFail, SpNoWait, StorPortStartIo

См. также

ExAllocatePoolUninitialized