Usar un archivo INF de ampliació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 principal 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 proporcionarse por otra empresa y actualizarse independientemente del INF base.

  • Usa la misma sintaxis INF que un INF base, pero puede extender 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 poder funcionar con al menos funcionalidad básica sin ninguna extensión INFs.

  • Debe ser un archivo INF universal.

Cada dispositivo debe tener instalado un paquete de controladores base en él y, opcionalmente, puede tener una o varias INFs de extensión asociadas. 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 puede 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.

  • Para crear uno o varios componentes de software, especifique la directiva AddComponent inf y proporcione un archivo INF de componentes.

  • Proporcionar la configuración específica del modelo o el 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. Consulte 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 la 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 se instalan varias INFs de extensión 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 de controladores base que describen qué entradas se pueden invalidar mediante una extensión INF, así como los intervalos de valores de parámetro y las 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 INFs 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 Models que se aplica a ese sistema.

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

Para ilustrarlo, tenga en cuenta 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 cada rango del 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 INFs de extensión disponibles. Dos tienen el valor {B}ExtensionId y uno tiene el valor {A}ExtensionId . A partir de las dos primeras, 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 que no hay ningún orden determinado en el que se aplican las INFs 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 configuració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 ExtensionID 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 controlador más alto.

    Nota:

    Si los destinos inf de la extensión Windows 10 S, consulte Windows 10 en S mode Driver Requirements 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 de hardware y compatibles no necesitan coincidir con los del paquete de controladores base. Normalmente, una extensión INF enumera 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 un identificador de hardware de cuatro partes no es posible 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, consulte Directiva AddService inf.

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 a código de ejemplo, consulte Ejemplo de paquete de controladores compatibles con DCH.

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

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-driverPnPUtil 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: Uso de 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 del sistema (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 siguiente fragmento de código 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 siguiente fragmento de código es una extensión COMPLETA INF que se incluye en el kit de herramientas de instalación del paquete de controladores para controladores universales. En este ejemplo se usa la directiva INF AddComponent para crear componentes que instalan un servicio y un 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, consulte Ordenación de controladores 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 de controladores base debe probarse exhaustivamente para asegurarse de que no interrumpe 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ámetros 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 el Centro de desarrollo de hardware, vea Working with Extension INFs en el panel del Centro de desarrollo de hardware de Windows.

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 con controladores de Windows

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