Usar um arquivo INF de extensão

Antes do Windows 10, o Windows selecionava um único pacote de driver para instalar em 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 de todo o pacote de driver. A partir do Windows 10, você pode dividir a funcionalidade INF em vários componentes, cada um podendo ser atendido independentemente. O pacote de driver principal instalado em um dispositivo agora é chamado de pacote de driver base e é tratado pelo sistema da mesma forma que os pacotes de driver foram tratados antes do 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.

  • Aumenta 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 se conectar à rede apenas com o pacote de driver básico. Os dispositivos de entrada integrados ao sistema, como um teclado, devem ser capazes de funcionar com pelo menos a funcionalidade básica sem nenhum INF de extensão.

  • 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. Um INF de extensão não poderá ser instalado em um dispositivo se não houver nenhum pacote de driver base presente para instalar também 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 pacote de driver base, como personalizar o nome amigável do dispositivo ou modificar uma definição de configuração de hardware.

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

  • Fornecer 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 calibração 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 Exemplo de pacote de driver compatível com DCH, que descreve como o exemplo de driver universal DCHU usa INFs de extensão.

Como o INF de extensão e o pacote de driver 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 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 no INF de extensão será aplicada. Da mesma forma, se o pacote de driver base for alterado, o INF de extensão permanecerá e será aplicado ao novo pacote de driver base. Se vários INFs de extensão estiverem instalados no mesmo dispositivo, não haverá nenhuma ordem predeterminada na qual os INFs de extensão serão aplicados, portanto, um INF de extensão não poderá substituir deterministicamente os valores fornecidos por um INF de extensão diferente. INFs de extensão distintos direcionados aos mesmos dispositivos não devem tentar alterar as mesmas configurações.

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

Especificando ExtensionId

Ao escrever 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 combinando a ID de hardware e as IDs compatíveis do dispositivo com as especificadas em um INF de extensão 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 o mesmo 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 {A} ExtensionId e {B} são mostrados entre chaves, e a classificação de cada pacote de driver base é mostrada nas faixas de faixa.

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 desempatador é a versão do driver, portanto, o sistema seleciona o INF de extensão com v2.0.

A extensão INF com o valor exclusivo de ExtensionId também é selecionada. O sistema aplica o pacote de driver base para o dispositivo e, em seguida, 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 não há nenhuma ordem determinada na qual os INFs de extensão são aplicados.

Criando um INF de extensão

Aqui estão as entradas necessárias 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 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 [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
    

Uma organização só pode usar um 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 de Hardware do Windows.

  1. Se você estiver atualizando um INF de extensão, mantenha o ExtensionId igual 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 de extensão for direcionado ao 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 uma ou mais IDs de hardware e compatíveis que correspondam às do dispositivo de destino. Essas IDs de hardware e compatíveis não precisam corresponder às do pacote de driver base. Normalmente, um INF de extensão 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 seguir:

    [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 pacote de driver base, por exemplo, se o dispositivo já estiver direcionado de forma restrita 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, para personalizar uma configuração em um conjunto mais amplo de dispositivos.

    O direcionamento CHID pode 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. Um INF de extensão não pode fornecer um driver de função para um dispositivo. 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 Diretiva AddService do INF.

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 do driver é o mesmo para INFs de extensão e para pacotes de driver base. Para obter mais informações, consulte Introdução ao Windows HLK.

Desinstalando um driver de extensão

Para remover um pacote de driver de extensão do sistema e desinstalá-lo de todos os dispositivos que o utilizam, use o comando do delete-driver 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 oem<#>.inf do pacote de driver a ser desinstalado e use pnputil /delete-driver oem<#>.inf /uninstallo .

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 IHV (fabricante de dispositivo) fornece um pacote de driver base e, em seguida, um OEM (integrador de sistema) fornece um INF de extensão que complementa e, em alguns casos, substitui a configuração e as definições do pacote de driver base. O snippet 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
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 é um INF de extensão completo incluído no kit de ferramentas de instalação do 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 de componente, consulte Usando um arquivo INF de componente.

Para acessar esse arquivo on-line, 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 do 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 ela 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 de valores de parâmetros e restrições em comentários de código e em um documento de projeto. 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 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 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 aos drivers do Windows

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