функция обратного вызова PFLT_INSTANCE_TEARDOWN_CALLBACK (fltkernel.h)

Драйвер минифильтра может зарегистрировать две подпрограммы типа PFLT_INSTANCE_TEARDOWN_CALLBACK в качестве подпрограмм InstanceTeardownStartCallback и InstanceTeardownCompleteCallback драйвера минифильтра.

Синтаксис

PFLT_INSTANCE_TEARDOWN_CALLBACK PfltInstanceTeardownCallback;

void PfltInstanceTeardownCallback(
  [in] PCFLT_RELATED_OBJECTS FltObjects,
  [in] FLT_INSTANCE_TEARDOWN_FLAGS Reason
)
{...}

Параметры

[in] FltObjects

Указатель на структуру FLT_RELATED_OBJECTS , содержащую непрозрачные указатели на объекты, связанные с текущей операцией ввода-вывода.

[in] Reason

Флаг, указывающий, почему экземпляр драйвера минифильтра удаляется. Это может быть:

Flag Значение
FLTFL_INSTANCE_TEARDOWN_MANUAL (0x00000001) Экземпляр отсоединяется, так как приложение пользовательского режима называется FilterDetach , или компонент режима ядра — FltDetachVolume.
FLTFL_INSTANCE_TEARDOWN_FILTER_UNLOAD (0x00000002) Драйвер минифильтра выгружается.
FLTFL_INSTANCE_TEARDOWN_MANDATORY_FILTER_UNLOAD (0x00000004) Драйвер минифильтра выгружается.
FLTFL_INSTANCE_TEARDOWN_VOLUME_DISMOUNT (0x00000008) Если задано значение , том отключается. (Или том уже отключен. Или произошел сбой операции подключения тома. Или экземпляр драйвера минифильтра или том сносится. Или файловая система не зарегистрирована как активная файловая система.)
FLTFL_INSTANCE_TEARDOWN_INTERNAL_ERROR (0x00000010) В системе произошла непредвиденная внутренняя ошибка.

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

None

Remarks

Когда драйвер минифильтра регистрирует себя путем вызова FltRegisterFilter из своей подпрограммы DriverEntry , он может зарегистрировать две подпрограммы типа PFLT_INSTANCE_TEARDOWN_CALLBACK в качестве подпрограммы InstanceTeardownStartCallback и InstanceTeardownCompleteCallback драйвера минифильтра. Чтобы зарегистрировать эти подпрограммы обратного вызова, драйвер минифильтра сохраняет адреса двух подпрограмм типа PFLT_INSTANCE_TEARDOWN_CALLBACK в членах InstanceTeardownStartCallback и InstanceTeardownCompleteCallbackструктуры FLT_REGISTRATION , которую драйвер минифильтра передает в качестве параметра Registrationпараметра FltRegisterFilter.

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

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

Подпрограмма InstanceTeardownStartCallback должна:

  • Вызовите FltCompletePendedPreOperation для каждой операции ввода-вывода, которая была выполнена в подпрограмме обратного вызова драйвера минифильтра перед операцией, чтобы завершить операцию или вернуть управление операцией диспетчеру фильтров.
  • Новые операции ввода-вывода не выполняются. Если драйвер минифильтра использует очередь данных обратного вызова, он должен вызвать FltCbdqDisable , чтобы отключить ее.
  • Вызовите Метод FltCompletePendedPostOperation для каждой операции ввода-вывода, которая была выполнена в подпрограмме обратного вызова драйвера минифильтра после операции, чтобы вернуть управление операцией диспетчеру фильтров.

Подпрограмма InstanceTeardownStartCallback при необходимости может выполнять следующие действия, чтобы драйвер минифильтра максимально быстро выгрузил:

  • Закройте все открытые файлы.
  • Убедитесь, что рабочие потоки выполняют только минимум, необходимый для завершения обработки невыполненных рабочих элементов.
  • Вызовите Метод FltCancelIo , чтобы отменить все операции ввода-вывода, инициированные драйвером минифильтра.
  • Прекратите постановку в очередь новых рабочих элементов.

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

Подпрограмма InstanceTeardownCompleteCallback вызывается после завершения процесса удаления, чтобы позволить драйверу минифильтра закрыть открытые файлы и выполнить любую другую необходимую обработку очистки.

Подпрограмма InstanceTeardownCompleteCallback должна закрыть все файлы, открытые драйвером минифильтра.

Диспетчер фильтров вызывает подпрограмму InstanceTeardownCompleteCallback драйвера минифильтра только после завершения или очистки всех невыполненных операций ввода-вывода.

Предупреждение

Подпрограмма InstanceTeardownCompleteCallback не будет вызываться, если выполняются какие-либо из следующих условий:

  • Существуют неоплачиваемые операции ввода-вывода.
  • Существуют все незавершенные операции ввода-вывода, инициированные драйвером минифильтра.

Если экземпляр драйвера минифильтра удаляется из-за выгрузки драйвера минифильтра, операция выгрузки зависает до тех пор, пока не будет возвращена подпрограмма InstanceTeardownCompleteCallback . Для отладки таких проблем необходимо включить средство проверки драйверов в драйвере минифильтра. Параметр Filter Verifier I/O Verification (Проверка ввода-вывода фильтра) может помочь определить возможные причины, такие как невыпущенные ссылки, которые помешают выгрузке драйвера минифильтра. Дополнительные сведения см. в разделе Средство проверки фильтров.

Обратите внимание, что ссылка на экземпляр (путем вызова FltObjectReference) не препятствует вызову подпрограммы InstanceTeardownCompleteCallback .

Диспетчер фильтров вызывает подпрограммы InstanceTeardownStartCallback и InstanceTeardownCompleteCallback в PASSIVE_LEVEL IRQL.

Требования

Требование Значение
Целевая платформа Персональный компьютер
Верхняя часть fltkernel.h (включая Fltkernel.h)
IRQL См. раздел "Примечания".

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

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FilterDetach

FltCancelIo

FltCbdqDisable

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltDetachVolume

FltObjectReference

FltRegisterFilter

PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK

PFLT_INSTANCE_SETUP_CALLBACK