Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A Microsoft desenvolveu um método para 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 dispositivos.
A necessidade de pedido de driver de filtro de dispositivo
Antes do Windows 10 versão 1903, a única maneira suportada de registrar um driver de filtro de dispositivo era por adição de uma entrada de registro (usando a diretiva AddReg). No entanto, esse método de manipulação do registro não fornece a flexibilidade para especificar exatamente em qual posição registrar um determinado filtro.
O registro do filtro usando a diretiva AddReg simplesmente acrescenta o filtro ao final da lista de filtros. Essa abordagem usa uma lista de valores onde a ordem é importante e determina onde na pilha o filtro é carregado.
Usar uma única lista de valores ordenados não é o ideal, especialmente quando AddRegapenas acrescenta ao 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 usam incorretamente AddReg (em outras palavras, não usam o sinalizador de acréscimo), eles podem eliminar um filtro adicionado por um INF diferente.
Além disso, vários INF de extensão podem estar adicionando filtros, e a ordenação relativa desses filtros pode ser importante; no entanto, a plataforma Plug and Play (PnP) não garante uma ordem de instalação para as extensões. O resultado é que a ordem dos "acréscimos" não é garantida.
Implementando pedidos de driver de filtro de dispositivo
A fim de fornecer um método declarativo flexível para registrar filtros de dispositivo, a Microsoft desenvolveu um método de adicionar filtros declarativamente expressando a intenção do filtro, em vez da posição da 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 (chamadas níveis) contra as quais um filtro pode se registrar.
Além de um nível específico, um filtro pode registrar-se declarativamente simplesmente como um filtro superior ou inferior.
A infraestrutura é baseada num novo método de registo de filtros para determinar a ordem na qual os drivers devem ser incluídos na pilha de dispositivos. O novo método não quebra a compatibilidade para a antiga maneira de adicionar filtros. No entanto, permite que novos filtros passem para um mecanismo de registo 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". Tanto o INF base quanto qualquer extensão INFs 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. Os filtros superior e inferior são representados por sua própria lista ordenada de níveis.
Essas listas de filtros superior e inferior são criadas classificando todos os drivers de filtro por seu nível. A ordem dos filtros dentro de cada nível deve ser considerada arbitrária, onde nenhuma dependência pode ser tomada na ordem dos filtros dentro de 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 especifica dois níveis superiores de filtro, 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 de dispositivo é a ordenação da pilha de dispositivos que mescla as listas de drivers de filtro ao respeitar o posicionamento e a ordem desejados. A ordem de pilha de dispositivos resultante garante que qualquer filtro colocado no nível "A" venha antes de qualquer filtro no nível "B". No entanto, dentro de cada nível, a ordem é arbitrária.
Como mostrado no exemplo, Filter3 pode vir antes de Filter5 ou pode vir depois de Filter5. Em qualquer caso, Filter3 e Filter5 virão antes dos filtros no próximo nível, "B".
Ao projetar a série de níveis contra os quais os filtros podem ser registrados, em vez de criar uma série de níveis para fins de ordenação, os níveis devem ser nomeados e ordenados de forma que sejam mapeados para a intenção do filtro. Por exemplo, um dispositivo de E/S pode definir o nível de criptografia, no qual qualquer filtro de criptografia deve ser registrado. Isso permite que a intenção do filtro seja facilmente compreendida e gerida, e torna a pilha mais robusta contra alterações que possam causar quebras no driver de função.
Observação
Mesmo sem níveis definidos pela base INF, um filtro declarativo pode se registrar como simplesmente superior ou inferior. Quando os níveis não são definidos, isso é logicamente equivalente a anexar 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, neste caso, o filtro será registrado nesse nível.
Cenários
Considere um driver de dispositivo de E/S que encripta os dados que estão a passar pela stack. Uma implementação típica pode usar um driver de filtro inferior imediatamente abaixo do driver de função para realizar 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:
O INF Base estabelece dois níveis de filtros inferiores, "Criptografia" e "Monitoramento" (Padrão). "Monitorização" (padrão) neste exemplo são os restantes dos filtros inferiores que podem existir para este dispositivo específico. Ao colocar explicitamente o driver de filtro "Encrypt" no nível "Encryption", o driver garante que a ordem resultante da pilha de dispositivos posicione o driver de filtro "Encrypt" antes de quaisquer outros filtros inferiores e imediatamente após o driver de função.
Vamos levar o exemplo um passo adiante. Imagine que uma versão mais recente do driver é lançada e o autor incorporou criptografia no driver de função. Isso elimina 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 é novamente construída dinamicamente.
Se um filtro se declarar em um nível explícito que não existe, o filtro não terminará na pilha de dispositivos. 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 "Criptografar", pois não foi incluído na declaração de níveis do INF de Base.
Nível de filtro padrão
Para gerar a pilha de filtros final, todas as fontes de informações 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 através da instalação de um driver de base ou extensão 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, nomeadamente os filtros adicionados através dos valores de registo legados UpperFilters/LowerFilters, ou através de uma sintaxe declarativa apenas de posição (discutida abaixo).
Para dar suporte a uma mesclagem eficaz quando faltam informações de posição, uma informação adicional deve ser definida pelo INF de base: um nível de filtro padrão. O nível de filtro padrão é uma posição onde 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 que não tenha informações de posição será anexado à lista de filtros. Como alternativa, o autor do driver pode desejar 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 ser definido como B, qualquer filtro adicional sem informações de posição será inserido entre os filtros de A e C.
Sintaxe
Registar 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 OU FilterPosition pode ser especificado de duas maneiras:
Opção 1:
[FilterSection]
FilterLevel=<LevelName>
Opção 2:
[FilterSection]
FilterPosition=Upper/Lower
Isso pode ser feito tanto em INFs de Base quanto de Extensão.
[DDInstall.Filtros]
FilterName é o nome do serviço no sistema.
Os sinalizadores não são usados no momento e devem ser deixados vazios ou definidos como 0.
FilterSection é uma seção que descreve o filtro.
[Seção Filtro]
Uma seção de filtro deve conter exatamente uma das duas diretivas a seguir: FilterLevel ou FilterPosition.
Um FilterLevel é um local específico para inserir o filtro de dispositivos na pilha, conforme definido pelo INF Base. Dentro de cada nível, a ordem dos filtros é arbitrária.
Um FilterPosition é usado no caso em que a classe tem um local específico para filtros de terceiros a serem 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
Registo de filtro legado-equivalente
Vamos examinar como realizar a abordagem herdada de tentar adicionar um filtro superior via INF:
[DDInstall.HW]
AddReg = Filters
[Filters]
HKR,,"UpperFilters", 0x00010008, "MyFilter"
Esta 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 especificado níveis de filtro, 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.