Compartir a través de


Liberar recursos de Driver-Allocated

Los detalles de cómo un controlador usa el Registro, configura los objetos del sistema y los recursos en sus extensiones de dispositivo, extensión de controlador o grupo no paginado asignado por controladores varía de controlador a controlador. Sin embargo, cualquier rutina de descarga debe liberar los recursos que usa un controlador en fases.

Cualquier rutina de descarga del controlador debe asegurarse de que ninguna otra rutina de controlador esté usando actualmente o que en breve esté usando un recurso determinado antes de liberar ese recurso.

En general, una rutina Unload libera todos los recursos asignados por el controlador en las siguientes fases:

  1. Si el controlador aún no lo ha hecho, deshabilite las interrupciones en cualquier dispositivo físico, si es posible, y, a continuación, llame a IoDisconnectInterrupt tan pronto como se deshabiliten las interrupciones.

  2. Asegúrese de que ninguna otra rutina de controlador pueda hacer referencia a los recursos que la rutina Unload pretende liberar.

    Por ejemplo, una rutina Unload debe llamar a IoStopTimer si la rutina IoTimer del controlador está habilitada actualmente para un objeto de dispositivo determinado. Debe asegurarse de que ningún subproceso esté esperando ninguno de los objetos de distribuidor del controlador y de que sus objetos de temporizador no estén en cola para las llamadas a sus rutinas CustomTimerDpc antes de liberar el almacenamiento para sus objetos de distribuidor. Debe llamar a KeRemoveQueueDpc si tiene una rutina CustomDpc que el ISR podría haber puesto en cola, etc.

    Si el controlador llamado IoQueueWorkItem, debe asegurarse de que el elemento de trabajo se ha completado. IoQueueWorkItem toma una referencia en el objeto de dispositivo asociado; El controlador no se puede descargar si permanece alguna de estas referencias.

    Si el controlador llamado PsCreateSystemThread, la rutina Unload también debe hacer que el subproceso creado por el controlador se ejecute para que el propio subproceso pueda llamar a PsTerminateSystemThread antes de descargar el controlador. Un controlador no puede liberar un subproceso del sistema creado por el controlador llamando a ZwClose con threadHandle devuelto por PsCreateSystemThread.

  3. Libere los recursos específicos del dispositivo asignados por el controlador. Si lo hace, podría implicar llamar a las siguientes rutinas de soporte técnico del sistema:

  4. Libera los objetos del sistema y los recursos que la rutina DriverEntry o Reiniciatialize configuran en la extensión del dispositivo de los objetos de dispositivo o en la extensión del controlador del objeto de controlador (si se creó una). En concreto, el controlador debe hacer lo siguiente antes de intentar eliminar el objeto de dispositivo (IoDeleteDevice) o el objeto de controlador (IoDeleteController):

  5. Libere los recursos de hardware que la rutina DriverEntry o Reiniciatialize reclama para los dispositivos físicos del controlador, si los hay, en el registro en el árbol \Registry\Machine\Hardware\ResourceMap .

  6. Quite los nombres de sus dispositivos que la rutina DriverEntry o Reinitialize almacenada en el Registro en \Registry.. \Árbol DeviceMap , así.

Una vez que el controlador ha liberado los recursos de dispositivo, sistema y hardware, puede eliminar sus objetos de dispositivo y controlador, como se describe en Liberar objetos de dispositivo y controlador.