Функция FltReissueSynchronousIo (fltkernel.h)
FltReissueSynchronousIo инициирует новую синхронную операцию ввода-вывода, которая использует параметры из ранее синхронизированной операции ввода-вывода.
Синтаксис
VOID FLTAPI FltReissueSynchronousIo(
[in] PFLT_INSTANCE InitiatingInstance,
[in] PFLT_CALLBACK_DATA CallbackData
);
Параметры
[in] InitiatingInstance
Непрозрачный указатель экземпляра на экземпляр драйвера мини-фильтра, который перезаписыв операцию ввода-вывода. Должен быть тот же экземпляр, который инициировал предыдущую операцию ввода-вывода. Этот параметр является обязательным и не может иметь значение NULL.
[in] CallbackData
Указатель на структуру обратного вызова (FLT_CALLBACK_DATA) из ранее синхронизированной операции ввода-вывода. Этот параметр является обязательным и не может иметь значение NULL.
Возвращаемое значение
Никакой
Замечания
Драйвер мини-фильтра вызывает FltReissueSynchronousIo из подпрограммы обратного вызова после операции (PFLT_POST_OPERATION_CALLBACK) для повторного получения синхронизированного запроса ввода-вывода. Обычно он вызывает FltReissueSynchronousIo из подпрограммы обратного вызова после операции для повторной отправки неудачной операции с различными параметрами или для обработки повторной отскоки. Однако он также может вызывать FltReissueSynchronousIo для повторного получения ввода-вывода, созданного с помощью вызовов FltAllocateCallbackData и подпрограммы FltPerformSynchronousIo. В этой ситуации не имеет значения, вызывает ли он FltReissueSynchronousIo в подпрограмме обратного вызова после операции или вне контекста подпрограммы обратного вызова операции. Для вызовов вне контекста подпрограмм обратного вызова после операции рекомендуется использовать fltReuseCallbackData и FltPerformSynchronousIo подпрограммы.
Вызывающий объект может изменить содержимое блока параметров ввода-вывода структуры обратного вызова (FLT_CALLBACK_DATA) перед повторной выборой запроса ввода-вывода. Если это так, он должен вызывать FltSetCallbackDataDirty перед вызовом FltReissueSynchronousIo.
Например, если драйвер минифильтра использует точки повторного анализа, а его подпрограмма обратного вызова после создания вызывается для операции создания, возвращающей STATUS_REPARSE, драйвер минифильтра может повторно выполнить операцию создания для собственных точек повторного анализа. В этом случае драйвер минифильтра завершит следующие действия:
Задайте флаг FILE_OPEN_REPARSE_POINT в блоке параметров ввода-вывода структуры данных обратного вызова.
Вызов FltSetCallbackDataDirty.
Вызовите FltReissueSynchronousIo, чтобы повторно выполнить запрос на создание.
Диспетчер фильтров отправляет повторный запрос ввода-вывода только в экземпляры драйвера мини-фильтра, присоединенные под экземпляром инициирующего экземпляра (указанный в параметре InitiatingInstance) и файловой системе. Экземпляры драйверов мини-фильтра, подключенные над экземпляром инициирования, не получают повторного запроса ввода-вывода.
Можно повторно использовать только синхронизированные операции ввода-вывода. Чтобы предоставить драйверу возможность повторной передачи, вызывая FltReissueSynchronousIo в подпрограмме обратного вызова после операции, драйвер мини-фильтра должен специально возвращать FLT_PREOP_SYNCHRONIZE в подпрограмме обратного вызова предварительной работы.
Заметка
Драйвер мини-фильтра не вызывает подпрограмму FltIsOperationSynchronous, чтобы определить, FLT_PREOP_SYNCHRONIZE возвращается ли подпрограмма обратного вызова перед выполнением этой операции. Драйвер минифильтра вызывает FltIsOperationSynchronous, чтобы определить, синхронна ли операция с точки зрения диспетчера ввода-вывода.
Можно перезапустить только операции ввода-вывода на основе IRP. Операции быстрого ввода-вывода и операции обратного вызова файловой системы (FSFilter) не могут быть повторно возвращены. Чтобы определить, основана ли операция ввода-вывода на основе IRP, используйте макрос FLT_IS_IRP_OPERATION.
Операция создания (IRP_MJ_CREATE), которая была отменена, не может быть перезаписаны. Перед вызовом FltReissueSynchronousIo для операции создания вызывающие объекты должны проверить элемент Flags объекта файла для операции создания. Если установлен флаг FO_FILE_OPEN_CANCELLED, это означает, что операция создания отменена, а операция закрытия (IRP_MJ_CLOSE) будет выдана для этого объекта файла. Если FltReissueSynchronousIo вызывается для операции создания, которая была отменена, диспетчер фильтров завершает повторный запрос ввода-вывода с STATUS_CANCELLED.
Заметка
Когда драйверы минифильтра повторно выдают создание в обратном вызове после создания, им не нужно освободить и задать буфер, связанный с точкой повторного анализа (поле TagData в CallbackData) значение NULL. Вместо этого диспетчер фильтров выпускает и задает для них значение NULL.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Накопительный пакет обновления Windows 2000 1 для SP4; Windows XP с пакетом обновления 2 (SP2) |
минимальный поддерживаемый сервер | Windows Server 2003 с пакетом обновления 1 (SP1) |
целевая платформа | Всеобщий |
заголовка | fltkernel.h (include FltKernel.h) |
библиотеки | FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL (не разбиение операций ввода-вывода на разбиение по страницам можно повторно в PASSIVE_LEVEL) |