Unload 例程环境

当驱动程序被替换或驱动程序服务已删除的所有设备时,操作系统将卸载驱动程序。 如果驱动程序在处理IRP_MN_REMOVE_DEVICE请求后没有更多设备对象,PnP 管理器会调用 PnP 驱动程序的 Unload 例程。

在卸载序列开始时,I/O 管理器或 PnP 管理器将驱动程序对象及其设备对象标记为“卸载挂起”。 驱动程序标记为“卸载挂起”后,其他驱动程序不能附加到该驱动程序,也不能对驱动程序的设备对象进行任何其他引用。 驱动程序可以完成未完成的 IRP,但系统不会向驱动程序发送任何新的 IRP。

当以下所有条件都成立时,I/O 管理器调用驱动程序的 Unload 例程:

  • 不会保留对驱动程序创建的任何设备对象的引用。 换句话说,不能打开与基础设备关联的文件,也不能为驱动程序的任何设备对象提供任何未完成的 IRP。

  • 没有其他驱动程序仍附加到此驱动程序。

  • 驱动程序已调用 IoUnregisterPlugPlayNotification 来取消注册它以前注册的所有 PnP 通知。

请注意,如果驱动程序的 DriverEntry 例程返回失败状态,则不调用 Unload 例程。 在这种情况下,I/O 管理器只是释放驱动程序占用的内存空间。

PnP 管理器和 I/O 管理器都不会在系统关闭时调用 Unload 例程。 必须执行关闭处理的驱动程序应注册 DispatchShutdown 例程。