Uso de un archivo INF de extensión

Antes de Windows 10, Windows seleccionó un único paquete de controladores para instalar para un dispositivo determinado. Esto dio lugar a paquetes de controladores grandes y complejos que incluían código para todos los escenarios y configuraciones, y cada actualización secundaria requería una actualización para todo el paquete de controladores. A partir de Windows 10, puede dividir la funcionalidad INF en varios componentes, cada uno de los cuales se puede atender de forma independiente. El paquete de controladores principales instalado en un dispositivo ahora se denomina paquete de controladores base y el sistema controla de la misma manera que los paquetes de controladores se han controlado antes de Windows 10. Para ampliar la funcionalidad de un paquete de controladores base, proporcione una extensión INF en un paquete de controladores independiente. Una extensión INF:

  • Puede ser proporcionado por una empresa diferente y actualizado independientemente del INF base.

  • Usa la misma sintaxis INF que un INF base, pero puede ampliar el INF base para la personalización o especialización.

  • Mejora el valor del dispositivo, pero no es necesario para que el paquete de controladores base funcione. En ausencia de la extensión INF, el sistema debe poder arrancar y conectarse a la red con solo el paquete de controladores base. Los dispositivos de entrada integrados en el sistema, como un teclado, deben ser capaces de funcionar con al menos la funcionalidad básica sin las INFs de extensión.

  • Debe ser un archivo INF universal.

Cada dispositivo debe tener un paquete de controladores base instalado en él y, opcionalmente, puede tener uno o varios INF de extensión asociados. Una extensión INF no podrá instalarse en un dispositivo si no hay ningún paquete de controladores base presente para instalarlo también en el dispositivo.

Entre los escenarios típicos en los que podría usar una extensión INF se incluyen:

  • Modificar la configuración proporcionada en un paquete de controladores base, como personalizar el nombre descriptivo del dispositivo o modificar una configuración de hardware.

  • Crear uno o varios componentes de software especificando la directiva ADDComponent inf y proporcionando un archivo INF de componentes.

  • Proporcionar la configuración específica del modelo o factor de forma del sistema que mejora la experiencia o la funcionalidad del dispositivo, como los datos de calibración de hardware.

  • Agregar un controlador de filtro a la pila de dispositivos.

Puede encontrar código de ejemplo para algunos de estos escenarios en los ejemplos siguientes. Vea también ejemplo de paquete de controladores compatibles con DCH, que describe cómo el ejemplo de controlador universal DCHU usa infs de extensión.

Cómo funcionan conjuntamente el paquete de controladores base y INF de extensión

Durante la instalación de un dispositivo, la configuración de una extensión INF se aplica después de la configuración en un paquete de controladores base. Como resultado, si una extensión INF y un paquete de controladores base especifican la misma configuración, se aplica la versión de la extensión INF. Del mismo modo, si cambia el paquete del controlador base, la extensión INF permanece y se aplica sobre el nuevo paquete de controladores base. Si hay varias INF de extensión instaladas en el mismo dispositivo, no hay ningún orden predeterminado en el que se aplicarán las INFs de extensión, por lo que una extensión INF no puede invalidar de forma determinista los valores proporcionados por una extensión INF diferente. Las INF de extensión distintas destinadas a los mismos dispositivos no deben intentar modificar la misma configuración.

Resulta útil incluir comentarios en el paquete del controlador base que describe qué entradas se pueden invalidar mediante una extensión INF, así como intervalos de valores de parámetro y restricciones aplicables.

Especificación de ExtensionId

Al escribir una extensión INF, se genera un GUID especial denominado ExtensionId, que es una entrada en la sección [Versión] de INF.

El sistema identifica posibles INF de extensión para un dispositivo específico mediante la coincidencia del identificador de hardware y los identificadores compatibles del dispositivo con los especificados en una extensión INF en una sección Modelos que se aplica a ese sistema.

Entre todas las INF de extensión posibles que especifican el mismo valor extensionId , el sistema selecciona solo uno para instalar y aplica su configuración sobre los del paquete de controladores base. La fecha del controlador y la versión del controlador especificadas en INF se usan, en ese orden, para elegir el único INF entre varias INF de extensión con el mismo ExtensionId.

Para ilustrarlo, considere el siguiente escenario que incluye un dispositivo hipotético para el que hay tres INFs de extensión:

Diagrama en el que se muestra cómo se seleccionan infs base INF y extensión.

Los valores {A} ExtensionId y {B} se muestran entre corchetes, y la clasificación de cada paquete de controlador base se muestra en las cintas de banner.

En primer lugar, el sistema selecciona el paquete de controladores base con la mejor clasificación y la versión más alta.

A continuación, el sistema procesa las INF de extensión disponibles. Dos tienen el valor {B}ExtensionId y uno tiene el valor {A}ExtensionId . En los dos primeros, supongamos que la fecha del controlador es la misma. El siguiente desempate es la versión del controlador, por lo que el sistema selecciona la extensión INF con v2.0.

También se selecciona la extensión INF con el valor extensionId único. El sistema aplica el paquete de controladores base para el dispositivo y, a continuación, aplica las dos INFs de extensión para ese dispositivo.

Los archivos INF de extensión siempre se aplican después del paquete del controlador base, pero no hay ningún orden determinado en el que se aplican las INF de extensión.

Creación de una extensión INF

Estas son las entradas que debe definir un INF como una extensión INF.

  1. Especifique estos valores para Class y ClassGuid en la sección Versión. Para obtener más información sobre las clases de instalación, consulta Clases de configuración de dispositivos definidas por el sistema disponibles para proveedores.

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. Proporcione una entrada ExtensionId en la sección [Versión]. Genere un nuevo GUID para la versión inicial de una extensión INF o reutilice el último GUID para las actualizaciones posteriores de la extensión inicial INF.

    ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
    

Una organización solo puede usar un Identificador de extensión que posee. Para obtener información sobre cómo registrar un identificador de extensión, consulte Administración de envíos de hardware en el Panel del Centro de desarrollo para hardware de Windows.

  1. Si va a actualizar una extensión INF, mantenga extensionId igual e incremente la versión y la fecha especificadas por la directiva DriverVer. Para un valor extensionId determinado, PnP selecciona el INF con el driverVer más alto.

    Nota:

    Si la extensión INF tiene como destino Windows 10 S, consulta Windows 10 in S mode Driver Requirements (Requisitos del controlador en modo S) para obtener información sobre la instalación de controladores en esa versión de Windows.

  2. En la sección Modelos INF, especifique uno o varios identificadores de hardware y compatibles que coincidan con los del dispositivo de destino. Estos identificadores compatibles y hardware no necesitan coincidir con los del paquete de controladores base. Normalmente, una extensión INF muestra un identificador de hardware más específico que el paquete de controladores base, con el objetivo de especializar aún más una configuración de controlador específica. Por ejemplo, el paquete de controladores base podría usar un identificador de hardware PCI de dos partes, mientras que la extensión INF especifica un identificador de hardware PCI de cuatro partes, como el siguiente:

    [DeviceExtensions.NTamd64]
    %Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX
    

    Como alternativa, la extensión INF podría enumerar el mismo identificador de hardware que el paquete de controladores base, por ejemplo, si el dispositivo ya está dirigido estrechamente o si el paquete de controladores base ya muestra el identificador de hardware más específico.

    En algunos casos, la extensión INF puede proporcionar un identificador de dispositivo menos específico, como un identificador compatible, para personalizar una configuración en un conjunto más amplio de dispositivos.

    El destino de CHID se puede usar si no es posible un identificador de hardware de cuatro partes o no es lo suficientemente restrictivo.

  3. No defina un servicio con SPSVCINST_ASSOCSERVICE. Una extensión INF no puede proporcionar un controlador de función para un dispositivo. Sin embargo, una extensión INF puede definir otros servicios, como un controlador de filtro para el dispositivo. Para obtener más información sobre cómo especificar servicios, vea INF AddService Directive.

En la mayoría de los casos, enviará un paquete de controladores INF de extensión al Centro de desarrollo de hardware por separado del paquete de controladores base. Para obtener ejemplos sobre cómo empaquetar infs de extensión y vínculos al código de ejemplo, vea Ejemplo de paquete de controladores compatibles con DCH.

El proceso de validación y envío de controladores es el mismo para las INF de extensión que para los paquetes de controladores base. Para obtener más información, consulta Introducción a Windows HLK.

Desinstalación de un controlador de extensión

Para quitar un paquete de controladores de extensión del sistema y desinstalarlo de cualquier dispositivo que lo use, use el comando de delete-driver PnPUtil con la uninstall marca . Esto permite desinstalar el paquete de controladores de extensión de los dispositivos sin quitar el paquete de controladores base.

Busque el nombre oem<#>.inf del paquete de controladores para desinstalar y usar pnputil /delete-driver oem<#>.inf /uninstall.

pnputil /enum-drivers se puede usar para ayudar a identificar el nombre de oem<#>.inf adecuado.

Ejemplo 1: Usar una extensión INF para establecer el nombre descriptivo del dispositivo

En un escenario común, un fabricante de dispositivos (IHV) proporciona un paquete de controladores base y, a continuación, un generador de sistemas (OEM) proporciona una extensión INF que complementa y, en algunos casos, invalida la configuración y la configuración del paquete de controladores base. El fragmento de código siguiente es una extensión COMPLETA INF que muestra cómo establecer el nombre descriptivo del dispositivo.

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = %CONTOSO%
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
DriverVer   = 05/28/2013,1.0.0.0
CatalogFile = delta.cat
PnpLockdown = 1

[Manufacturer]
%CONTOSO% = DeviceExtensions,NTamd64

[DeviceExtensions.NTamd64]
%Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX

[DeviceExtension_Install]
; No changes

[DeviceExtension_Install.HW]
AddReg = FriendlyName_AddReg

[FriendlyName_AddReg]
HKR,,FriendlyName,, "New Device Friendly Name"

[Strings]
CONTOSO              = "Contoso"
Device.ExtensionDesc = "Sample Device Extension"

Ejemplo 2: Uso de una extensión INF para instalar software adicional

El fragmento de código siguiente es un INF de extensión completo que se incluye en el kit de herramientas de instalación de paquetes de controladores para controladores universales. En este ejemplo se usa la directiva ADDComponent inf para crear componentes que instalan un servicio y un archivo ejecutable. Para obtener más información sobre lo que puede hacer en un INF de componentes, consulte Uso de un archivo INF de componentes.

Para acceder a este archivo en línea, consulte osrfx2_DCHU_extension.inx.

;/*++
;
;Copyright (c) Microsoft Corporation.  All rights reserved.
;
;   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
;   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
;   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
;   PURPOSE.
;
;Module Name:
;
;    osrfx2_DCHU_extension.INF
;
;Abstract:
;
;    Extension inf for the OSR FX2 Learning Kit
;
;--*/

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = %ManufacturerName%
ExtensionId = {3846ad8c-dd27-433d-ab89-453654cd542a}
CatalogFile = osrfx2_DCHU_extension.cat
DriverVer   = 05/16/2017,15.14.36.721
PnpLockdown = 1

[Manufacturer]
%ManufacturerName% = OsrFx2Extension, NT$ARCH$

[OsrFx2Extension.NT$ARCH$]
%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_045e&Pid_94aa&mi_00
%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_0547&PID_1002

[OsrFx2Extension_Install.NT]
CopyInf=osrfx2_DCHU_usersvc.inf

[OsrFx2Extension_Install.NT.HW]
AddReg = OsrFx2Extension_AddReg
AddReg = OsrFx2Extension_COMAddReg

[OsrFx2Extension_AddReg]
HKR, OSR, "OperatingParams",, "-Extended"
HKR, OSR, "OperatingExceptions",, "x86"

; Add all registry keys to successfully register the
; In-Process ATL COM Server MSFT Sample.
[OsrFx2Extension_COMAddReg]
HKCR,AppID\ATLDllCOMServer.DLL,AppID,,"{9DD18FED-55F6-4741-AF25-798B90C4AED5}"
HKCR,AppID\{9DD18FED-55F6-4741-AF25-798B90C4AED5},,,"ATLDllCOMServer"
HKCR,ATLDllCOMServer.SimpleObject,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,ATLDllCOMServer.SimpleObject\CurVer,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,ATLDllCOMServer.SimpleObject.1,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject.1\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084},,,"SimpleObject Class"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,,%REG_EXPAND_SZ%,"%%SystemRoot%%\System32\ATLDllCOMServer.dll"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,ThreadingModel,,"Apartment"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\ProgID,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\Programmable,,%FLG_ADDREG_KEYONLY%
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\TypeLib,,,"{9B23EFED-A0C1-46B6-A903-218206447F3E}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\VersionIndependentProgID,,,"ATLDllCOMServer.SimpleObject"

[OsrFx2Extension_Install.NT.Components]
AddComponent = osrfx2_DCHU_component,,OsrFx2Extension_ComponentInstall
AddComponent = osrfx2_DCHU_usersvc,,OsrFx2Extension_ComponentInstall_UserSvc

[OsrFx2Extension_ComponentInstall]
ComponentIds=VID_045e&PID_94ab

[OsrFx2Extension_ComponentInstall_UserSvc]
ComponentIds=VID_045e&PID_94ac

[Strings]
ManufacturerName = "Contoso"
OsrFx2.ExtensionDesc = "OsrFx2 DCHU Device Extension"
REG_EXPAND_SZ = 0x00020000
FLG_ADDREG_KEYONLY = 0x00000010

Para obtener información sobre cómo usar una extensión INF para instalar un controlador de filtro, consulta Orden del controlador de filtro de dispositivos.

Para mejorar la extensibilidad, se recomienda que un IHV coloque la funcionalidad opcional en una plantilla inf de extensión.

Compatibilidad con versiones anteriores

Cualquier cambio en el paquete del controlador base debe probarse exhaustivamente para asegurarse de que no interrumpa la compatibilidad con versiones anteriores para las INFs de extensión existentes.

Al administrar un paquete de controladores base, siga estos procedimientos recomendados:

  • Intervalos y restricciones de valores de parámetro de documento tanto en comentarios de código como en un documento de diseño. Los cambios futuros deben ajustarse a los intervalos especificados.
  • Para admitir nuevos intervalos, agregue un parámetro opcional (sin valor predeterminado).

Envío de una extensión INF para la certificación

Para obtener información detallada sobre cómo trabajar con infs de extensión en la Centro de desarrollo de hardware, vea Trabajar con infs de extensión en el panel de Windows Centro de desarrollo de hardware.

Trabajar con infs de extensión en el Centro de partners

Ejemplo de paquete de controlador compatible con DCH

Using a Universal INF File (Uso de un archivo INF universal)

Introducción a los controladores de Windows

Kit de herramientas de instalación de paquetes de controladores para controladores universales