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


Функция 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.

Возвращаемое значение

None

Remarks

Драйвер минифильтра вызывает FltReissueSynchronousIo из подпрограммы обратного вызова после операции (PFLT_POST_OPERATION_CALLBACK) для повторной отправки синхронизированного запроса ввода-вывода. Обычно он вызывает FltReissueSynchronousIo из подпрограммы обратного вызова после операции, чтобы повторно выполнить неудачную операцию с другими параметрами или для обработки отказов повторного преобразования. Однако он также может вызвать FltReissueSynchronousIo для повторного ввода-вывода, созданного драйвером минифильтра с помощью вызовов процедур FltAllocateCallbackData и FltPerformSynchronousIo . В этой ситуации не имеет значения, вызывает ли он FltReissueSynchronousIo в подпрограмме обратного вызова после операции или вне контекста процедуры обратного вызова операции. Для вызовов вне контекста подпрограммы обратного вызова после операции рекомендуется использовать процедуры FltReuseCallbackData и FltPerformSynchronousIo .

Вызывающий объект может изменить содержимое блока параметров ввода-вывода структуры данных обратного вызова (FLT_CALLBACK_DATA) перед повторной отправкой запроса ввода-вывода. Если это так, он должен вызвать FltSetCallbackDataDirty перед вызовом FltReissueSynchronousIo.

Например, если драйвер минифильтра использует точки повторного анализа и его подпрограмма обратного вызова после создания вызывается для операции создания, возвращающей STATUS_REPARSE, драйвер минифильтра может повторно выдать операцию создания для собственных точек повторного анализа. В этом случае драйвер мини-фильтра выполнит следующие действия.

  1. Установите флаг FILE_OPEN_REPARSE_POINT в блоке параметров ввода-вывода структуры данных обратного вызова.

  2. Вызовите FltSetCallbackDataDirty.

  3. Вызовите 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.

Примечание

Когда драйверы мини-фильтра повторно выдают create в обратном вызове после создания, им не нужно освобождать и устанавливать буфер, связанный с точкой повторного анализа (поле TagData в CallbackData), значение NULL. Вместо этого диспетчер фильтров освобождает и устанавливает для буфера значение NULL.

Требования

Требование Значение
Минимальная версия клиента Накопительный пакет обновления 1 для Windows 2000 с пакетом обновления 4 (SP4); Windows XP с пакетом обновления 2 (SP2)
Минимальная версия сервера Windows Server 2003 с пакетом обновления 1 (SP1)
Целевая платформа Универсальное
Верхняя часть fltkernel.h (включая FltKernel.h)
Библиотека FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL (операции ввода-вывода без разбиения по страницам можно переиздить только в PASSIVE_LEVEL)

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

FLT_CALLBACK_DATA

FLT_IS_FASTIO_OPERATION

FLT_IS_FS_FILTER_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_PARAMETERS для IRP_MJ_CREATE

FltCancelFileOpen

FltIsOperationSynchronous

FltPerformSynchronousIo

FltReuseCallbackData

FltSetCallbackDataDirty

IRP_MJ_CLOSE

IRP_MJ_CREATE

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK