释放设备和控制器对象

在驱动程序删除设备或控制器对象之前,它必须释放对存储在相应设备或控制器扩展中的外部资源的引用,例如指向其他驱动程序对象或中断对象的指针。 然后,它可以为驱动程序创建的每个设备对象调用 IoDeleteDevice 。 以前调用 IoCreateController 的非 WDM 驱动程序还必须调用 IoDeleteController

Unload 例程使用相应的设备对象调用 IoDeleteDevice 时,驱动程序为其在设备扩展中提供存储的任何内核定义对象都会自动释放。 通常,如果驱动程序在其设备扩展中为该对象提供存储,则通过调用 KeInitializeXxx 设置 DriverEntry 或 Reinitialize 例程设置的任何对象都可以通过调用 IoDeleteDevice 来释放。 例如,如果驱动程序具有 CustomTimerDpc 例程,并且为其设备扩展中必需的 DPC 和计时器对象提供了存储,则对 IoDeleteDevice 的调用会释放这些系统资源。

同样,当 Unload 例程使用相应的控制器对象调用 IoDeleteController 时,驱动程序为其在控制器扩展中提供存储的任何内核定义对象都会自动释放。

如果 DriverEntryReinitialize 例程(称为 IoGetConfigurationInformation )以递增特定类型的设备的计数, Unload 例程还必须调用 IoGetConfigurationInformation ,并在删除相应的设备对象时减去 I/O 管理器的全局配置信息结构中其设备的计数。

在返回控制之前, Unload 例程还负责释放尚未由其他驱动程序例程释放的任何其他驱动程序分配的资源。