Partilhar via


Liberando objetos de dispositivo e controlador

Antes que um driver exclua um objeto de dispositivo ou controlador, ele deve liberar suas referências a recursos externos, como ponteiros para objetos de outros drivers ou para interromper objetos, que ele armazenou na extensão de dispositivo ou controlador correspondente. Em seguida, ele pode chamar IoDeleteDevice para cada objeto de dispositivo que o driver criou. Um driver não WDM que anteriormente chamado IoCreateController também deve chamar IoDeleteController.

Qualquer objeto definido pelo Kernel para o qual o driver fornece armazenamento em uma extensão de dispositivo é liberado automaticamente quando a rotina Unload chama IoDeleteDevice com o objeto de dispositivo correspondente. Em geral, qualquer objeto que a rotina DriverEntry ou Reinitialize configurou chamando KeInitializeXxx pode ser liberado por uma chamada para IoDeleteDevice se o driver forneceu armazenamento para esse objeto em sua extensão de dispositivo. Por exemplo, se um driver tiver uma rotina CustomTimerDpc e tiver fornecido armazenamento para os objetos DPC e timer necessários em sua extensão de dispositivo, a chamada para IoDeleteDevice liberará esses recursos do sistema.

Da mesma forma, qualquer objeto definido pelo Kernel para o qual o driver fornece armazenamento em uma extensão de controlador é liberado automaticamente quando a rotina Unload chama IoDeleteController com o objeto controlador correspondente.

Se a rotina DriverEntry ou Reinitialize chamada IoGetConfigurationInformation incrementar a contagem de um determinado tipo de dispositivo, a rotina Unload também deverá chamar IoGetConfigurationInformation e diminuir a contagem de seus dispositivos na estrutura de informações de configuração global do gerente de E/S, pois exclui os objetos de dispositivo correspondentes.

Antes de retornar o controle, uma rotina Descarregue também é responsável por liberar outros recursos alocados pelo driver que ainda não foram liberados por outras rotinas de driver.