When the FilterUnloadCallback Routine Is Called 何时FilterUnloadCallback 被调用

过滤管理器调用一个微过滤驱动的FilterUnloadCallback 例程在卸载微过滤驱动之前通过以下俩个方式之一:

非托管的卸载

这个类型的卸载发生当一个用户模式的应用程序已经调用FilterUnload或内核模式驱动调用FltUnloadFilter 。它也发生在你在命令行里输入fltmc unload的时候。

托管卸载

这个类型的卸载发生你在命令行里输入sc stop 或 net stop的时候。它也发生在用户模式的应用程序调用Microsoft Win32 ControlService 方法时,传递SERVICE_CONTROL_STOP 作为dwControl 的参数。

对于非托管的卸载,如果微过滤驱动的FilterUnloadCallback 卸载例程返回一个错误或一个警告,eg:STATUS_FLT_DO_NOT_DETACH,过滤管理器不卸载微过滤驱动。

对于一个托管的卸载,过滤管理器卸载微过滤驱动在微过滤驱动调用FilterUnloadCallback 例程之后,即使FilterUnloadCallback 例程返回一个错误或警告例程,eg:STATUS_FLT_DO_NOT_DETACH

对于一个微过滤驱动为了使托管卸载失效,微过滤驱动设置FLT_REGISTRATION结构体的Flags 参数为FLTFL_REGISTRATION_DO_NOT_SUPPORT_SERVICE_STOP ,FLT_REGISTRATION结构体在DriverEntry 例程里作为参数传给FltRegisterFilter 。当这个flag被设置,过滤管理器正常的执行非托管的卸载请求。然而,托管的卸载请求将失败 。过滤管理器不调用微过滤驱动的FilterUnloadCallback 例程作为失败的卸载请求 。

 

注意:如果微过滤驱动的DriverEntry 例程返回一个警告或错误状态 ,FilterUnloadCallback 例程将不会被调用。过滤管理器简单的卸载微过滤驱动 。

FilterUnloadCallback 例程不被调用在系统关闭的时候 ,一个必须执行关闭流程的微过滤驱动应该注册一个前操作回调例程为IRP_MJ_SHUTDOWN 操作。

posted @ 2011-01-10 14:31  UnhandleException  阅读(410)  评论(0编辑  收藏  举报