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


Макрос ExAllocatePool (classpnp.h)

Подпрограмма ExAllocatePoolустарела и экспортируется только для существующих двоичных файлов. Вместо этого используйте ExAllocatePoolWithTag .

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

Синтаксис

PVOID ExAllocatePool(
  _In_ POOL_TYPE a,
  _In_ SIZE_T b
);

Параметры

a

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

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

b

Число выделенных байтов.

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

None

Remarks

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

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

При успешном выделении, запрашиваемом numberOfBytes< PAGE_SIZE непагрегированного пула, вызывающий объект точно определяет количество запрошенных байтов памяти. Если запрос на выделение numberOfBytes> PAGE_SIZE выполнен успешно и NumberOfBytes не является точным кратным PAGE_SIZE, последняя страница выделения содержит байты, которые не являются частью выделения вызывающего объекта. Если это возможно, распределителем пула используются эти байты. Чтобы избежать повреждения данных, принадлежащих другим компонентам режима ядра, драйверы должны обращаться только к адресам хранения, которые они явно выделили.

Если ExAllocatePool возвращает значение NULL, вызывающий объект должен вернуть значение NTSTATUS STATUS_INSUFFICIENT_RESOURCES или задержать обработку до другой точки во времени.

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

Примечание

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

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

Примечание

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

Требования

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

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

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE