InstanceQueryTeardown()回调仅仅在一个手工解除绑定的请求下被调用。以下操作可能导致:
FltDetachVolume() (内核模式)
FilterDetach() (用户模式)
如果一个微过滤器没有提供这个回调,那么手工解除绑定是不被支持的。但是,卷的解挂载(dismount)和微
过滤器的卸载还是允许的。
如果这个回调返回成功,那么过滤管理器开始销毁给出的实例。最后实例的InstanceTeardownStart()和
InstanceTeardownComplete()会被调用。如果返回了错误或者警告,手工解除绑定会失败。推荐的错误代码有:
STATUS_FLT_DO_NOT_DETACH,不过实际上你可以返回任何错误代码。
InstanceQueryTeardown()回调的原型是:
typedef NTSTATUS
(*PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK) (
IN PCFLT_RELATED_OBJECTS FltObjects,
IN FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
);
和InstanceSetupCallback()类似,FltObject指出了与这个销毁操作有关的微过滤器,卷和实例。
6.3. 实例解绑定的同步
如果InstanceTeardownStart()的时候已经决定要解除绑定,那么这个例程中必须做以下的事情:
(1)重设所有的未决的I/O操作(包括预操作和后操作)
(2)保证不会有新的I/O操作进入未决。
(3)对刚刚到达的操作开始最少的工作。
同时,应该做以下操作:
(1)关闭所有打开的文件。
(2)取消所有本过滤器发起的I/O请求。
(3)停止将新的工作任务排队。
然后微过滤器把控制权交还过滤管理器来继续它的销毁过程。当所有与这个实例相关的操作都排除干净或者完
成了,InstanceTeardownComplete()会被调用。管理器保证此时所有此实例的存在的操作回调都完成了。
这时微过滤器必须关闭所有这个实例打开的文件。
这两个回调的原型如下:
typedef VOID
(*PFLT_INSTANCE_TEARDOWN_CALLBACK) (
IN PCFLT_RELATED_OBJECTS FltObjects,
IN FLT_INSTANCE_TEARDOWN_FLAGS Reason
);
FltObjets中有微过滤器,卷和实例。Resson参数指明这次销毁的原因,可能是以下一些标记的组合:
FLTFL_INSTANCE_TEARDOWN_MANUAL: 这 次销毁操作是一个手工的请求。(FilterDetach() 或 者
FltDetachVolume()).
FLTFL_INSTANCE_TEARDOWN_FILTER_UNLOAD: 这次销毁操作是因为微过滤器执行卸载或者是选择了把卸载请求
失败掉导致的。
FLTFL_INSTANCE_TEARDOWN_MANDATORY_FILTER_UNLOAD: 这次销毁操作是一次强制卸载导致的。这种情况下不
能把卸载请求失败掉。
FLTFL_INSTANCE_TEARDOWN_VOLUME_DISMOUNT: 这 次 销 毁 是 一 个 卷 被 解 挂 载 的 结 果 。
FLTFL_INSTANCE_TEARDOWN_INTERNAL_ERROR: 这次销毁是因为安装实例的时候的一个内部错误导致的,比如内
存不足。
请注意没有返回值。InstanceTeardownStart()和InstanceTeardownComplete()都不能失败。过滤管理器保证这
些例程都运行在Passive IRQL.
7.回调支持