Usando um arquivo INF de extensão
Antes do Windows 10, o Windows selecionava 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 básico 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 de forma independente da 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 base. Os dispositivos de entrada integrados no sistema, como um teclado, devem poder funcionar com, pelo menos, funcionalidades básicas sem quaisquer INFs de extensão.
Cada dispositivo deve ter um pacote de driver básico 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 básico presente para também instalar no dispositivo.
Os cenários típicos em que você pode usar uma extensão INF incluem:
Modificar configurações fornecidas em um pacote de driver básico, 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 ficheiro INF de componente .
Fornecer configurações específicas para o modelo ou fator de forma do sistema que aprimoram a experiência ou a funcionalidade do dispositivo, como dados de calibração de hardware.
Adicionar 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 o DCH-Compliant Exemplo de pacote de drivers, que descreve como a amostra de driver universal DCHU utiliza INFs de extensão.
Como o INF de extensão e o pacote de driver básico trabalham em conjunto
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 uma extensão INF 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 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 distintas destinadas 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 uma extensão INF, bem como intervalos de valores de parâmetros aplicáveis e restrições.
Especificando o ID de Extensão
Quando você escreve uma extensão INF, você gera um GUID especial chamado
O sistema identifica possíveis INFs de extensão para um dispositivo específico ao combinar o ID de hardware e os IDs compatíveis do dispositivo aos especificados 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 controlador e a versão do controlador especificadas no INF são utilizadas, nessa ordem, para selecionar o único INF entre múltiplos INFs de extensão com o mesmo ExtensionId.
Para ilustrar, considere o seguinte cenário que inclui um dispositivo hipotético para o qual existem três INFs de extensão:
Os valores
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 ExtensionId valor{B}
e um tem ExtensionId valor{A}
. Dos dois primeiros, digamos que a data do motorista é a mesma. O próximo critério de desempate é a versão do driver, então o sistema seleciona a extensão INF com v2.0.
A extensão INF com o valor exclusivo 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á uma ordem determinada na qual os INFs de extensão são aplicados.
Criação de uma extensão INF
Aqui estão as entradas que você precisa para definir um INF como uma extensão INF.
Especifique estes valores para Class e ClassGuid na secção da Versãodo . Para obter mais informações sobre classes de configuração, consulte System-Defined Classes de configuração de dispositivo disponíveis para fornecedores.
[Version] ... Class = Extension ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57} ...
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 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.
Se estiver a atualizar uma extensão INF, mantenha a ExtensionId a mesma e aumente a versão e a data especificadas pela diretiva DriverVer. Para um determinado ExtensionId valor de, o PnP seleciona o INF com o maior DriverVer.
Observação
Se a sua extensão INF se destinar ao Windows 10 S, consulte Requisitos de Controlador do Windows 10 no modo S para obter informações sobre a instalação do controlador nessa versão do Windows.
Na seção Modelos INF , especifique um ou mais IDs de hardware e compatíveis que correspondam aos do dispositivo de destino. Não é necessário que estes IDs de hardware e de compatibilidade correspondam aos do pacote básico de drivers. Normalmente, uma extensão INF lista um ID de hardware mais específico 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 um ID de hardware PCI de duas partes, enquanto a extensão INF especifica um 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, a extensão INF pode listar o mesmo ID de hardware que o pacote de driver base, por exemplo, se o dispositivo já estiver com destino restrito ou se o pacote de driver base já listar o ID de hardware mais específico.
Em alguns casos, a extensão INF pode fornecer um ID de dispositivo menos específico, como um ID compatível, para personalizar uma configuração em um conjunto mais amplo de dispositivos.
de segmentação CHID pode ser usado se um ID de hardware de quatro partes não for possível ou não for restritivo o suficiente.
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 exemplos de como empacotar INFs de extensão e links para código de exemplo, veja o Exemplo de Pacote de Controladores DCH-Compliant.
O processo de validação e envio do driver é o mesmo para INFs de extensão e para pacotes de driver de 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 qualquer dispositivo que o utilize, use comandodelete-driver
do PnPUtil com o sinalizador uninstall
. Isso permite que o pacote de driver de extensão seja desinstalado dos dispositivos sem remover o pacote de driver básico.
Encontre o nome do pacote de driver oem<#>.inf para desinstalar e usar pnputil /delete-driver oem<#>.inf /uninstall
.
pnputil /enum-drivers
pode ser usado para ajudar a identificar o nome apropriado do OEM<#>.inf.
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 integrador de sistemas (OEM) fornece uma extensão INF que complementa e, em alguns casos, substitui a configuração e as definições do pacote de driver base. O trecho 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 trecho a seguir é um ficheiro INF de extensão completa que está incluído no conjunto de ferramentas de instalação do pacote de driver para drivers universais. Este exemplo usa 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 Usando um arquivo INF de componente.
Para aceder a este ficheiro 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 a ordenação dos drivers de filtro de dispositivo .
Para melhorar a extensibilidade, recomendamos que o IHV coloque a funcionalidade opcional em uma modelo de extensão de INF.
Compatibilidade com versões anteriores
Qualquer alteração no pacote de drivers base deve ser exaustivamente testada para garantir que não comprometa a compatibilidade retroativa com INFs de extensão existentes.
Ao gerenciar um pacote de driver básico, siga estas práticas recomendadas:
- Documente os intervalos de valores e restrições de parâmetros em comentários de código e num documento de conceção. As alterações futuras devem estar em conformidade com os intervalos especificados.
- Para suportar novos intervalos, adicione um parâmetro opcional (sem valor padrão).
Apresentação de 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.
Artigos relacionados
Trabalhando com INFs de extensão no Partner Center
DCH-Compliant Exemplo de pacote de driver
Usando um arquivo INF universal
Comece a desenvolver drivers do Windows
Kit de ferramentas de instalação de pacotes de drivers para drivers universais