Compartir a través de


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 la pila, conocida como orden de controladores de filtro de dispositivos.

La necesidad de ordenar el controlador de filtro de dispositivos

Antes de La versión 1903 de Windows 10, 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 flexibilidad para especificar exactamente en qué posición registrar un filtro determinado.

Filtrar el registro 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 AddReg solo anexa al final, porque hay consecuencias negativas cuando más de un controlador está agregando filtros al mismo dispositivo.

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

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 pedido de instalación para las extensiones. El resultado es que no se garantiza el orden de los "anexados".

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 expresando la intención del filtro, en lugar de la posición de la pila. La solución proporciona a los autores de controladores de funciones 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 orden se van a incluir en la pila de dispositivos. El nuevo método no interrumpe la compatibilidad con la antigua forma 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 está habilitado al hacer 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 especifique 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.

Considere 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 de BASE INF, 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 vendrán antes de los filtros en el siguiente nivel, "B".

Al diseñar la serie de niveles en los que se pueden registrar filtros, en lugar de crear una serie de niveles para ordenar, los niveles deben asignarse y ordenarse de modo 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 cambios importantes en el controlador de función.

Nota:

Incluso sin niveles definidos por el INF base, un filtro declarativo puede registrarse como simplemente 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 de cualquier otro filtro inferior y inmediatamente después del controlador de función.

Vamos a seguir el ejemplo un paso más. Imagine una versión más reciente del controlador y el autor ha integrado el cifrado en el controlador de funciones. Esto elimina la necesidad de un controlador de filtro "Encrypt" independiente. El autor simplemente necesita quitar el nivel que contenía el filtro "Encrypt" de Base INF y cuando el controlador se actualiza, 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 de dispositivos. En el ejemplo, se ha actualizado el INF base y, aunque la extensión INF sigue siendo la misma, la pila de dispositivos resultante excluye el filtro "Encrypt" porque 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 base o de extensión nuevo o actualizado, los dispositivos se reiniciarán durante la instalación y recogerá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 una información adicional: un nivel de filtro predeterminado. El nivel de filtro predeterminado es una posición en la que se insertarán filtros, sin 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, es posible que el autor del controlador quiera 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.

Sintaxis

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 la extensión INF.

[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 filter]

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 un filtro 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"

Solo puede hacerlo 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 filtros equivalentes heredados

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" debe agregarse 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