функция обратного вызова 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 | См. раздел "Примечания". |