Функция FltCbdqInsertIo (fltkernel.h)
FltCbdqInsertIo вставляет структуру данных обратного вызова для операции ввода-вывода в очередь данных обратного вызова драйвера фильтра.
Синтаксис
NTSTATUS FLTAPI FltCbdqInsertIo(
[in, out] PFLT_CALLBACK_DATA_QUEUE Cbdq,
[in] PFLT_CALLBACK_DATA Cbd,
[in, optional] PFLT_CALLBACK_DATA_QUEUE_IO_CONTEXT Context,
[in, optional] PVOID InsertContext
);
Параметры
[in, out] Cbdq
Указатель на очередь данных обратного вызова, безопасную для отмены. Эта очередь должна быть инициализирована путем вызова Метода FltCbdqInitialize.
[in] Cbd
Указатель на структуру данных обратного вызова (FLT_CALLBACK_DATA) для операции ввода-вывода для постановки в очередь. Операция должна быть операцией ввода-вывода на основе IRP.
[in, optional] Context
Указанная вызывающим объектом переменная, которая получает непрозрачный указатель контекста для запроса ввода-вывода. Драйверы фильтров могут использовать этот указатель для идентификации определенного элемента в очереди, чтобы его можно было удалить, вызвав FltCbdqRemoveIo. Если драйвер фильтра не требуется для удаления определенных запросов ввода-вывода из очереди, этот параметр может иметь значение NULL.
[in, optional] InsertContext
Указатель контекста, передаваемый в подпрограмму обратного вызова CbdqInsertIo драйвера фильтра.
Возвращаемое значение
FltCbdqInsertIo возвращает STATUS_SUCCESS, когда структура данных обратного вызова была вставлена в очередь данных обратного вызова, или соответствующее значение NTSTATUS, например следующее:
Код возврата | Описание |
---|---|
STATUS_FLT_CBDQ_DISABLED | Структура данных обратного вызова не была вставлена в очередь данных обратного вызова, так как в настоящее время очередь отключена. Чтобы повторно включить очередь, вызовите FltCbdqEnable. Это код ошибки. |
Примечание
В случае успеха FltCbdqInsertIo возвращает все, что возвращает обратный вызов InsertIo фильтра; Например, фильтр может возвращать либо STATUS_SUCCESS, либо STATUS_PENDING, чтобы указать на успешное выполнение. Важно, чтобы фильтр был самосоверяющимся по значению, которое он использует для указания успеха.
Комментарии
FltCbdqInsertIo вставляет указанную структуру данных обратного вызова (FLT_CALLBACK_DATA) в очередь данных обратного вызова драйвера фильтра.
- Обратите внимание, что существует потенциальное условие гонки между драйвером фильтра, вставляющим данные обратного вызова, и соответствующим отмененным IRP. Этого можно избежать, немедленно вызвав процедуру отмены очереди, если IRP уже отменена.
Драйверы фильтров могут использовать подпрограммы FltCbdqXxx для реализации очереди данных обратного вызова для операций ввода-вывода на основе IRP. С помощью этих процедур драйверы фильтров могут сделать очереди безопасными для отмены; система прозрачно обрабатывает отмену ввода-вывода для драйверов фильтров.
Подпрограммы FltCbdqXxx можно использовать только для операций ввода-вывода на основе IRP. Чтобы определить, представляет ли данная структура данных обратного вызова операцию ввода-вывода на основе IRP, используйте макрос FLT_IS_IRP_OPERATION .
Очередь данных обратного вызова инициализируется путем вызова FltCbdqInitialize. FltCbdqInsertIo использует функции, предоставляемые в таблице диспетчеризации очереди, для блокировки очереди и вставки структуры данных обратного вызова в очередь. Сама операция вставки выполняется подпрограммой CbdqInsertIo очереди.
Дополнительные сведения о создании очереди данных обратного вызова см. в статье FltCbdqInitialize . Используйте FltCbdqRemoveIo , чтобы удалить конкретный запрос ввода-вывода из очереди, или FltCbdqRemoveNextIo , чтобы удалить следующий доступный запрос ввода-вывода.
Если очередь защищена спин-блокировкой , а не объектом мьютекса или переменной ресурса, вызывающий объект FltCbdqInsertIo может выполняться в IRQL <= DISPATCH_LEVEL. Если используется мьютекс или ресурс, вызывающий объект должен работать в среде IRQL <= APC_LEVEL.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | fltkernel.h (включая Fltkernel.h) |
IRQL | См. раздел "Примечания". |