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


Функция FltCbdqInitialize (fltkernel.h)

FltCbdqInitialize инициализирует таблицу диспетчера обратных вызовов драйвера.

Синтаксис

NTSTATUS FLTAPI FltCbdqInitialize(
  [in]      PFLT_INSTANCE                                 Instance,
  [in, out] PFLT_CALLBACK_DATA_QUEUE                      Cbdq,
  [in]      PFLT_CALLBACK_DATA_QUEUE_INSERT_IO            CbdqInsertIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_REMOVE_IO            CbdqRemoveIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_PEEK_NEXT_IO         CbdqPeekNextIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_ACQUIRE              CbdqAcquire,
  [in]      PFLT_CALLBACK_DATA_QUEUE_RELEASE              CbdqRelease,
  [in]      PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO CbdqCompleteCanceledIo
);

Параметры

[in] Instance

Указатель непрозрачного экземпляра для экземпляра, очередь обратных вызовов которого должна быть инициализирована.

[in, out] Cbdq

Указатель на очередь данных обратного вызова, выделенную драйвером мини-фильтра.

[in] CbdqInsertIo

Указатель на подпрограмму обратного вызова, предоставленного вызывающим абонентом. Диспетчер фильтров вызывает эту подпрограмму, чтобы вставить указанную структуру данных обратного вызова в очередь. Эта подпрограмма объявлена следующим образом:

typedef NTSTATUS
(*PFLT_CALLBACK_DATA_QUEUE_INSERT_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_ PFLT_CALLBACK_DATA Cbd,
      _In_opt_ PVOID InsertContext
      );

Кбрк

Указатель на очередь данных обратного вызова с отменой безопасности драйвера минифильтра. Эта очередь должна быть инициализирована путем вызова FltCbdqInitialize.

Кбр

Указатель на структуру данных обратного вызова, которую необходимо вставить в очередь.

InsertContext

Указатель сведений о контексте, переданный в качестве параметра InsertContext, FltCbdqInsertIo.

[in] CbdqRemoveIo

Указатель на подпрограмму обратного вызова, предоставленного вызывающим абонентом. Диспетчер фильтров вызывает эту подпрограмму, чтобы удалить указанную структуру данных обратного вызова из очереди. Эта подпрограмма объявлена следующим образом:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_REMOVE_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_ PFLT_CALLBACK_DATA Cbd
      );

Кбрк

Указатель на очередь данных обратного вызова с отменой безопасности драйвера минифильтра. Эта очередь должна быть инициализирована путем вызова FltCbdqInitialize.

Кбр

Указатель на структуру данных обратного вызова, которую нужно удалить из очереди.

[in] CbdqPeekNextIo

Указатель на подпрограмму обратного вызова, предоставленного вызывающим абонентом. Диспетчер фильтров вызывает эту функцию, чтобы получить указатель на следующую операцию ввода-вывода, соответствующую PeekContext в очереди; или, если КбрNULL, чтобы получить указатель на первую соответствующую операцию ввода-вывода в очереди. Драйвер минифильтра полностью определяет значение PeekContext и определяет, когда операция ввода-вывода соответствует заданной PeekContext. Эта подпрограмма объявлена следующим образом:

typedef PFLT_CALLBACK_DATA
(*PFLT_CALLBACK_DATA_QUEUE_PEEK_NEXT_IO)(
      _In_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_opt_ PFLT_CALLBACK_DATA Cbd,
      _In_opt_ PVOID PeekContext
      );

Кбрк

Указатель на очередь данных обратного вызова с отменой безопасности драйвера минифильтра. Эта очередь должна быть инициализирована путем вызова FltCbdqInitialize.

Кбр

Указатель на структуру данных обратного вызова, помеченную позицией в очереди, чтобы начать поиск соответствия PeekContext. Если КбрNULL, поиск начинается в начале очереди.

PeekContext

Указатель сведений о контексте, переданный в качестве параметра PeekContext для FltCbdqRemoveNextIo.

[in] CbdqAcquire

Указатель на подпрограмму обратного вызова блокировки блокировки очереди, предоставленной вызывающим абонентом. Диспетчер фильтров вызывает эту подпрограмму, чтобы получить блокировку очереди перед попыткой вставки или удаления элемента из очереди. Эта подпрограмма объявлена следующим образом:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_ACQUIRE)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _Out_opt_ PKIRQL Irql
      );

Кбрк

Указатель на очередь данных обратного вызова с отменой безопасности драйвера минифильтра. Эта очередь должна быть инициализирована путем вызова FltCbdqInitialize.

Irql

Указатель на системную переменную, которая получает текущий IRQL. Та же переменная передается соответствующей подпрограмме CbdqRelease.

[in] CbdqRelease

Указатель на подпрограмму обратного вызова блокировки блокировки очереди вызова очереди, предоставленной вызывающим абонентом. Диспетчер фильтров вызывает эту подпрограмму, чтобы освободить блокировку, полученную путем вызова соответствующей процедуры CbdqAcquire. Эта подпрограмма объявлена следующим образом:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_RELEASE)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_opt_ KIRQL Irql
      );

Кбрк

Указатель на очередь данных обратного вызова с отменой безопасности драйвера минифильтра. Эта очередь должна быть инициализирована путем вызова FltCbdqInitialize.

Irql

Та же системная переменная, которая получила текущий IRQL, что и параметр Irql соответствующей подпрограмме CbdqAcquir e.

[in] CbdqCompleteCanceledIo

Указатель на подпрограмму отмены, предоставленной вызывающим абонентом. Диспетчер фильтров вызывает эту подпрограмму, чтобы сигнализировать драйверу минифильтра, чтобы завершить отмененную операцию ввода-вывода. Эта подпрограмма объявлена следующим образом:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _Inout_ PFLT_CALLBACK_DATA Cbd
      );

Кбрк

Указатель на очередь данных обратного вызова с отменой безопасности драйвера минифильтра. Эта очередь должна быть инициализирована путем вызова FltCbdqInitialize.

Кбр

Указатель на структуру данных обратного вызова для отмененной операции ввода-вывода.

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

FltCbdqInitialize возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS.

Замечания

Только что инициализированная очередь данных обратного вызова находится в состоянии включено, что означает, что элементы структуры данных обратного вызова можно вставить в очередь. Очередь может быть отключена путем вызова FltCbdqDisable и повторной обработки путем вызова FltCbdqEnable.

Драйверы минифильтра могут использовать FltCbdqxxx подпрограммы для реализации очереди данных обратного вызова для операций ввода-вывода на основе IRP. Используя эти подпрограммы, драйверы мини-фильтра могут сделать свои очереди отмененными; система прозрачно обрабатывает отмену ввода-вывода для драйверов мини-фильтра.

Подпрограммы FltCbdqXxx можно использовать только для операций ввода-вывода на основе IRP. Чтобы определить, представляет ли данная структура данных обратного вызова операцию ввода-вывода на основе IRP, используйте макрос FLT_IS_IRP_OPERATION.

Драйверы мини-фильтра могут использовать любую внутреннюю реализацию для очереди. Диспетчер фильтров взаимодействует с реализацией очереди минифильтратора исключительно с помощью набора подпрограмм диспетчера, предоставляемых FltCbdqInitialize.

Система автоматически блокирует и разблокирует очередь по мере необходимости. Минифильтры драйверов не реализуют блокировку внутри своих CbdqInsertIo, CbdqRemoveIoи КбркПеекNextIo подпрограммы.

Драйверы минифильтра могут использовать любой из примитивов синхронизации операционной системы в качестве механизма блокировки в КбркAcquire и КбркRelease подпрограмм, таких как блокировки спин-блокировки, объекта мьютексаили переменной ресурсов. Обратите внимание, что если драйвер мини-фильтра использует блокировку спина, а не мьютекс или ресурс для защиты очереди, он может вызывать FltCbdqXxx подпрограммы в IRQL <= DISPATCH_LEVEL. Если используется мьютекс или ресурс, драйвер минифильтра должен работать в IRQL <= APC_LEVEL при вызове любой из этих подпрограмм, кроме FltCbdqInitialize.

Драйвер минифильтра не управляет очередью напрямую. Вместо этого он вызывает FltCbdqInsertIo, FltCbdqRemoveIoи FltCbdqRemoveNextIo для добавления или удаления структуры данных обратного вызова. Эти подпрограммы, в свою очередь, вызывают функции обратного вызова, предоставляемые драйвером минифильтра для FltCbdqInitialize.

Драйверы минифильтра должны реализовать подпрограммы очереди следующим образом.

Подпрограмма Кбрк Реализация
CbdqInsertIo Вставьте указанную структуру данных обратного вызова в очередь.
CbdqRemoveIo Удалите указанную структуру данных обратного вызова из очереди.
CbdqPeekNextIo Эта подпрограмма должна позволить системе выполнять цикл по структурам данных обратного вызова с сопоставлением PeekContext в очереди. Кбр = CbdqPeekNextIo(Кбрк, NULL, PeekContext) должен возвращать первую соответствующую запись в очереди, и CbdqPeekNextIo(Cbdq, Кбр, PeekContext) должны возвращать следующую соответствующую запись после заданной структуры данных обратного вызова в очереди. Драйвер минифильтра полностью определяет значение PeekContext и определяет, когда структура данных обратного вызова соответствует значению PeekContext.
CbdqAcquire Эта подпрограмма должна заблокировать очередь, чтобы к нему не могли получить доступ другие потоки. Драйверы мини-фильтра могут использовать любой механизм блокировки для блокировки очереди. Если драйвер минифильтра использует подпрограмму KeAcquireSpinLock, драйвер минифильтра может использовать расположение памяти, на которое указывает параметра Irql подпрограммы для хранения IRQL. В противном случае драйверы минифильтра могут игнорировать этот параметр.
CbdqRelease Эта подпрограмма должна разблокировать очередь, созданную CbdqAcquire. Если драйвер минифильтра использовал блокировку спина и вернул значение IRQL в параметре IrqlCbdqAcquire, система передает это значение в параметре Irql CbdqRelease. Драйвер минифильтра может использовать IRQL для разблокировки блокировки спина путем вызова KeReleaseSpinLock. В противном случае драйверы минифильтра могут игнорировать параметр Irql.
CbdqCompleteCanceledIo Эта подпрограмма должна завершить отмененную операцию ввода-вывода. Как правило, драйверы мини-фильтра могут просто вызывать FltCompletePendedPreOperation(Data, FLT_PREOP_COMPLETE, NULL). Драйверы минифильтра не нужно отменять структуру данных обратного вызова. Диспетчер фильтров автоматически вызывает КбркRemoveIo перед вызовом CbdqCompleteCanceledIo.

Требования

Требование Ценность
целевая платформа Всеобщий
заголовка fltkernel.h (include Fltkernel.h)
IRQL Любой уровень

См. также

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInsertIo

FltCbdqRemoveIo

FltCbdqRemoveNextIo

FltCompletePendedPreOperation

KeAcquireSpinLock

KeReleaseSpinLock