Usando um arquivo INF de extensão

antes da Windows 10, Windows selecionou um pacote de driver único para instalar para um determinado dispositivo. Isso resultou em pacotes de driver grandes e complexos que incluíam código para todos os cenários e configurações, e cada atualização secundária exigia uma atualização para todo o pacote de driver. a partir do Windows 10, você pode dividir a funcionalidade INF em vários componentes, cada um dos quais pode ser atendido de forma independente.

Para estender a funcionalidade de um arquivo INF de pacote de driver base, forneça um INF de extensão em um pacote de driver separado. Um INF de extensão:

  • Pode ser fornecido por uma empresa diferente e atualizado independentemente do INF de base.
  • Usa a mesma sintaxe INF que um INF base, mas pode estender o INF base para personalização ou especialização.
  • Aprimora o valor do dispositivo, mas não é necessário para que o pacote de driver base funcione. Na ausência do INF da extensão, o sistema deve ser capaz de inicializar e conectar-se à rede apenas com o pacote de driver base. Dispositivos de entrada incorporados ao sistema, como um teclado, devem ser capazes de funcionar com pelo menos a funcionalidade básica sem quaisquer INFs de extensão.
  • Deve ser um arquivo inf universal.

Cada dispositivo deve ter um INF base instalado nele e, opcionalmente, pode ter um ou mais INFs de extensão associados a ele. Um INF de extensão não será capaz de instalar em um dispositivo se não houver nenhum INF base presente para também instalar no dispositivo.

Os cenários típicos em que você pode usar um INF de extensão incluem:

  • Modificar as configurações fornecidas em um INF de base, como personalizar o nome amigável do dispositivo ou modificar uma configuração de hardware.
  • Criação de um ou mais componentes de software especificando a diretiva de inf addComponent e fornecendo um arquivo de componente inf.
  • Fornecer configurações específicas para o fator de modelo ou forma do sistema que aprimora a experiência ou a funcionalidade do dispositivo, como dados de calibragem de hardware.
  • Adicionando um driver de filtro à pilha de dispositivos.

Você pode encontrar o código de exemplo para alguns desses cenários nos exemplos abaixo. Consulte também o exemplo de pacote de driver compatível com dch, que descreve como o exemplo de driver Universal do DCHU usa INFs de extensão.

No diagrama a seguir, duas empresas diferentes criaram pacotes de driver separados para o mesmo dispositivo, que são mostradas nas linhas pontilhadas. A primeira contém apenas um INF de extensão, e o segundo contém um INF de componente e um módulo de software herdado. O diagrama também mostra como um INF de extensão pode fazer referência a um componente INF, que pode, por sua vez, consultar módulos de software para instalação.

Hierarquia de extensão e componente INF.

Como o INF de extensão e o INF base funcionam juntos

Durante a instalação de um dispositivo, as configurações em um INF de extensão são aplicadas após as configurações em um INF de base. Como resultado, se um INF de extensão e um INF de base especificarem a mesma configuração, a versão no INF de extensão será aplicada. Da mesma forma, se o INF base for alterado, o INF da extensão permanecerá e será aplicado no novo INF base. Se vários INFs de extensão estiverem instalados no mesmo dispositivo, não haverá ordenação predeterminada de que os INFs de extensão serão aplicados, de modo que um INF de extensão não pode substituir de forma determinística os valores fornecidos por um INF de extensão diferente. INFs de extensão distinta direcionadas aos mesmos dispositivos não devem tentar alterar as mesmas configurações.

É útil incluir comentários no INF de base que descrevem quais entradas podem ser substituídas por um INF de extensão, bem como os intervalos e as restrições de valor de parâmetro aplicáveis.

Especificando ExtensionId

Ao gravar um INF de extensão, você gera um GUID especial chamado ExtensionId, que é uma entrada na seção [Version] do inf.

O sistema identifica possíveis INFs de extensão para um dispositivo específico, correspondendo a ID de hardware e as IDs compatíveis do dispositivo àqueles especificados em um INF de extensão em uma seção de modelos que se aplica a esse sistema.

Entre todos os INFs de extensão possíveis que especificam o mesmo valor de ExtensionId , o sistema seleciona apenas um para instalar e aplica suas configurações sobre aqueles do inf de base. A data do driver e a versão do driver especificadas no INF são usadas, nessa ordem, para escolher o único INF entre os INFs de várias extensões com a mesma ExtensionId.

Para ilustrar, considere o seguinte cenário que inclui um dispositivo hipotético para o qual há três INFs de extensão:

Diagrama mostrando como INF base e INFs de extensão são selecionados.

Os valores de ExtensionId , {B} , e {C} são mostrados entre chaves, e a {B} de cada driver é mostrada nas faixas de faixa de faixa.

Primeiro, o sistema seleciona o pacote de driver com a melhor classificação e a versão mais alta.

Em seguida, o sistema processa os INFs de extensão disponíveis. Dois têm o valor ExtensionId e um tem o valor ExtensionId . Dos dois primeiros, digamos que a data do driver seja a mesma. O próximo desempate é a versão do driver, portanto, o sistema seleciona o INF de extensão com v 2.0.

O INF de extensão com o valor de ExtensionId exclusivo também é selecionado. O sistema aplica o INF de base para o dispositivo e aplica os dois INFs de extensão para esse dispositivo.

Observe que os arquivos INF de extensão sempre são aplicados após o INF de base, mas que não há uma ordem determinada na qual os INFs de extensão são aplicados.

Criando um INF de extensão

Aqui estão as entradas que você precisa para definir um INF como um INF de extensão.

  1. Especifique esses valores para Class e ClassGuid na seção version . Para obter mais informações sobre as classes de instalação, consulte classes de instalação de dispositivo definidas pelo sistema disponíveis para fornecedores.

    [Version]
    ...
    Class       = Extension
    ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    
  2. Forneça uma entrada de ExtensionId na seção [Version] . Gere um novo GUID para a versão inicial de um INF de extensão ou reutilize o último GUID para atualizações subsequentes do INF de extensão inicial.

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

Observe que uma organização pode usar apenas uma ExtensionId que ela possui. para obter informações sobre como registrar uma ID de extensão, consulte gerenciando envios de hardware no painel do Centro de Desenvolvimento para Hardware do Windows.

  1. Se você estiver atualizando um INF de extensão, mantenha a extensão Extension igual e aumente a versão e a data especificadas pela diretiva DriverVer . Para um determinado valor de ExtensionId , PNP seleciona o INF com o DriverVermais alto.

Observação

se o INF de extensão tiver destinos Windows 10 S, consulte Windows 10 os requisitos de driver no modo S para obter informações sobre a instalação do driver nessa versão do Windows.

  1. Na seção modelos inf, especifique uma ou mais identificações de hardware e compatíveis que correspondam às do dispositivo de destino. Observe que essas IDs compatíveis e de hardware não precisam corresponder às do INF de base. Normalmente, um INF de extensão lista uma ID de hardware mais específica do que o INF de base, com o objetivo de especializar ainda mais uma configuração de driver específica. Por exemplo, o INF de base pode usar uma ID de hardware PCI de duas partes, enquanto o INF de extensão especifica uma ID de hardware PCI de quatro partes, como a seguinte:

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

    Como alternativa, o INF de extensão pode listar a mesma ID de hardware que o INF de base, por exemplo, se o dispositivo já tiver um destino muito estreito ou se o INF base já listar a ID de hardware mais específica.

    Em alguns casos, o INF de extensão pode fornecer uma ID de dispositivo menos específica, como uma ID compatível, para personalizar uma configuração em um conjunto mais amplo de dispositivos.

    O direcionamento de chid pode ser usado se uma ID de hardware de quatro partes não for possível ou não for restritiva o suficiente.

  2. Não defina um serviço com SPSVCINST_ASSOCSERVICE . No entanto, um INF de extensão pode definir outros serviços, como um driver de filtro para o dispositivo. Para obter mais informações sobre como especificar serviços, consulte inf AddService diretiva.

na maioria dos casos, você enviará um pacote de driver INF de extensão para o Centro de Desenvolvimento de Hardware separadamente do pacote de driver base. Para obter exemplos de como empacotar INFs de extensão, bem como links para código de exemplo, consulte exemplo de pacote de driver compatível com dch.

A validação de driver e o processo de envio são os mesmos para INFs de extensão como para INFs regulares. para obter mais informações, consulte Windows Introdução de estúdio.

Desinstalando um driver de extensão

Para remover um pacote de driver de extensão do sistema e desinstalá-lo de qualquer dispositivo que o esteja usando, use delete-driver o comando do PnPUtil com o uninstall sinalizador. Isso permite que o pacote de driver de extensão seja desinstalado dos dispositivos sem remover o pacote de driver base.

Localize o nome do OEM < # > . inf do pacote de driver a ser desinstalado e usado pnputil /delete-driver oem<#>.inf /uninstall .

pnputil /enum-drivers pode ser usado para ajudar a identificar o nome do OEM < # > . inf apropriado.

Exemplo 1: usando um INF de extensão para definir o nome amigável do dispositivo

Em um cenário comum, um fabricante de dispositivo (IHV) fornece um pacote de driver base e, em seguida, um System Builder (OEM) fornece um INF de extensão que complementa e, em alguns casos, substitui a configuração e as configurações do pacote de driver base. O trecho a seguir é um INF de extensão completo que mostra como definir o nome amigável do 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

[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"

Exemplo 2: usando um INF de extensão para instalar software adicional

O trecho a seguir é um INF de extensão completo que é incluído no Kit de ferramentas de instalação de pacote de driver para drivers universais. Este exemplo usa a diretiva de arquivo inf addComponent para criar componentes que instalam um serviço e um executável. Para obter mais informações sobre o que você pode fazer em um componente INF, consulte usando um arquivo de componente inf.

Para acessar esse arquivo online, 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

[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 obter informações sobre como usar um INF de extensão para instalar um driver de filtro, consulte ordenação de driver de filtro de dispositivo.

Para melhorar a extensibilidade, recomendamos que um IHV Coloque a funcionalidade opcional em um modelo inf de extensão.

Compatibilidade com versões anteriores

Qualquer alteração no INF base deve ser exaustivamente testada para garantir que ela não interrompa a compatibilidade com versões anteriores para INFs de extensão existentes.

Ao gerenciar um INF de base, siga estas práticas recomendadas:

  • Os intervalos de valores de parâmetro de documento e restrições nos comentários de código e em um documento de design. As alterações futuras devem estar em conformidade com os intervalos especificados.
  • Para dar suporte a novos intervalos, adicione um parâmetro opcional (nenhum valor padrão).

Enviando um INF de extensão para certificação

para obter informações detalhadas sobre como trabalhar com infs de extensão no Centro de Desenvolvimento de Hardware, consulte trabalhando com infs de extensão no painel Windows Centro de Desenvolvimento de Hardware.