在驅動程式刪除裝置或控制器物件之前,它必須釋放其對外部資源的引用,例如,指向其他驅動程式物件或中斷物件的指標,這些資料都儲存在對應的裝置或控制器擴充功能中。 然後,它可以針對驅動程式所建立的每個裝置物件呼叫 IoDeleteDevice 。 先前稱為 IoCreateController 的非WDM驅動程式也必須呼叫 IoDeleteController。
在 Unload 例程使用對應的裝置物件呼叫 IoDeleteDevice 時,驅動程式在裝置擴充功能中提供儲存空間的任何核心定義物件會自動被釋放。 一般而言,如果驅動程式在其裝置延伸模組中為該物件提供儲存空間,則呼叫 KeInitializeXxx 所設定的 DriverEntry 或 Reinitialize 例程所設定的任何物件都可以透過呼叫 IoDeleteDevice 來釋放。 例如,如果驅動程式具有 CustomTimerDpc 例程,並且已為其裝置擴充功能中必要的 DPC 和定時器物件提供記憶體, 則對 IoDeleteDevice 的呼叫會釋放這些系統資源。
同樣地,當驅動程式在控制器擴充功能中提供存儲的任何核心定義物件,並在 Unload 例程呼叫 IoDeleteController 與對應的控制器物件時,這些物件會自動釋放。
如果 DriverEntry 或 Reinitialize 例程呼叫了 IoGetConfigurationInformation 來遞增特定類型裝置的計數,那麼 Unload 例程也必須呼叫 IoGetConfigurationInformation,並在 I/O 管理員的全域組態資訊結構中遞減其裝置的計數,以便刪除對應的裝置物件。
在傳回控件之前, Unload 例程也會負責釋放任何其他尚未由其他驅動程式例程釋放的驅動程式配置資源。