Изменение параметров для операции ввода-вывода

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

Параметры операции ввода-вывода находятся в структуре данных обратного вызова (FLT_CALLBACK_DATA) и в структуре блока параметров ввода-вывода (FLT_IO_PARAMETER_BLOCK) для операции. Подпрограмма обратного вызова драйвера минифильтра перед операцией и послеоперационный обратный вызов получают указатель на структуру данных обратного вызова для операции во входном параметре Data. Элемент Iopb структуры данных обратного вызова является указателем на структуру блоков параметров ввода-вывода, содержащую параметры для операции.

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

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

После изменения параметров операции ввода-вывода подпрограмма обратного вызова перед операцией или после операции должна указать, что она сделала это путем вызова FltSetCallbackDataDirty, если только она не изменила содержимое поля IoStatus структуры обратного вызова. В противном случае диспетчер фильтров проигнорирует любые изменения значений параметров. FltSetCallbackDataDirty задает флаг FLTFL_CALLBACK_DATA_DIRTY в структуре данных обратного вызова для операции ввода-вывода. Драйверы минифильтра могут проверить этот флаг, вызвав FltIsCallbackDataDirty или снимите его, вызвав Метод FltClearCallbackDataDirty.

Если подпрограмма обратного вызова драйвера минифильтра перед операцией ввода-вывода изменяет параметры операции ввода-вывода, все драйверы минифильтра ниже этого драйвера минифильтра в стеке экземпляров драйвера минифильтра будут получать измененные параметры во входных параметрах Data и FltObjects в подпрограммах обратного вызова перед операцией и после операции. (Драйверы минифильтра не могут напрямую изменять содержимое структуры FLT_RELATED_OBJECTS , на которую указывает параметр FltObjects . Однако если драйвер минифильтра изменяет целевой экземпляр или целевой файловый объект для операции ввода-вывода, диспетчер фильтров изменяет значение соответствующего элемента Instance или FileObject структуры FLT_RELATED_OBJECTS, передаваемой в более низкие драйверы минифильтра.)

Хотя любые изменения параметров, которые выполняет подпрограмма обратного вызова драйвера минифильтра перед операции, не получаются собственной процедурой обратного вызова после операции драйвера минифильтра, подпрограмма обратного вызова перед операции может передавать сведения об измененных параметрах в собственную процедуру обратного вызова после операции. Если подпрограмма обратного вызова перед операцией передает операцию ввода-вывода в стек, возвращая FLT_PREOP_SUCCESS_WITH_CALLBACK или FLT_PREOP_SYNCHRONIZE, она может хранить сведения об измененных значениях параметров в структуру, определяемую драйвером минифильтра, на которую указывает выходной параметр CompletionContext . Диспетчер фильтров передает этот указатель структуры во входном параметре CompletionContext в подпрограмму обратного вызова после операции.

Дополнительные сведения о параметрах операции ввода-вывода см. в разделе FLT_CALLBACK_DATA и FLT_IO_PARAMETER_BLOCK.