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