Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 |