Uso de un archivo INF de extensión
Antes de Windows 10, Windows seleccionó un único paquete de controladores para instalarlo 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 lo controla de la misma manera que hacía 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. Un INF de extensión:
Lo puede proporcionar una empresa diferente y se puede actualizar independientemente del INF base.
Usa la misma sintaxis de 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. Si falta el INF de extensión, 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 los INF de extensión.
Debe ser un archivo INF universal.
Cada dispositivo debe tener un paquete de controladores base instalado y, opcionalmente, puede tener uno o varios INF de extensión asociados. Un INF de extensión no podrá instalarse en un dispositivo si no hay ningún paquete de controladores base presente para instalarse también en el dispositivo.
Entre los escenarios típicos en los que podría usar un INF de extensión se incluyen los siguientes:
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 de 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 muestra para algunos de estos escenarios en los ejemplos siguientes. Consulte también el ejemplo de paquete de controladores compatible con DCH, en el que se describe cómo el ejemplo de controlador universal DCHU usa INF de extensión.
Cómo funcionan conjuntamente el paquete de controladores base e INF de extensión
Durante la instalación de un dispositivo, la configuración de un INF de extensión se aplica después de la configuración en un paquete de controladores base. Como resultado, si un INF de extensión y un paquete de controladores base especifican la misma configuración, se aplica la versión del INF de extensión. Del mismo modo, si cambia el paquete de controladores base, el INF de extensión permanece y se aplica sobre el nuevo paquete de controladores base. Si hay varios INF de extensión instalados en el mismo dispositivo, no hay ningún orden predeterminado en el que se aplicarán los INF de extensión, por lo que un INF de extensión no puede invalidar de forma determinista los valores proporcionados por un INF de extensión diferente. Los INF de extensión diferentes destinados a los mismos dispositivos no deben intentar modificar la misma configuración.
Resulta útil incluir comentarios en el paquete de controladores base que describan qué entradas se pueden invalidar mediante un INF de extensión, así como los intervalos de valores de parámetro y restricciones aplicables.
Especificación de ExtensionId
Al escribir un INF de extensión, se genera un GUID especial denominado ExtensionId, que es una entrada en la sección [Version] del INF.
El sistema identifica posibles INF de extensión para un dispositivo específico cotejando el identificador de hardware y los identificadores compatibles del dispositivo con los especificados en un INF de extensión en una sección Models que se aplica a ese sistema.
Entre todos los INF de extensión posibles que especifican el mismo valor de ExtensionId , el sistema selecciona solo uno para instalar y aplica su configuración sobre los del paquete de controladores base. La fecha y la versión del controlador especificadas en el INF se usan, en ese orden, para elegir el único INF de extensión entre varios con el mismo ExtensionId.
Para ilustrarlo, considere el siguiente escenario que incluye un dispositivo hipotético para el que hay tres INF de extensión:
Los valores {A}
y {B}
de ExtensionId se muestran entre corchetes, y la clasificación de cada paquete de controladores base se muestra en las cintas del 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 los INF de extensión disponibles. Dos tienen el valor de ExtensionId {B}
y uno tiene el valor de ExtensionId {A}
. En los dos primeros, supongamos que la fecha del controlador es la misma. El siguiente criterio de desempate es la versión del controlador, por lo que el sistema selecciona el INF de extensión con v2.0.
También se selecciona el INF de extensión con el valor de ExtensionId único. El sistema aplica el paquete de controladores base para el dispositivo y, a continuación, aplica los dos INF de extensión para ese dispositivo.
Los archivos INF de extensión siempre se aplican después del paquete de controladores base, pero no hay ningún orden determinado en el que se aplican los INF de extensión.
Creación de un INF de extensión
Estas son las entradas que necesita para definir un INF como INF de extensión.
Especifique estos valores para Class y ClassGuid en la sección Version. Para obtener más información sobre las clases de configuración, consulte Clases de configuración de dispositivos definidas por el sistema disponibles para proveedores.
[Version] ... Class = Extension ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57} ...
Proporcione una entrada ExtensionId en la sección [Version]. Genere un nuevo GUID para la versión inicial de un INF de extensión o reutilice el último GUID para las actualizaciones posteriores del INF de extensión inicial.
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
Una organización solo puede usar ExtensionID que posea. 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.
Si va a actualizar un INF de extensión, mantenga ExtensionId igual e incremente la versión y la fecha especificadas por la directiva DriverVer. Para un valor de ExtensionId determinado, PnP selecciona el INF con la directiva DriverVer más alta.
Nota:
Si el INF de extensión tiene como destino Windows 10 S, consulte Requisitos del controlador en modo S de Windows 10 para obtener información sobre la instalación de controladores en esa versión de Windows.
En la sección Models del INF, especifique uno o varios identificadores de hardware compatibles que coincidan con los del dispositivo de destino. No es necesario que estos identificadores de hardware compatibles coincidan con los del paquete de controladores base. Normalmente, un INF de extensión 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 el INF de extensión 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, el INF de extensión podría enumerar el mismo identificador de hardware que el paquete de controladores base, por ejemplo, si el dispositivo ya tiene un destino específico o si el paquete de controladores base ya muestra el identificador de hardware más específico.
En algunos casos, el INF de extensión 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.
Se puede usar la segmentación de CHID si no es posible un identificador de hardware de cuatro partes o no es lo suficientemente restrictivo.
No defina un servicio con
SPSVCINST_ASSOCSERVICE
. Un INF de extensión no puede proporcionar un controlador de función para un dispositivo. Sin embargo, un INF de extensión 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 de INF.
En la mayoría de los casos, enviará un paquete de controladores de INF de extensión al Centro de desarrollo de hardware por separado del paquete de controladores base. Para obtener ejemplos sobre cómo empaquetar INF de extensión y vínculos al 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 los INF de extensión que para los paquetes de controladores base. Para obtener más información, consulte 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 delete-driver
de PnPUtil con la marca uninstall
. 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 use 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 un INF de extensión 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 un INF de extensión completo 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: Usar un INF de extensión 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 de 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 un INF de extensión para instalar un controlador de filtro, consulte Orden del controlador de filtro de dispositivos.
Para mejorar la extensibilidad, se recomienda que un IHV coloque la funcionalidad opcional en una plantilla de 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 los INF de extensión existentes.
Al administrar un paquete de controladores base, siga estos procedimientos recomendados:
- Documente los intervalos y restricciones de valores de parámetro 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 un INF de extensión para la certificación
Para obtener información detallada sobre cómo trabajar con INF de extensión en el Centro de desarrollo de hardware, consulte Trabajo con INF de extensión en el panel del Centro de desarrollo de hardware de Windows.
Artículos relacionados
Trabajo con INF 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 al desarrollo de controladores de Windows
Kit de herramientas de instalación de paquetes de controladores para controladores universales