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


Функция 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 См. раздел "Примечания".

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

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInitialize

FltCbdqRemoveIo

FltCbdqRemoveNextIo