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

Подпрограмма ExInitializeNPagedLookasideList инициализирует список lookaside для непагированных записей указанного размера.

Синтаксис

void ExInitializeNPagedLookasideList(
  [out]          PNPAGED_LOOKASIDE_LIST Lookaside,
  [in, optional] PALLOCATE_FUNCTION     Allocate,
  [in, optional] PFREE_FUNCTION         Free,
  [in]           ULONG                  Flags,
  [in]           SIZE_T                 Size,
  [in]           ULONG                  Tag,
  [in]           USHORT                 Depth
);

Параметры

[out] Lookaside

Указатель на инициализируемую структуру NPAGED_LOOKASIDE_LIST . Вызывающий объект должен использовать непагрегированные системные пространства для структуры. На 64-разрядных платформах эта структура должна быть выровнена по 16 байтам.

[in, optional] Allocate

Указатель на функцию, предоставляемую вызывающей стороной, для выделения записи, когда список lookaside пуст, или на значение NULL. Если значение не равно NULL, указателем является функция с прототипом:

PVOID XxxAllocate(
  __in POOL_TYPE  PoolType,           // NonPagedPool 
  __in SIZE_T  NumberOfBytes,         // value of Size
  __in ULONG  Tag                     // value of Tag
);

Если параметр Allocate имеет значение NULL, последующие вызовы ExAllocateFromNPagedLookasideList автоматически выделяют записи, когда список lookaside пуст.

[in, optional] Free

Указатель на функцию, предоставляемую вызывающей стороной, для освобождения записи при заполнении списка lookaside или на значение NULL. Если значение не равно NULL, указателем является функция с прототипом:

VOID XxxFree(
  __in PVOID  Buffer
);

Если параметр Free имеет значение NULL, последующие вызовы ExFreeToNPagedLookasideList автоматически освобождают указанную запись обратно в непагодный пул при заполнении списка, то есть в настоящее время содержит заданное системой максимальное количество записей.

[in] Flags

Начиная с Windows 8 этот параметр задает необязательное значение флага для изменения поведения по умолчанию процедуры ExInitializeNPagedLookasideList. Совместимые биты флага включают следующее.

Бит флага Значение Значение
POOL_RAISE_IF_ALLOCATION_FAILURE Если выделение не удается, создайте исключение. 16
POOL_NX_ALLOCATION Выделение неисполняемой памяти. 512

До Windows 8 этот параметр не используется и должен иметь нулевое значение.

[in] Size

Указывает размер (в байтах) для каждой непагрегированных записей, которые будут выделены впоследствии. Этот параметр не должен быть меньше требуемого минимального размера, LOOKASIDE_MINIMUM_BLOCK_SIZE, который определен в файле заголовка Wdm.h.

[in] Tag

Указывает тег пула, используемый при выделении записей списка lookaside. Дополнительные сведения о тегах пула см. в разделе Параметр Tagобъекта ExAllocatePoolWithTag.

[in] Depth

Зарезервировано. Должен равняться нулю.

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

None

Remarks

После вызова ExInitializeNPagedLookasideList блоки памяти, заданные вызывающим объектом Size , можно выделить из списка lookaside и освободить их с помощью вызовов ExAllocateFromNPagedLookasideList и ExFreeToNPagedLookasideList соответственно. Такие динамически выделенные и освобожденные записи могут быть любой структурой данных или буфером фиксированного размера, используемым вызывающим объектом во время работы системы, особенно если вызывающий объект не может заранее определить, сколько таких записей будет использоваться в данный момент. Макет и содержимое каждой записи фиксированного размера определяются вызывающим элементом.

ExInitializeNPagedLookasideList инициализирует состояние системы для отслеживания использования заданного списка lookaside следующим образом:

  • Нулевой инициализирует счетчики, которые будут поддерживаться для записей.

  • Хранит точки входа подпрограмм XxxAllocate и XxxFree , предоставляемых вызывающим абонентом, если таковые есть, или устанавливает для этих точек входа ExAllocatePoolWithTag и ExFreePool соответственно.

  • Инициализирует системную блокировку спина для управления выделениями из и освобождает список lookaside в многопроцессорном режиме, если это необходимо.

  • Сохраняет предоставленные вызывающим элементом размер и тег списка.

  • Устанавливает системные ограничения (минимальные и максимальные) на количество записей, которые будут храниться в списке просмотров, которые могут быть впоследствии скорректированы, если общесистемный спрос на записи будет выше или ниже, чем ожидалось.

  • Устанавливает системные флаги, которые управляют типом памяти, из которой впоследствии будут выделены записи.

Система поддерживает набор всех списков lookaside, используемых в настоящее время. Поскольку потребность в записях списка lookaside и доступной непагрегированной памяти меняется во время работы системы, система корректирует свои ограничения на количество записей, которые будут динамически храниться в каждом непагрегированных списках просмотра.

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

ExInitializeNPagedLookasideList настраивает непрозрачный заголовок списка в расположении, предоставленном вызывающей стороной, но предварительно не выделяет память для записей списка. Впоследствии начальные записи выделяются динамически по мере вызова ExAllocateFromNPagedLookasideList , и эти начальные записи сохраняются в списке lookaside по мере выполнения обратных вызовов ExFreeToNPagedLookasideList . Записи собираются в заданном списке просмотра, пока не будет достигнут определенный системой максимум, после чего все дополнительные записи возвращаются в непагированный пул по мере их освобождения. Если список становится пустым, запросы на выделение удовлетворяются функцией XxxAllocate , указанной при инициализации списка, или ExAllocatePoolWithTag.

Более эффективно передавать указатели NULL для параметров Allocate и Freeв ExInitializeNPagedLookasideList , когда пользователь списка lookaside не выполняет никаких действий, кроме выделения и освобождения записей фиксированного размера. Однако любой компонент, использующий список lookaside, может предоставлять эти функции для выполнения дополнительной обработки, определяемой вызывающим объектом, например для отслеживания собственного динамического использования памяти путем поддержания состояния о количестве записей, которые он выделяет и освобождает.

Если вызывающий объект ExInitializeNPagedLookasideList предоставляет функцию XxxAllocate , эта подпрограмма должна выделять записи для списка lookaside с помощью заданных входных параметров при вызове ExAllocatePoolWithTag.

Начиная с Windows Vista, аналогичная подпрограмма ExInitializeLookasideListEx инициализирует список внешних элементов, который описывается структурой LOOKASIDE_LIST_EX . В отличие от подпрограмм XxxAllocate и XxxFree для списка lookaside, использующего структуру NPAGED_LOOKASIDE_LIST , подпрограммы выделения и освобождения для списка lookaside, использующего структуру LOOKASIDE_LIST_EX , получают указатель контекста в качестве входного параметра. Эти подпрограммы могут использовать этот контекст для хранения личных данных для списка lookaside. Если драйвер предназначен для работы только в Windows Vista и более поздних версиях Windows, рассмотрите возможность использования ExInitializeLookasideListEx вместо ExInitializeNPagedLookasideList. Дополнительные сведения см. в статье Использование lookaside Списки.

Вызывающие функции ExInitializeNPagedLookasideList могут выполняться в IRQL <= DISPATCH_LEVEL, но обычно выполняются в IRQL = PASSIVE_LEVEL.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL (см. раздел "Примечания")

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

ExAllocateFromNPagedLookasideList

ExAllocatePoolWithTag

ExDeleteNPagedLookasideList

ExFreePool

ExFreeToNPagedLookasideList

ExInitializeLookasideListEx

ExInitializePagedLookasideList

LOOKASIDE_LIST_EX

NPAGED_LOOKASIDE_LIST