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

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

Синтаксис

void ExInitializePagedLookasideList(
  [out]          PPAGED_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

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

[in, optional] Allocate

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

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

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

[in, optional] Free

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

VOID XxxFree(
  __in PVOID  Buffer
);

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

[in] Flags

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

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

Указание флага POOL_NX_ALLOCATION не оказывает никакого влияния. Вся страничной памяти выделяется как NX.

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

[in] Size

Задает размер в байтах каждой записи в списке lookaside.

[in] Tag

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

[in] Depth

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

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

None

Remarks

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Требования

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

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

ExAllocateFromPagedLookasideList

ExAllocatePoolWithTag

ExDeletePagedLookasideList

ExFreePool

ExFreeToPagedLookasideList

ExInitializeLookasideListEx

ExInitializeNPagedLookasideList

LOOKASIDE_LIST_EX

PAGED_LOOKASIDE_LIST