Compartilhar via


Liberando recursos de Driver-Allocated

As especificidades de como um driver usa o registro, configura objetos e recursos do sistema em suas extensões de dispositivo, extensão do controlador ou pool nãopagado alocado por driver variam de driver para driver. No entanto, qualquer rotina unload deve liberar os recursos que um driver está usando em estágios.

A rotina Unload de qualquer driver deve garantir que nenhuma outra rotina de driver esteja usando ou em breve esteja usando um recurso específico antes de liberar esse recurso.

Em geral, uma rotina Unload libera todos os recursos alocados pelo driver nos seguintes estágios:

  1. Se o driver ainda não tiver feito isso, desabilite as interrupções em qualquer dispositivo físico, se possível, e chame IoDisconnectInterrupt assim que as interrupções forem desabilitadas.

  2. Verifique se nenhuma outra rotina de driver pode referenciar os recursos que a rotina Unload pretende liberar.

    Por exemplo, uma rotina Unload deve chamar IoStopTimer se a rotina IoTimer do driver estiver habilitada atualmente para um objeto de dispositivo específico. Ele deve garantir que nenhum thread esteja aguardando nenhum dos objetos dispatcher do driver e que seus objetos de temporizador não estejam na fila para chamadas para suas rotinas CustomTimerDpc antes de liberar o armazenamento para seus objetos dispatcher. Ele deverá chamar KeRemoveQueueDpc se ele tiver uma rotina CustomDpc que o ISR possa ter enfileirado e assim por diante.

    Se o driver chamado IoQueueWorkItem, ele deverá garantir que o item de trabalho tenha sido concluído. IoQueueWorkItem faz uma referência no objeto de dispositivo associado; o driver não poderá ser descarregado se essas referências permanecerem.

    Se o driver chamado PsCreateSystemThread, a rotina Unload também deverá fazer com que o thread criado pelo driver seja executado para que o thread em si possa chamar PsTerminateSystemThread antes que o driver seja descarregado. Um driver não pode liberar um thread de sistema criado pelo driver chamando ZwClose com o ThreadHandle retornado por PsCreateSystemThread.

  3. Libere todos os recursos específicos do dispositivo que o driver alocou. Isso pode envolver chamar as seguintes rotinas de suporte do sistema:

  4. Libere objetos e recursos do sistema que a rotina DriverEntry ou Reinitialize configurou na extensão do dispositivo dos objetos do dispositivo ou na extensão do controlador do objeto do controlador (se ele criou um). Em particular, o driver deve fazer o seguinte antes de tentar excluir o objeto do dispositivo (IoDeleteDevice) ou o objeto de controlador (IoDeleteController):

  5. Libere os recursos de hardware que a rotina DriverEntry ou Reinitialize reivindicou para os dispositivos físicos do driver, se houver, no Registro na árvore \Registry\Machine\Hardware\ResourceMap .

  6. Remova todos os nomes de seus dispositivos que a rotina DriverEntry ou Reinitialize armazenou no registro em \Registry.. \DeviceMap tree também.

Depois que o driver tiver liberado recursos de dispositivo, sistema e hardware, ele poderá excluir seus objetos de dispositivo e controlador, conforme descrito em Liberando objetos de dispositivo e controlador.