Liberar objetos de dispositivo y controlador
Antes de que un controlador elimine un dispositivo o un objeto de controlador, debe liberar sus referencias a recursos externos, como punteros a otros objetos de controladores o a interrumpir objetos, almacenados en la extensión de dispositivo o controlador correspondiente. A continuación, puede llamar a IoDeleteDevice para cada objeto de dispositivo que creó el controlador. Un controlador que no sea WDM que anteriormente llamó a IoCreateController también debe llamar a IoDeleteController.
Cualquier objeto definido por kernel para el que el controlador proporciona almacenamiento en una extensión de dispositivo se libera automáticamente cuando la rutina Unload llama a IoDeleteDevice con el objeto de dispositivo correspondiente. En general, cualquier objeto configurado por la rutina DriverEntry o Reinitialize llamando a KeInitializeXxx puede liberarse mediante una llamada a IoDeleteDevice si el controlador proporcionó almacenamiento para ese objeto en su extensión de dispositivo. Por ejemplo, si un controlador tiene una rutina CustomTimerDpc y ha proporcionado almacenamiento para los objetos DPC y temporizador necesarios en su extensión de dispositivo, la llamada a IoDeleteDevice libera estos recursos del sistema.
Del mismo modo, cualquier objeto definido por kernel para el que el controlador proporciona almacenamiento en una extensión del controlador se libera automáticamente cuando la rutina Unload llama a IoDeleteController con el objeto de controlador correspondiente.
Si la rutina DriverEntry o Reinitialize denominada IoGetConfigurationInformation para incrementar el recuento de un tipo determinado de dispositivo, la rutina Unload también debe llamar a IoGetConfigurationInformation y disminuir el recuento de sus dispositivos en la estructura de información de configuración global del administrador de E/S a medida que elimina los objetos de dispositivo correspondientes.
Antes de que devuelva el control, una rutina Unload también es responsable de liberar cualquier otro recurso asignado por el controlador que aún no hayan sido liberados por otras rutinas de controlador.