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:
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.
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.
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:
IoDeleteSymbolicLink si la rutina DriverEntry o Reinitialize se denomina IoCreateSymbolicLink o IoCreateUnprotectedSymbolicLink y IoDeassignArcName si el controlador llamó a IoAssignArcName.
ExFreePool si DriverEntry o cualquier otra rutina de controlador denominada ExAllocatePoolWithTag y el controlador aún no ha liberado la memoria asignada.
MmUnmapIoSpace si la rutina DriverEntry o Reinitialize se denomina MmMapIoSpace.
MmFreeNonCachedMemory si la rutina DriverEntry o Reinitialize se denomina MmAllocateNonCachedMemory.
MmFreeContiguousMemory si la rutina DriverEntry o Reinitialize se denomina MmAllocateContiguousMemory.
FreeCommonBuffer si la rutina DriverEntry o Reinitialize se denomina AllocateCommonBuffer.
IoAssignResources o IoReportResourceUsage si la rutina DriverEntry o Reinitialize llamó a una de estas rutinas de soporte técnico o HalAssignSlotResources para reclamar recursos de hardware en el registro de configuración para sí mismo o para sus dispositivos físicos individualmente.
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):
- Llame a IoDisconnectInterrupt para liberar el puntero del objeto de interrupción almacenado en la extensión del dispositivo o controlador correspondiente.
- Llame a ObDereferenceObject con el puntero al objeto de archivo del controlador siguiente inferior si llamó a IoGetDeviceObjectPointer y almacenó este puntero en una extensión de dispositivo o controlador.
- Llame a IoDetachDevice con el puntero al objeto de dispositivo del controlador inferior si llamó a IoAttachDevice o IoAttachDeviceToDeviceStack y almacenó este puntero en una extensión de dispositivo o controlador.
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 .
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.