PnP 驱动程序必须具有 Unload 例程,该例程可删除 DriverEntry 例程创建的任何特定于驱动程序的资源,例如内存、线程和事件。 如果没有要删除的特定于驱动程序的资源,驱动程序仍必须具有 Unload 例程,但只能返回。
删除驱动程序的所有设备后,可以随时调用驱动程序的 Unload 例程。 PnP 管理器在 IRQL = PASSIVE_LEVEL的系统线程上下文中调用驱动程序的 Unload 例程。
PnP 驱动程序响应 PnP 设备移除 IRP,释放特定于设备的资源和设备对象。 PnP 管理器代表它所枚举的每个 PnP 设备,以及驱动程序通过使用 IoReportDetectedDevice 报告的任何根枚举的旧设备,发送这些 IRP。
因此,PnP 驱动程序的 Unload 例程通常很简单,通常只包含 return 语句。 但是,如果驱动程序在其 DriverEntry 例程中分配了任何驱动程序范围的资源,则必须解除分配 其 Unload 例程中的这些资源,除非它已经这样做。 通常,卸载 PnP 驱动程序的过程是同步作。
I/O 管理器释放驱动程序对象以及驱动程序使用 IoAllocateDriverObjectExtension 分配的任何驱动程序对象扩展。