Функция 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 использует функции, предоставляемые в таблице отправки очереди, для блокировки очереди и вставки структуры данных обратного вызова в очередь. Сама операция вставки выполняется подпрограммой CbdqInsert Io очереди.
Дополнительные сведения о создании очереди данных обратного вызова см. в FltCbdqInitialize. Используйте FltCbdqRemoveIo для удаления конкретного запроса ввода-вывода из очереди или FltCbdqRemoveNextIo для удаления следующего доступного запроса ввода-вывода.
Если очередь защищена блокировкой спина, а не объектом мьютекса или переменной ресурсов , вызывающий объект FltCbdqInsertIo может выполняться в IRQL <= DISPATCH_LEVEL. Если используется мьютекс или ресурс, вызывающий объект должен работать в IRQL <= APC_LEVEL.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | fltkernel.h (include Fltkernel.h) |
IRQL | См. раздел "Примечания". |