Compartilhar via


Carregar e descarregar um minifiltro

Este artigo explica como os drivers de minifiltro do sistema de arquivos (minifiltros) podem ser carregados e descarregados dinamicamente em um ambiente Windows. Ele aborda o processo de inicialização e registro, o gerenciamento de instâncias e os procedimentos de desmontagem para garantir a limpeza adequada e o gerenciamento de recursos durante as operações de descarregamento do driver.

Carregando

Um minifiltro será carregado de acordo com as definições de grupo de ordem de carregamento existentes se o arquivo INF do minifiltro especificar um tipo de inicialização de driver de SERVICE_BOOT_START, SERVICE_SYSTEM_START ou SERVICE_AUTO_START. Essa ordem de carregamento dá suporte à interoperabilidade com drivers de filtro herdados. Eles podem ser carregados a qualquer momento enquanto o sistema estiver em execução.

Um minifiltro pode ser carregado das seguintes maneiras enquanto o sistema está em execução:

  • Por meio de uma solicitação de inicialização de serviço (sc start, net start ou as APIs de serviço).

  • Por meio de uma solicitação de carregamento explícita (fltmc load, FltLoadFilter ou FilterLoad).

O Gerenciador de Filtros (FltMgr) chama a rotina DriverEntry do minifiltro depois que o driver é carregado. Neste momento, o minifiltro pode executar a inicialização que se aplicará a todas as instâncias do minifiltro. Dentro de sua rotina DriverEntry, o minifiltro chama FltRegisterFilter para registrar rotinas de retorno de chamada com FltMgr e FltStartFiltering para notificar FltMgr de que o minifiltro está pronto para começar a anexar a volumes e filtrar solicitações de E/S.

As instâncias do driver de minifiltro são definidas no arquivo INF usado para instalar o minifiltro. O arquivo INF de um minifiltro deve definir uma instância padrão e pode definir instâncias adicionais. Essas definições se aplicam a todos os volumes. Cada definição de instância inclui o nome da instância, sua altitude e sinalizadores que indicam se a instância pode ser anexada automaticamente, manualmente ou ambos. A instância padrão é usada para ordenar minifiltros para que FltMgr chame as rotinas de retorno de chamada de configuração de montagem e instância do minifiltro na ordem correta. A instância padrão também é usada com solicitações de anexo explícitas quando o chamador não especifica um nome de instância.

O FltMgr notifica automaticamente um minifiltro sobre um volume disponível chamando sua rotina InstanceSetupCallback na primeira operação de criação depois que o volume é montado. Essa chamada pode ocorrer:

  • Antes de FltStartFiltering retornar, quando FltMgr enumera volumes existentes na inicialização do sistema.

  • Durante o runtime, quando um volume é montado ou como resultado de uma solicitação de anexo explícita (fltmc attach, FltAttachVolume ou FilterAttach).

Descarregamento

Uma instância de minifiltro é interrompida quando:

  • O minifiltro é descarregado.

  • O volume ao qual a instância do minifiltro está anexada está sendo desmontado.

  • Uma solicitação de desanexação explícita é feita (fltmc detach, FltDetachVolume ou FilterDetach). Se o minifiltro registrar uma rotina InstanceQueryTeardownCallback, ele poderá falhar em uma solicitação de desanexação explícita chamando FilterDetach ou FltDetachVolume.

A desmontagem prossegue da seguinte forma:

  • Se o minifiltro registrou uma rotina de retorno de chamada InstanceTeardownStartCallback, o FltMgr a chamará no início do processo de desmontagem. Nessa rotina, o minifiltro deve:

    • Concluir todas as operações pendentes.
    • Cancelar ou concluir outro trabalho, como solicitações de E/S geradas pelo minifiltro.
    • Parar de enfileirar novos itens de trabalho.
  • Durante a desmontagem da instância:

    • Todas as rotinas de retorno de chamada de pré-operação ou pós-operação em execução no momento continuam o processamento normal.
    • Qualquer solicitação de E/S que esteja aguardando um retorno de chamada pós-operação pode ser "drenada" ou cancelada.
    • Todas as solicitações de E/S geradas pelo minifiltro continuam o processamento normal até que sejam concluídas.
  • Se o minifiltro registrou uma rotina InstanceTeardownCompleteCallback, o FltMgr chamará essa rotina depois que todas as operações de E/S pendentes forem concluídas. Nessa rotina, o minifiltro fecha todos os arquivos que ainda estão abertos.

  • Depois que todas as referências pendentes à instância são liberadas, o FltMgr exclui os contextos restantes e a instância é completamente desativada.

Um minifiltro pode ser descarregado das seguintes maneiras enquanto o sistema está em execução:

  • Por meio de uma solicitação de parada de serviço (sc stop, net stop ou APIs de serviço).

  • Por meio de uma solicitação de descarregamento explícita (fltmc unload, FltUnloadFilter ou FilterUnload). O minifiltro será descarregado independentemente de quaisquer dependências registradas no gerenciador de controle de serviço (SCM).

A rotina FilterUnloadCallback de um minifiltro é chamada quando o minifiltro é descarregado. Essa rotina fecha todas as portas abertas do servidor de comunicação, chama FltUnregisterFilter e executa qualquer limpeza necessária. O registro dessa rotina é opcional. No entanto, se o minifiltro não registrar uma rotina FilterUnloadCallback, o minifiltro não poderá ser descarregado. Para obter mais informações sobre essa rotina, consulte Escrever uma rotina FilterUnloadCallback.

Rotinas do Gerenciador de Filtros para Carregar e Descarregar Minifiltros

O FltMgr fornece as seguintes rotinas de suporte para solicitações explícitas de carregamento e descarregamento, que podem ser emitidas no modo de usuário ou no modo kernel:

As seguintes rotinas são usadas para registrar e cancelar o registro de rotinas de retorno de chamada para configuração e desmontagem de instância:

Rotinas de Retorno de Chamada do Driver de Minifiltro para Configuração, Desmontagem e Descarregamento de Instâncias

As seguintes rotinas de retorno de chamada do driver de minifiltro são armazenadas como membros da estrutura FLT_REGISTRATION que é passada como um parâmetro para FltRegisterFilter:

Nome do Membro da Rotina de Retorno de Chamada Tipo da rotina de retorno de chamada
InstanceSetupCallback PFLT_INSTANCE_SETUP_CALLBACK
InstanceQueryTeardownCallback PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK
InstanceTeardownStartCallback PFLT_INSTANCE_TEARDOWN_CALLBACK
InstanceTeardownCompleteCallback PFLT_INSTANCE_TEARDOWN_CALLBACK
FilterUnloadCallback PFLT_FILTER_UNLOAD_CALLBACK