Partilhar via


Usar um arquivo INF de extensão

Antes do Windows 10, o Windows escolhia um pacote de drivers para instalação em um 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 é processado pelo sistema da mesma forma que os pacotes de driver eram processados 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. Um INF de extensão:

  • Pode ser fornecido por uma empresa diferente e atualizado independentemente do INF base.

  • Usa a mesma sintaxe INF de 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 base. Dispositivos de entrada incorporados ao sistema, como um teclado, devem ser capazes de funcionar com pelo menos funcionalidade básica sem quaisquer INFs de extensão.

  • Deve ser um arquivo INF universal.

Cada dispositivo deve ter um pacote de driver base instalado e, como opção, 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 um pacote de driver base presente para também ser instalado no dispositivo.

Cenários típicos onde você pode usar um INF de extensão incluem:

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

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

  • Fornecer configurações específicas para o modelo ou formato do sistema que melhoram a experiência ou a funcionalidade do dispositivo, como dados de calibração de hardware.

  • Adição de um driver de filtro à pilha de dispositivos.

Você pode encontrar 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 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 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 sobre o novo pacote de driver base. Se vários INFs de extensão forem instalados no mesmo dispositivo, não haverá uma 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 do driver base descrevendo quais entradas podem ser substituídas por um INF de extensão, bem como intervalos de valores de parâmetros e restrições aplicáveis.

Especificação de ExtensionId

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

O sistema identifica possíveis INFs de extensão para um dispositivo específico, comparando a ID de hardware e as IDs compatíveis do dispositivo com aquelas especificadas em um INF de extensão em uma seção Modelos que se aplica a esse sistema.

Dentre 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 e a versão do driver especificadas no INF são usadas, nessa ordem, para escolher o INF único 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 os INFs base e de extensão são selecionados.

Os valores ExtensionId {A} e {B} são mostrados entre chaves, e a classificação de cada pacote de driver básico é mostrada nas faixas de banner.

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

Em seguida, o sistema processa os INFs de extensão disponíveis. Dois tem valor ExtensionId {B} e um tem valor ExtensionId {A}. Dos dois primeiros, digamos que a data do driver seja a mesma. Como o próximo desempate é a versão do driver, o sistema seleciona o INF de extensão com v2.0.

O INF de extensão com o valor exclusivo ExtensionId também é selecionado. O sistema aplica o pacote de driver base para o dispositivo e depois 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á uma ordem determinada na qual os INFs de extensão são aplicados.

Criação de 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 de Class e ClassGuid na seção Versão. Para obter mais informações sobre classes de configuraçã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 uma nova GUID para a versão inicial de um INF de extensão ou reutilize a última 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 Gerenciamento de envios de hardware no painel do Windows Hardware Dev Center.

  1. Se você estiver atualizando um INF de extensão, mantenha o ExtensionId o mesmo e incremente a versão e a data especificadas pela diretiva DriverVer. Para um determinado valor ExtensionId, o PnP seleciona o INF com o maior DriverVer.

    Observação

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

  2. Na seção de modelos do INF, especifique um ou mais IDs de hardware e compatíveis que correspondam aos do dispositivo de destino. Essas IDs de hardware e compatíveis não precisam corresponder aos do pacote de driver base. Em geral, 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 o INF de extensão especifica uma ID de hardware PCI de quatro partes, como o 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 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, 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.

  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. Contudo, 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 INF AddService.

Na maioria dos casos, você enviará um pacote de driver INF de extensão para o Hardware Dev Center separadamente do pacote de driver base. Para obter exemplos de como empacotar INFs de extensão e links para códigos de amostra, 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.

Desinstalação de um driver de extensão

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

Encontre 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 apropriado oem<#>.inf.

Exemplo 1: uso de uma extensão INF para definir o nome fácil de usar do dispositivo

Em um cenário comum, um fabricante de dispositivo (IHV) fornece um pacote de driver base e depois um integrador de sistema (OEM) 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 trecho a seguir é um INF de extensão completo que mostra como definir o nome fácil de usar 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: uso de uma extensão INF para instalar software adicional

O trecho a seguir é um INF de extensão completa que está incluída no Kit de ferramentas de instalação de pacotes de drivers 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 componente INF, consulte Usar um arquivo INF de componente.

Para acessar este 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,,"{00001111-aaaa-2222-bbbb-3333cccc4444}"
HKCR,AppID\{00001111-aaaa-2222-bbbb-3333cccc4444},,,"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 Pedido de driver de filtro de dispositivo.

Para melhorar a extensibilidade, recomendamos que um IHV coloque uma 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 não viole a compatibilidade com versões anteriores dos 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 tanto em comentários de código quanto em um documento de design. Alterações futuras devem estar em conformidade com os intervalos especificados.
  • Para oferecer suporte a novos intervalos, adicione um parâmetro opcional (sem valor padrão).

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

Para obter informações detalhadas sobre como trabalhar com INFs de extensão no Hardware Dev Center, consulte Trabalhar com INFs de extensão no painel do Windows Hardware Dev Center.

Trabalhar com INFs de extensão na Central de Parceiros

Exemplo de pacote de driver compatível com DCH

Usar um arquivo INF Universal

Introdução ao desenvolvimento de drivers do Windows

Kit de ferramentas de instalação de pacotes de drivers para drivers universais