Функция 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.
Cbd
Указатель на структуру данных обратного вызова для вставки в очередь.
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.
Cbd
Указатель на структуру данных обратного вызова, удаляемую из очереди.
[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.
Cbd
Указатель на структуру данных обратного вызова, которая помечает позицию в очереди, чтобы начать поиск соответствия с 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 для соответствующей подпрограммы CbdqAcquire .
[in] CbdqCompleteCanceledIo
Указатель на предоставленную вызывающим абонентом процедуру отмены. Диспетчер фильтров вызывает эту подпрограмму, чтобы сообщить драйверу минифильтра о завершении отмененной операции ввода-вывода. Эта подпрограмма объявляется следующим образом:
typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO)(
_Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
_Inout_ PFLT_CALLBACK_DATA Cbd
);
Кбрюк
Указатель на очередь данных обратного вызова с безопасной отменой драйвера мини-фильтра. Эта очередь должна быть инициализирована путем вызова Метода FltCbdqInitialize.
Cbd
Указатель на структуру данных обратного вызова для отмененной операции ввода-вывода.
Возвращаемое значение
FltCbdqInitialize возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS.
Комментарии
Вновь инициализированная очередь данных обратного вызова находится в состоянии включена, что означает, что элементы структуры данных обратного вызова можно вставить в очередь. Очередь можно отключить, вызвав FltCbdqDisable и повторно включив метод FltCbdqEnable.
Драйверы минифильтра могут использовать подпрограммы FltCbdqXxx для реализации очереди данных обратного вызова для операций ввода-вывода на основе IRP. Используя эти процедуры, драйверы минифильтра могут сделать свои очереди отмены безопасными; система прозрачно обрабатывает отмену ввода-вывода для драйверов минифильтра.
Подпрограммы FltCbdqXxx можно использовать только для операций ввода-вывода на основе IRP. Чтобы определить, представляет ли данная структура данных обратного вызова операцию ввода-вывода на основе IRP, используйте макрос FLT_IS_IRP_OPERATION .
Драйверы минифильтра могут использовать любую внутреннюю реализацию для очереди. Диспетчер фильтров взаимодействует с реализацией очереди драйвера минифильтра исключительно с помощью набора процедур диспетчера, предоставляемых FltCbdqInitialize.
При необходимости система автоматически блокирует и разблокирует очередь. Драйверы минифильтра не реализуют блокировку внутри процедур CbdqInsertIo, CbdqRemoveIo и CbdqPeekNextIo .
Драйверы минифильтра могут использовать любой из примитивов синхронизации операционной системы в качестве механизма блокировки в подпрограммах CbdqAcquire и CbdqRelease , таких как спин-блокировка, объект мьютекса или переменная ресурса. Обратите внимание, что если драйвер минифильтра использует спин-блокировку, а не мьютекс или ресурс для защиты очереди, он может вызывать процедуры FltCbdqXxx в IRQL <= DISPATCH_LEVEL. Если используется мьютекс или ресурс, драйвер мини-фильтра должен работать в среде IRQL <= APC_LEVEL при вызове любой из этих подпрограмм, кроме FltCbdqInitialize.
Драйвер мини-фильтра не управляет очередью напрямую. Вместо этого он вызывает FltCbdqInsertIo, FltCbdqRemoveIo и FltCbdqRemoveNextIo для добавления или удаления структуры данных обратного вызова. Эти подпрограммы, в свою очередь, вызывают функции обратного вызова, предоставляемые драйвером мини-фильтра для FltCbdqInitialize.
Драйверы минифильтра должны реализовывать подпрограммы очередей следующим образом.
Cbdq Routine | Реализация |
---|---|
CbdqInsertIo | Вставьте указанную структуру данных обратного вызова в очередь. |
CbdqRemoveIo | Удалите указанную структуру данных обратного вызова из очереди. |
CbdqPeekNextIo | Эта подпрограмма должна позволить системе циклически перебирать структуры данных обратного вызова с соответствующим peekContext в очереди. Cbd = CbdqPeekNextIo(Cbdq, NULL, PeekContext) должен возвращать первую соответствующую запись в очереди, а CbdqPeekNextIo(Cbdq, Cbd, PeekContext) должен возвращать следующую соответствующую запись после заданной структуры данных обратного вызова в очереди. Драйвер минифильтра полностью определяет значение PeekContext и определяет, когда структура данных обратного вызова соответствует значению PeekContext . |
CbdqAcquire | Эта подпрограмма должна блокировать очередь, чтобы другие потоки не могли получить к ней доступ. Драйверы минифильтра могут использовать любой механизм блокировки для блокировки очереди. Если драйвер мини-фильтра использует подпрограмму KeAcquireSpinLock , драйвер минифильтра может использовать расположение памяти, на которое указывает параметр Irql подпрограммы, для хранения IRQL. В противном случае драйверы минифильтра могут игнорировать этот параметр. |
CbdqRelease | Эта подпрограмма должна разблокировать очередь, созданную с помощью CbdqAcquire. Если драйвер минифильтра использовал спиновую блокировку и вернул значение IRQL в параметре IrqlcbdqAcquire, система передает это значение в параметре Irqlдля CbdqRelease. Драйвер минифильтра может использовать IRQL для разблокировки спин-блокировки путем вызова KeReleaseSpinLock. В противном случае драйверы минифильтра могут игнорировать параметр Irql . |
CbdqCompleteCanceledIo | Эта подпрограмма должна завершить отмененную операцию ввода-вывода. Как правило, драйверы минифильтров могут просто вызывать FltCompletePendedPreOperation(Data, FLT_PREOP_COMPLETE, NULL). Драйверам минифильтра не требуется выписывать структуру данных обратного вызова. Диспетчер фильтров автоматически вызывает cbdqRemoveIo очереди перед вызовом CbdqCompleteCanceledIo. |
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | fltkernel.h (включая Fltkernel.h) |
IRQL | Любой уровень |