Usando um arquivo INF de extensão

Antes de Windows 10, o Windows selecionou um único pacote de driver 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. O pacote de driver principal instalado em um dispositivo agora é chamado de pacote de driver base e é manipulado pelo sistema da mesma forma que os pacotes de driver foram tratados antes de Windows 10. Para estender a funcionalidade de um pacote de driver base, forneça uma extensão INF em um pacote de driver separado. Uma extensão INF:

  • Pode ser fornecido por uma empresa diferente e atualizado independentemente do INF 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 da extensão INF, o sistema deve ser capaz de inicializar e conectar-se à rede apenas com o pacote de driver base. Dispositivos de entrada integrados ao sistema, como um teclado, devem ser capazes de funcionar com pelo menos funcionalidade básica sem nenhuma extensão INFs.

  • Deve ser um arquivo INF universal.

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

Cenários típicos em que você pode usar uma extensão INF incluem:

  • Modificar as configurações fornecidas em um pacote de driver base, como personalizar o nome amigável do dispositivo ou modificar uma configuração de hardware.

  • Criando um ou mais componentes de software especificando a diretiva INF AddComponent e fornecendo um arquivo INF de componente.

  • Fornecendo configurações específicas para o modelo ou fator 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 do dispositivo.

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

Como a extensão INF e o pacote de driver base funcionam juntos

Durante a instalação de um dispositivo, as configurações em uma extensão INF são aplicadas após as configurações em um pacote de driver base. Como resultado, se um INF de extensão e um pacote de driver base especificarem a mesma configuração, a versão na extensão INF será aplicada. Da mesma forma, se o pacote de driver base for alterado, a extensão INF permanecerá e será aplicada sobre o novo pacote de driver base. Se vários INFs de extensão estiverem instalados no mesmo dispositivo, não haverá nenhuma ordenação predeterminada na qual os INFs de extensão serão aplicados, portanto, uma extensão INF não poderá substituir valores deterministicamente 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 pacote de driver base que descreve quais entradas podem ser substituídas por um INF de extensão, bem como intervalos e restrições de valor de parâmetro aplicáveis.

Especificando ExtensionId

Ao escrever uma extensão INF, você gera um GUID especial chamado ExtensionId, que é uma entrada na seção [Versão] 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 com aquelas especificadas em uma extensão INF em uma seção Modelos que se aplica a esse sistema.

Entre todos os INFs de extensão possíveis que especificam o mesmo valor ExtensionId , o sistema seleciona apenas um para instalar e aplica suas configurações sobre as do pacote de driver 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 vários INFs de extensão 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 ExtensionId e {B} são mostrados {A} entre colchetes e a classificação de cada pacote de driver base é mostrada nas faixas de opções.

Primeiro, o sistema seleciona o pacote de driver base 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 {B}ExtensionId e um tem o valor {A}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 a extensão INF com v2.0.

A extensão INF com o valor exclusivo extensionId também está selecionada. O sistema aplica o pacote de driver base para o dispositivo e aplica os dois INFs de extensão para esse dispositivo.

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

Criando uma extensão INF

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 Versão . Para obter mais informações sobre 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 ExtensionId na seção [Versão] . Gere um novo GUID para a versão inicial de uma extensão INF ou reutilize o último GUID para atualizações subsequentes da extensão inicial INF.

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

Uma organização só pode usar uma ExtensionID que 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 uma extensão INF, mantenha a ExtensionId a mesma e incremente a versão e a data especificadas pela diretiva DriverVer . Para um determinado valor ExtensionId , o PnP seleciona o INF com o DriverVer mais alto.

    Observação

    Se o INF da extensão for direcionado Windows 10 S, consulte Windows 10 no modo S Requisitos de driver para obter informações sobre a instalação do driver nessa versão do Windows.

  2. Na seção Modelos INF, especifique um ou mais IDs compatíveis e hardware que correspondam às do dispositivo de destino. Esses hardwares e IDs compatíveis não precisam corresponder aos do pacote de driver base. Normalmente, uma extensão INF lista uma ID de hardware mais específica do que o pacote de driver base, com o objetivo de especializar ainda mais uma configuração de driver específica. Por exemplo, o pacote de driver base pode usar uma ID de hardware PCI de duas partes, enquanto a extensão INF 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 da extensão pode listar a mesma ID de hardware que o pacote de driver base, por exemplo, se o dispositivo já tiver sido direcionado por pouco ou se o pacote de driver base já listar a ID de hardware mais específica.

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

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

  3. Não defina um serviço com SPSVCINST_ASSOCSERVICE. Uma extensão INF não pode fornecer um driver de função para um dispositivo. No entanto, uma extensão INF pode definir outros serviços, como um driver de filtro para o dispositivo. Para obter mais informações sobre como especificar serviços, consulte Diretiva INF AddService.

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 sobre como empacotar INFs de extensão e links para código de exemplo, consulte Exemplo de pacote de driver compatível com DCH.

O processo de validação e envio de driver é o mesmo para INFs de extensão que para pacotes de driver base. Para obter mais informações, consulte Windows HLK Introdução.

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 use, use o comando do delete-driverPnPUtil com o uninstall sinalizador . Isso permite que o pacote de driver de extensão seja desinstalado de dispositivos sem remover o pacote de driver base.

Localize o nome oem<#>.inf do pacote de driver para desinstalar e usar pnputil /delete-driver oem<#>.inf /uninstall.

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

Exemplo 1: Usando uma extensão INF 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 construtor de sistema (OEM) fornece uma extensão INF que complementa e, em alguns casos, substitui a configuração e as configurações do pacote de driver base. O snippet a seguir é uma extensão completa INF 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
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"

Exemplo 2: Usando uma extensão INF para instalar software adicional

O snippet a seguir é uma extensão completa INF incluída no kit de ferramentas de instalação de pacote de driver para drivers universais. Este exemplo usa a diretiva 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 inf componente, consulte Usando um arquivo INF de componente.

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
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 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 pacote de driver base deve ser testada minuciosamente para garantir que ele não interrompa a compatibilidade com versões anteriores para INFs de extensão existentes.

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

  • Documente intervalos e restrições de valor de parâmetro em 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 (sem valor padrão).

Enviando uma extensão INF 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 do Centro de Desenvolvimento de Hardware do Windows.

Trabalhando com INFs de extensão no Partner Center

Exemplo de pacote de driver compatível com DCH

Usar um arquivo INF Universal

Introdução com drivers do Windows

Kit de ferramentas de instalação do pacote de driver para drivers universais