Share via


Ordenación del controlador de filtro de dispositivos

Microsoft ha desarrollado un método para agregar filtros mediante declaración mediante la expresión de la intención del filtro, en lugar de la posición de pila, conocida como ordenación del controlador de filtro de dispositivos.

La necesidad de ordenar el controlador de filtro de dispositivos

Antes de Windows 10 versión 1903, la única manera admitida de registrar un controlador de filtro de dispositivo era mediante la adición de una entrada del Registro (mediante la directiva AddReg). Sin embargo, este método de manipulación del Registro no proporciona la flexibilidad necesaria para especificar exactamente en qué posición registrar un filtro determinado.

El registro de filtros mediante la directiva AddReg simplemente anexa el filtro al final de la lista de filtros. Este enfoque usa una lista de valores en los que el orden es importante y determina dónde se carga el filtro en la pila.

El uso de una sola lista de valores ordenados es menor que lo ideal, especialmente cuando AddRegsolo anexa al final, ya que hay consecuencias negativas cuando más de un controlador agrega filtros al mismo dispositivo.

En el escenario en el que hay al menos un INF de extensión implicado, si las INF usan De forma incorrecta AddReg (es decir, no usan la marca append), podrían borrar un filtro agregado por un INF diferente.

Además, varias extensiones INF podrían agregar filtros y la ordenación relativa de esos filtros puede ser importante; sin embargo, la plataforma Plug and Play (PnP) no garantiza un orden de instalación para las extensiones. El resultado es que no se garantiza el orden de los "anexos".

Implementación del orden del controlador de filtro de dispositivos

Para proporcionar un método declarativo flexible para registrar filtros de dispositivo, Microsoft ha desarrollado un método de adición declarativa de filtros mediante la expresión de la intención del filtro, en lugar de la posición de pila. La solución proporciona a los autores de controladores de función la capacidad de expresar en su INF un conjunto ordenado de posiciones (denominados niveles) en los que un filtro se puede registrar.

Además de un nivel específico, un filtro puede registrarse mediante declaración simplemente como filtro de nivel superior o inferior .

La infraestructura se basa en un nuevo método de registro de filtros para determinar qué controladores de pedido se van a incluir en la pila de dispositivos. El nuevo método no interrumpe la compatibilidad con la forma anterior de agregar filtros. Sin embargo, permite que los nuevos filtros se muevan a un mecanismo de registro más sólido y flexible.

El método se habilita haciendo que el INF base defina una lista ordenada de uno o varios "niveles". Tanto el INF base como cualquier INF de extensión pueden registrar un filtro declarativo a través de una nueva directiva INF que especifica el nombre del servicio y el nivel al que pertenece el filtro. Cada uno de los filtros superior e inferior se representa mediante su propia lista ordenada respectiva de niveles.

Estas listas de filtros superior e inferior se crean ordenando todos los controladores de filtro por su nivel. El orden de los filtros dentro de cada nivel debe considerarse arbitrario, donde no se puede tomar ninguna dependencia en el orden de los filtros dentro de un nivel determinado. En escenarios en los que se debe garantizar el orden relativo de dos filtros, deben registrarse en distintos niveles.

Tenga en cuenta el siguiente ejemplo de controlador de dispositivo:

Instalación de controladores de dispositivos que se muestran como un orden de pila de dispositivos que combina las listas de controladores de filtro al tiempo que respeta el posicionamiento y la ordenación deseados.

El INF base del controlador de dispositivo declara dos niveles de filtro superiores, A y B (en ese orden). En la extensión INF asociada del INF base, se agregan dos filtros a cada uno de los dos niveles.

El resultado de la instalación del controlador de dispositivo es un orden de pila de dispositivos que combina las listas de controladores de filtro al tiempo que respeta el posicionamiento y la ordenación deseados. El orden de pila de dispositivos resultante garantiza que cualquier filtro colocado en el nivel "A" viene antes de cualquier filtro en el nivel "B". Sin embargo, dentro de cada nivel, el orden es arbitrario.

Como se muestra en el ejemplo, Filter3 podría venir antes de Filter5 o podría venir después de Filter5. En cualquier caso, Filter3 y Filter5 aparecerán antes de los filtros en el siguiente nivel, "B".

Al diseñar la serie de niveles en los que se pueden registrar los filtros, en lugar de crear una serie de niveles para ordenarlos, los niveles se deben asignar y ordenar de forma que se asignen a la intención del filtro. Por ejemplo, un dispositivo de E/S puede definir el nivel Cifrado, al que se debe registrar cualquier filtro de cifrado. Esto permite comprender y administrar fácilmente la intención del filtro, y hace que la pila sea más sólida frente a los cambios importantes en el controlador de función.

Nota

Incluso sin niveles definidos por el INF base, un filtro declarativo puede registrarse simplemente como superior o inferior. Cuando no se definen los niveles, esto es lógicamente equivalente a anexar el filtro al final del valor del Registro UpperFilters/LowerFilters. Cuando se definen los niveles, uno de los niveles debe marcarse como el nivel predeterminado en el controlador base y, en este caso, el filtro se registrará en ese nivel.

Escenarios

Considere un controlador de dispositivo de E/S que cifre los datos que llegan a través de la pila. Una implementación típica puede usar un controlador de filtro inferior inmediatamente debajo del controlador de función para lograrlo. Para asegurarse de que el filtro de cifrado se coloca en la posición exacta que desea el autor del controlador, puede usar filtros declarativos, como se muestra a continuación:

Diagrama que muestra que al colocar explícitamente el controlador de filtro

El INF base establece dos niveles de filtros inferiores, "Cifrado" y "Supervisión" (valor predeterminado). "Supervisión" (valor predeterminado) en este ejemplo son el resto de los filtros inferiores que podrían existir para este dispositivo en particular. Al colocar explícitamente el controlador de filtro "Encrypt" en el nivel de "Cifrado", el controlador garantiza que el orden de pila de dispositivos resultante colocará el controlador de filtro "Encrypt" antes que cualquier otro filtro inferior y inmediatamente después del controlador de función.

Veamos el ejemplo un paso más adelante. Imagine una versión más reciente del controlador y el autor ha integrado el cifrado en el controlador de función. Esto elimina la necesidad de un controlador de filtro "Encrypt" independiente. El autor simplemente necesita quitar el nivel que contenía el filtro "Cifrar" del INF base y, cuando se actualiza el controlador, la pila se vuelve a compilar dinámicamente.

Si un filtro se declara que está en un nivel explícito que no existe, el filtro no termina en la pila del dispositivo. En el ejemplo, el INF base se ha actualizado y, aunque la extensión INF sigue siendo la misma, la pila de dispositivos resultante excluye el filtro "Cifrar", ya que no se incluyó en la declaración de niveles de Base INF.

Diagrama que quita el nivel que contenía el filtro

Nivel de filtro predeterminado

Para generar la pila de filtros final, todos los orígenes de información de filtro se combinan en una sola lista. Es importante tener en cuenta que la lógica de combinación se realiza al crear la pila de dispositivos. Si se agrega un nuevo filtro instalando un controlador de extensión o base nuevo o actualizado, los dispositivos se reiniciarán durante la instalación y seleccionarán una nueva lista de filtros.

Algunos orígenes de filtros carecen de información de posición, es decir, los filtros agregados a través de los valores del Registro UpperFilters/LowerFilters heredados, o a través de la sintaxis declarativa de solo posición (que se describe a continuación).

Para admitir una combinación eficaz al carecer de información de posición, el INF base debe definir un fragmento adicional de información: un nivel de filtro predeterminado. El nivel de filtro predeterminado es una posición en la que se insertarán filtros, que carecen de información de nivel o posición.

Por ejemplo, los niveles de filtro se pueden definir en el INF base como:

Level Order: A, B, C
DefaultFilterLevel: C

Especificar el nivel predeterminado como nivel final indica que cualquier filtro que no tenga información de posición se anexará a la lista de filtros. Como alternativa, el autor del controlador puede querer que la pila termine siempre con filtros registrados explícitamente en el nivel C:

Level Order: A, B, C
DefaultFilterLevel: B

Debido a que el nivel de filtro predeterminado se establece en B, cualquier filtro adicional sin información de posición se insertará entre los filtros de A y los filtros de C.

Syntax

Registro de filtros

Consulte la sección INF DDInstall.Filters y la documentación de la directiva AddFilter para obtener más información.

[DDInstall.Filters]
AddFilter = <FilterName>, [Flags], FilterSection

FilterLevel OR FilterPosition se puede especificar de una de estas dos maneras:

Opción 1:

[FilterSection]
FilterLevel=<LevelName>

Opción 2:

[FilterSection]
FilterPosition=Upper/Lower

Esto se puede hacer tanto en base como en inf de extensión.

[DDInstall.Filters]

FilterName es el nombre del servicio en el sistema.

Las marcas no se están usando actualmente y deben dejarse vacías o establecerse en 0.

FilterSection es una sección que describe el filtro.

[Sección de filtro]

Una sección de filtro debe contener exactamente una de las dos directivas siguientes: FilterLevel o FilterPosition.

FilterLevel es un lugar específico para insertar el filtro de dispositivo en la pila, definido por el INF base.  Dentro de cada nivel, el orden de los filtros es arbitrario.

Un FilterPosition se usa en el caso de que la clase tenga un lugar específico para que se inserte filtros de terceros.

Definición de niveles 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"

Esto solo se puede hacer mediante un controlador base .

La lista declarativa completa de filtros para un dispositivo específico se puede recuperar consultando las siguientes propiedades:

DEVPKEY_Device_CompoundUpperFilters
DEVPKEY_Device_CompoundLowerFilters

Registro de filtro equivalente heredado

Vamos a examinar cómo lograr el enfoque heredado de intentar agregar un filtro superior a través de INF:

[DDInstall.HW]
AddReg = Filters

[Filters]
HKR,,"UpperFilters", 0x00010008, "MyFilter"

Esta sintaxis agregará "MyFilter" al final de la lista de filtros superiores.

Con la nueva sintaxis que se ha introducido, la sección anterior es lógicamente similar a:

[DDInstall.Filters]
AddFilter = MyFilter,,MyUpperFilterInstall

[MyUpperFilterInstall]
FilterPosition = Upper

Esto especifica que el filtro "MyFilter" se debe agregar a la lista de filtros superiores. Si el INF base tiene niveles de filtro especificados, el uso de FilterPosition registrará el filtro en el nivel predeterminado para esa posición.

Si no se especifican niveles de filtro, este filtro se registrará como filtro superior en orden arbitrario.

Consulte también

Sección INF DDInstall.Filters

Directiva AddFilter