调用 FilterUnloadCallback 例程时

筛选器管理器调用微筛选器驱动程序的 FilterUnloadCallback 例程,然后通过以下方式之一卸载微筛选器驱动程序:

  • 非强制卸载。 当用户模式应用程序名为 FilterUnload 或内核模式驱动程序调用 FltUnloadFilter 时,会发生这种类型的卸载。 在命令提示符下键入 fltmc unload 时也会发生这种情况。

  • 强制卸载。 在命令提示符下键入 sc stopnet stop 发出服务停止请求时,会发生这种类型的卸载。 (有关 sc stopnet stop 命令的详细信息,请单击“开始”菜单上的“ 帮助和支持 ”。) 当用户模式应用程序调用 Microsoft Win32 ControlService 函数,将SERVICE_CONTROL_STOP控件代码作为 dwControl 参数传递时,也会发生这种情况。 (有关 Win32 服务函数的详细信息,请参阅 Microsoft Windows SDK 文档。)

对于非强制卸载,如果微筛选器驱动程序的 FilterUnloadCallback 例程返回错误或警告 NTSTATUS 值(如STATUS_FLT_DO_NOT_DETACH),则筛选器管理器不会卸载微筛选器驱动程序。

对于强制卸载,筛选器管理器在调用微筛选器驱动程序的 FilterUnloadCallback 例程后卸载微筛选器驱动程序,即使 FilterUnloadCallback 例程返回错误或警告 NTSTATUS 值(例如STATUS_FLT_DO_NOT_DETACH)。

若要禁用微筛选器驱动程序的强制卸载,微筛选器驱动程序在 FLT_REGISTRATION 结构的Flags 成员中设置FLTFL_REGISTRATION_DO_NOT_SUPPORT_SERVICE_STOP标志,该标志作为参数传递给其 DriverEntry 例程中的 FltRegisterFilter。 设置此标志后,筛选器管理器通常会处理非强制卸载请求。 但是,强制卸载请求将失败。 筛选器管理器不会为失败的卸载请求调用微筛选器驱动程序的 FilterUnloadCallback 例程。

请注意,如果微筛选器驱动程序的 DriverEntry 例程返回警告或错误 NTSTATUS 值,则不调用 FilterUnloadCallback 例程;筛选器管理器只是卸载微筛选器驱动程序。

系统关闭时不调用 FilterUnloadCallback 例程。 必须执行关闭处理的微筛选器驱动程序应为IRP_MJ_SHUTDOWN操作注册预操作回调例程。