функция обратного вызова FREE_FUNCTION_EX (wdm.h)

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

Синтаксис

FREE_FUNCTION_EX FreeFunctionEx;

void FreeFunctionEx(
  [in]      PVOID Buffer,
  [in, out] PLOOKASIDE_LIST_EX Lookaside
)
{...}

Параметры

[in] Buffer

Указатель на запись lookaside-list, которая должна быть освобождена.

[in, out] Lookaside

Указатель на структуру LOOKASIDE_LIST_EX , описывающую список lookaside. Эта структура ранее была инициализирована подпрограммой ExInitializeLookasideListEx .

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

None

Remarks

Драйвер, создающий список lookaside, может реализовать подпрограмму LookasideListFreeEx для освобождения ранее выделенных буферов, когда список становится полным и не может содержать буферы. Буфер, который не используется, хранится как запись в списке. Все записи в списке lookaside представляют собой буферы единого размера, который драйвер указывает при инициализации списка.

Драйвер предоставляет указатель на настраиваемую подпрограмму LookasideListFreeEx в качестве входного параметра в вызове ExInitializeLookasideListEx , который инициализирует список lookaside. Если драйвер задает этому параметру значение NULL, в списке lookaside используется подпрограмма освобождения по умолчанию.

Драйвер вызывает подпрограмму ExFreeToLookasideListEx для вставки ранее выделенной записи в список просмотра. Если список заполнен (то есть, если список уже содержит определяемую системой максимальное количество записей), ExFreeToLookasideListEx вызывает LookasideListFreeEx , чтобы освободить хранилище для записи.

Подпрограмма LookasideListFreeEx может использовать параметр Lookaside для доступа к данным частного контекста, связанному драйвером со списком lookaside. Дополнительные сведения см. в примере кода в ExInitializeLookasideListEx.

Дополнительные сведения о списках lookaside см. в разделе Использование lookaside Списки.

Подпрограмма LookasideListFreeEx вызывается в том же irQL, что и вызов ExFreeToLookasideListEx, который освобождает запись. Чтобы при вызове освободить запись, которая находится в страничной памяти, вызывающий объект должен выполнять IRQL <= APC_LEVEL. Чтобы при вызове освободить запись, которая находится в непагрегированной памяти, вызывающий объект должен выполнять IRQL <= DISPATCH_LEVEL.

Примеры

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

Например, чтобы определить подпрограмму обратного вызова LookasideListFreeEx с именем MyLookasideListFreeEx, используйте тип FREE_FUNCTION_EX, как показано в следующем примере кода:

FREE_FUNCTION_EX MyLookasideListFreeEx;

Затем реализуйте процедуру обратного вызова следующим образом:

_Use_decl_annotations_
VOID
  MyLookasideListFreeEx(
    PVOID  Buffer,
    PLOOKASIDE_LIST_EX  Lookaside
    )
  {
      // Function body
  }

Тип функции FREE_FUNCTION_EX определен в файле заголовка Wdm.h. Чтобы более точно определить ошибки при запуске средств анализа кода, не забудьте добавить заметку _Use_decl_annotations_ в определение функции. Заметка _Use_decl_annotations_ гарантирует использование заметок, которые применяются к типу функции FREE_FUNCTION_EX в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в статье Объявление функций с помощью типов ролей функций для драйверов WDM. Сведения о _Use_decl_annotations_см. в статье Поведение функции с заметками.

Требования

Требование Значение
Целевая платформа Персональный компьютер
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
IRQL См. раздел "Примечания".

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

ExFreeToLookasideListEx

ExInitializeLookasideListEx

LOOKASIDE_LIST_EX