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.
A Microsoft desenvolveu um método de adicionar filtros de forma declarativa expressando a intenção do filtro, em vez da posição na pilha, conhecido como ordenação de drivers de filtro de dispositivo.
A necessidade de ordenamento do driver de filtro de dispositivo
Antes do Windows 10 versão 1903, a única maneira com suporte de registrar um driver de filtro de dispositivo era por meio da adição de uma entrada do Registro (usando a diretiva AddReg). No entanto, esse método de manipulação do Registro não fornece a flexibilidade para especificar exatamente qual posição registrar um filtro específico.
Registro de filtro usando a diretiva AddReg simplesmente acrescenta o filtro ao final da lista de filtros. Essa abordagem usa uma lista de valores em que a ordem importa e determina onde na pilha o filtro é carregado.
Usar uma única lista de valores ordenados é menor que o ideal, especialmente quando AddRegé acrescentado apenasao final, porque há consequências negativas quando mais de um driver está adicionando filtros ao mesmo dispositivo.
No cenário em que há pelo menos um INF de extensão envolvido, se os INFs usarem o AddReg incorretamente (em outras palavras, não usam o sinalizador de acréscimo), eles poderão apagar um filtro adicionado por um INF diferente.
Além disso, vários INFs de extensão podem estar adicionando filtros, e a ordenação relativa desses filtros pode ser importante; no entanto, a plataforma PnP (Plug and Play) não garante uma ordem de instalação para as extensões. O resultado é que a ordem das "inserções" não é garantida.
Implementando a ordenação do filtro de driver de dispositivo
Para fornecer um método declarativo flexível para registrar filtros de dispositivo, a Microsoft criou uma maneira de adicionar filtros de forma declarativa, expressando a intenção do filtro em vez de especificar a posição na pilha. A solução fornece aos autores do driver de função a capacidade de expressar em seu INF um conjunto ordenado de posições (chamados níveis) em que um filtro pode se registrar.
Além de um nível específico, um filtro pode registrar declarativamente simplesmente como um filtro de nível superior ou inferior .
A infraestrutura é baseada em um novo método de registro de filtro para determinar em que ordem os drivers devem ser incluídos na pilha de dispositivos. O novo método não interrompe a compatibilidade com a maneira antiga de adicionar filtros. No entanto, ele permite que novos filtros passem para um mecanismo de registro mais robusto e flexível.
O método é habilitado fazendo com que o INF base defina uma lista ordenada de um ou mais "níveis". O INF base e os INFs de extensão podem registrar um filtro declarativo por meio de uma nova diretiva INF que especifica o nome do serviço e o nível ao qual o filtro pertence. Filtros superiores e inferiores são representados por sua própria lista ordenada de níveis.
Essas listas de filtro superior e inferior são criadas classificando todos os drivers de filtro por seu nível. A ordem dos filtros em cada nível deve ser considerada arbitrária, em que nenhuma dependência pode ser tomada na ordem dos filtros em um determinado nível. Em cenários em que a ordem relativa de dois filtros deve ser garantida, eles devem ser registrados em níveis diferentes.
Considere o seguinte exemplo de driver de dispositivo:
O INF base do driver de dispositivo declara dois níveis de filtro superiores, A e B (nessa ordem). No INF de Extensão associado ao INF base, dois filtros são adicionados em cada um dos dois níveis.
O resultado da instalação do driver do dispositivo é uma ordem de pilha de dispositivos que mescla as listas de drivers de filtro, respeitando o posicionamento e a ordenação desejados. A ordem da pilha de dispositivos resultante garante que qualquer filtro no nível "A" venha antes de qualquer filtro no nível "B". No entanto, dentro de cada nível, a ordem é arbitrária.
Conforme mostrado no exemplo, Filter3 pode vir antes de Filter5 ou pode vir após Filter5. De qualquer forma, Filter3 e Filter5 virão antes dos filtros no próximo nível, "B".
Ao projetar a série de níveis nos quais os filtros podem ser registrados, em vez de criar uma série de níveis apenas para fins de ordenação, os níveis devem ser nomeados e organizados de forma que correspondam à intenção do filtro. Por exemplo, um dispositivo de E/S pode definir o nível de criptografia, ao qual qualquer filtro de criptografia deve ser registrado. Isso permite que a intenção do filtro seja facilmente compreendida e gerenciada e tornar a pilha mais robusta contra mudanças disruptivas no driver de função.
Observação
Mesmo sem níveis definidos pelo INF base, um filtro declarativo pode ser registrado como simplesmente superior ou inferior. Quando os níveis não são definidos, isso é logicamente equivalente a acrescentar o filtro ao final do valor do registro UpperFilters/LowerFilters. Quando os níveis são definidos, um dos níveis deve ser marcado como o nível padrão no driver base e, nesse caso, o filtro será registrado nesse nível.
Cenários
Considere um driver de dispositivo de E/S que criptografa os dados que estão chegando pela pilha. Uma implementação típica pode usar um driver de filtro inferior imediatamente abaixo do driver de função para fazer isso. Para garantir que o filtro de criptografia seja colocado na posição exata desejada pelo autor do driver, eles podem usar filtros declarativos, conforme mostrado abaixo:
A INF base estabelece dois níveis inferiores de filtros: "Criptografia" e "Monitoramento" (Padrão). "Monitoramento" (padrão) neste exemplo é o restante dos demais filtros inferiores que podem existir para este dispositivo específico. Ao colocar explicitamente o driver de filtro "Encrypt" no nível de "Criptografia," o driver garante que a ordem da pilha do dispositivo resultante posicionará o driver de filtro "Encrypt" antes de quaisquer outros filtros inferiores e imediatamente após o driver funcional.
Vamos levar o exemplo um passo adiante. Imagine que uma versão mais recente do driver seja criada e o autor tenha incorporado criptografia ao driver funcional. Isso remove a necessidade de um driver de filtro "Encrypt" separado. O autor simplesmente precisa remover o nível que continha o filtro "Encrypt" do INF base e, quando o driver é atualizado, a pilha é criada dinamicamente novamente.
Se um filtro se declarar em um nível explícito que não existe, o filtro não será incluído na pilha do dispositivo. No exemplo, o INF Base foi atualizado e, embora o INF de Extensão permaneça o mesmo, a pilha de dispositivos resultante exclui o filtro "Encrypt", pois ele não foi incluído na declaração das camadas do INF Base.
Nível de filtro padrão
Para gerar a pilha de filtros final, todas as fontes de informação de filtro são mescladas em uma única lista. É importante observar que a lógica de mesclagem é executada ao criar a pilha de dispositivos. Se um novo filtro for adicionado instalando um driver de extensão ou base novo/atualizado, os dispositivos serão reiniciados durante a instalação e pegarão uma nova lista de filtros.
Algumas fontes de filtros não têm informações de posição, ou seja, filtros adicionados por meio das entradas herdadas do registro UpperFilters/LowerFilters ou por meio da sintaxe declarativa que especifica apenas a posição (discutida abaixo).
Para dar suporte a uma mesclagem efetiva quando não houver informações de posição, uma informação adicional deve ser definida pelo INF base: um nível de filtro padrão. O nível de filtro padrão é uma posição em que os filtros, sem informações de nível ou posição, serão inseridos.
Por exemplo, os níveis de filtro podem ser definidos no INF base como:
Level Order: A, B, C
DefaultFilterLevel: C
Especificar o nível padrão como o nível final indica que qualquer filtro sem informações de posição será acrescentado à lista de filtros. Como alternativa, o autor do driver pode querer que a pilha sempre termine com filtros explicitamente registrados no nível C:
Level Order: A, B, C
DefaultFilterLevel: B
Devido ao nível de filtro padrão que está sendo definido como B, qualquer filtro adicional sem informações de posição será inserido entre os filtros de A e os filtros de C.
Sintaxe
Registrando filtros
Consulte a seção INF DDInstall.Filters e a documentação da diretiva AddFilter para obter mais informações.
[DDInstall.Filters]
AddFilter = <FilterName>, [Flags], FilterSection
FilterLevel OR FilterPosition pode ser especificado de uma das duas maneiras:
Opção 1:
[FilterSection]
FilterLevel=<LevelName>
Opção 2:
[FilterSection]
FilterPosition=Upper/Lower
Isso pode ser feito tanto nas INFs base quanto nas de extensão.
[DDInstall.Filters]
FilterName é o nome do serviço no sistema.
No momento, os sinalizadores não são usados e devem ser deixados vazios ou definidos como 0.
FilterSection é uma seção que descreve o filtro.
[Seção de Filtro]
Uma seção de filtro deve conter exatamente uma das duas seguintes diretivas: FilterLevel ou FilterPosition.
Um FilterLevel é um local específico para inserir o filtro de dispositivo na stack, definido pelo INF Base. Em cada nível, a ordem dos filtros é arbitrária.
Uma FilterPosition é usada no caso em que a classe tem um lugar específico para que filtros de terceiros sejam inseridos.
Definindo níveis de filtro
[DDInstall.HW]
AddReg = FilterLevel_Definition
[FilterLevel_Definition]
HKR,,UpperFilterLevels,%REG_MULTI_SZ%,"LevelA","LevelB","LevelC"
HKR,,UpperFilterDefaultLevel,,"LevelC"
HKR,,LowerFilterLevels,%REG_MULTI_SZ%,"LevelD","LevelE","LevelF"
HKR,,LowerFilterDefaultLevel,,"LevelE"
Isso só pode ser feito por um driver base .
A lista declarativa completa de filtros para um dispositivo específico pode ser recuperada consultando as seguintes propriedades:
DEVPKEY_Device_CompoundUpperFilters
DEVPKEY_Device_CompoundLowerFilters
Registro de filtro equivalente herdado
Vamos examinar como realizar a abordagem herdada de tentar adicionar um filtro superior por meio do INF:
[DDInstall.HW]
AddReg = Filters
[Filters]
HKR,,"UpperFilters", 0x00010008, "MyFilter"
Essa sintaxe adicionará "MyFilter" ao final da lista de filtros superiores.
Com a nova sintaxe que foi introduzida, a seção acima é logicamente semelhante a:
[DDInstall.Filters]
AddFilter = MyFilter,,MyUpperFilterInstall
[MyUpperFilterInstall]
FilterPosition = Upper
Isso especifica que o filtro "MyFilter" deve ser adicionado à lista de filtros superiores. Se o INF base tiver níveis de filtro especificados, o uso de FilterPosition registrará o filtro no nível padrão para essa posição.
Se os níveis de filtro não forem especificados, esse filtro será registrado como um filtro superior em ordem arbitrária.