Partager via


Utilisation d'un fichier INF d'extension

Avant Windows 10, Windows a sélectionné un package de pilotes unique à installer pour un appareil donné. Cela résultait en des packages de pilotes volumineux et complexes qui incluaient du code pour tous les scénarios et configurations, et chaque mise à jour mineure nécessitait une mise à jour de l'ensemble du package de pilote. À partir de Windows 10, vous pouvez diviser la fonctionnalité INF en plusieurs composants, chacun pouvant être géré indépendamment. Le package de pilote principal installé sur un appareil est maintenant appelé package de pilote de base et est géré par le système de la même façon que les packages de pilotes ont été gérés avant Windows 10. Pour étendre la fonctionnalité d'un package de pilote de base, fournissez un INF d'extension dans un package de pilote séparé. Inf d’extension :

  • Peut être fourni par une autre entreprise et mis à jour indépendamment de l’INF de base.

  • Utilise la même syntaxe INF qu’une inf de base, mais peut étendre l’INF de base pour la personnalisation ou la spécialisation.

  • Améliore la valeur de l’appareil, mais n’est pas nécessaire pour que le package de pilotes de base fonctionne. En l’absence de l’extension INF, le système doit être en mesure de démarrer et de se connecter au réseau avec uniquement le package de pilotes de base. Les périphériques d’entrée intégrés au système, tels qu’un clavier, doivent être en mesure de fonctionner avec au moins des fonctionnalités de base sans aucune inf d’extension.

  • Doit être un fichier INF universel.

Chaque appareil doit avoir un package de pilote de base installé sur celui-ci et peut éventuellement avoir un ou plusieurs fichiers INF d’extension associés à celui-ci. Une extension INF ne peut pas être installée sur un appareil s’il n’existe aucun package de pilote de base présent pour l’installer également sur l’appareil.

Les scénarios classiques dans lesquels vous pouvez utiliser un INF d’extension sont les suivants :

  • Modification des paramètres fournis dans un package de pilotes de base, tels que la personnalisation du nom convivial de l’appareil ou la modification d’un paramètre de configuration matérielle.

  • Création d’un ou de plusieurs composants logiciels en spécifiant la directive AddComponent INF et en fournissant un fichier INF de composant.

  • Fourniture de paramètres spécifiques au modèle ou au facteur de forme du système qui améliore l’expérience ou les fonctionnalités de l’appareil, telles que les données d’étalonnage matériel.

  • Ajout d’un pilote de filtre à la pile d’appareils.

Vous trouverez des exemples de code pour certains de ces scénarios dans les exemples ci-dessous. Consultez également l’exemple de package de pilotes compatible DCH, qui décrit comment l’exemple de pilote universel DCHU utilise les INF d’extension.

Fonctionnement de l’extension INF et du package de pilotes de base

Lors de l’installation d’un appareil, les paramètres d’une extension INF sont appliqués après les paramètres d’un package de pilotes de base. Par conséquent, si une extension INF et un package de pilotes de base spécifient le même paramètre, la version dans l’extension INF est appliquée. De même, si le package de pilote de base change, l’extension INF reste et est appliquée sur le nouveau package de pilotes de base. Si plusieurs INF d’extension sont installés sur le même appareil, il n’existe aucun ordre prédéterminé dans lequel les INF d’extension seront appliquées, de sorte qu’une extension INF ne peut pas remplacer de manière déterministe les valeurs fournies par un autre INF d’extension. Les infs d’extension distinctes ciblées sur les mêmes appareils ne doivent pas tenter de modifier les mêmes paramètres.

Il est utile d’inclure des commentaires dans le package de pilotes de base décrivant quelles entrées peuvent être substituées par un inf d’extension, ainsi que des plages de valeurs de paramètre et des contraintes applicables.

Spécification d’ExtensionId

Lorsque vous écrivez une extension INF, vous générez un GUID spécial appelé ExtensionId, qui est une entrée dans la section [Version] de l’INF.

Le système identifie les infs d’extension possibles pour un appareil spécifique en correspondant à l’ID matériel et aux ID compatibles de l’appareil à ceux spécifiés dans une extension INF dans une section Modèles qui s’applique à ce système.

Parmi toutes les INF d’extension possibles qui spécifient la même valeur ExtensionId , le système sélectionne une seule installation et applique ses paramètres sur ceux du package de pilote de base. La date et la version du pilote spécifiées dans l’INF sont utilisées, dans cet ordre, pour choisir l’inf unique entre plusieurs inf d’extension avec le même ID d’extension.

Pour illustrer ce scénario, prenez en compte le scénario suivant qui inclut un appareil hypothétique pour lequel il existe trois inf d’extension :

Diagramme montrant comment les inf de base et les inf d’extension sont sélectionnés.

Les valeurs {A} ExtensionId et {B} sont affichées entre crochets courbés, et le classement de chaque package de pilotes de base est affiché dans les rubans de bannières.

Tout d’abord, le système sélectionne le package de pilotes de base avec le meilleur rang et la version la plus élevée.

Ensuite, le système traite les INF d’extension disponibles. Deux ont la valeur {B}ExtensionId et l’autre a la valeur {A}ExtensionId . À partir des deux premières, supposons que la date du pilote est la même. Le prochain tiebreaker est la version du pilote. Par conséquent, le système sélectionne l’extension INF avec la version 2.0.

L’extension INF avec la valeur ExtensionId unique est également sélectionnée. Le système applique le package de pilote de base pour l’appareil, puis applique les deux inf d’extension pour cet appareil.

Les fichiers INF d’extension sont toujours appliqués après le package de pilote de base, mais il n’existe aucun ordre déterminé dans lequel les inf d’extension sont appliquées.

Création d’une extension INF

Voici les entrées dont vous avez besoin pour définir un INF en tant qu’extension INF.

  1. Spécifiez ces valeurs pour Class et ClassGuid dans la section Version. Pour plus d’informations sur les classes d’installation, consultez Classes de configuration d’appareil définies par le système disponibles pour les fournisseurs.

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. Fournissez une entrée ExtensionId dans la section [Version]. Générez un nouveau GUID pour la version initiale d’une extension INF ou réutilisez le dernier GUID pour les mises à jour ultérieures de l’inf d’extension initiale.

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

Une organisation peut uniquement utiliser un ID d’extension qu’elle possède. Pour plus d’informations sur l’inscription d’un ID d’extension, consultez Gestion des soumissions matérielles dans le tableau de bord du Centre de développement matériel Windows.

  1. Si vous mettez à jour une extension INF, conservez l’ID d’extension identique et incrémentez la version et la date spécifiées par la directive DriverVer. Pour une valeur ExtensionId donnée, PnP sélectionne l’INF avec le DriverVer le plus élevé.

    Remarque

    Si votre extension INF cible Windows 10 S, consultez Windows 10 en mode Pilote Requis pour plus d’informations sur l’installation du pilote sur cette version de Windows.

  2. Dans la section Modèles INF, spécifiez un ou plusieurs ID matériels et compatibles qui correspondent à ceux de l’appareil cible. Ces ID matériels et compatibles n’ont pas besoin de correspondre à ceux du package de pilotes de base. En règle générale, une extension INF répertorie un ID matériel plus spécifique que le package de pilotes de base, avec l’objectif de spécialiser davantage une configuration de pilote spécifique. Par exemple, le package de pilote de base peut utiliser un ID matériel PCI en deux parties, tandis que l’extension INF spécifie un ID matériel PCI en quatre parties, comme suit :

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

    Sinon, l’extension INF peut répertorier le même ID matériel que le package de pilotes de base, par exemple si l’appareil est déjà ciblé de manière étroite ou si le package de pilotes de base répertorie déjà l’ID matériel le plus spécifique.

    Dans certains cas, l’extension INF peut fournir un ID d’appareil moins spécifique, comme un ID compatible, afin de personnaliser un paramètre sur un ensemble plus large d’appareils.

    Le ciblage CHID peut être utilisé si un ID matériel en quatre parties n’est pas possible ou n’est pas suffisamment restrictif.

  3. Ne définissez pas de service avec SPSVCINST_ASSOCSERVICE. Une extension INF ne peut pas fournir de pilote de fonction pour un appareil. Toutefois, une extension INF peut définir d’autres services, tels qu’un pilote de filtre pour l’appareil. Pour plus d’informations sur la spécification de services, consultez la directive AddService INF.

Dans la plupart des cas, vous allez envoyer un package de pilotes INF d’extension au Centre de développement matériel séparément du package de pilotes de base. Pour obtenir des exemples sur la façon de empaqueter des fichiers INFs d’extension et des liens vers des exemples de code, consultez l’exemple de package de pilote compatible DCH.

Le processus de validation et de soumission du pilote est le même pour les infs d’extension que pour les packages de pilotes de base. Pour plus d’informations, consultez Prise en main de Windows HLK.

Désinstallation d’un pilote d’extension

Pour supprimer un package de pilote d’extension du système et le désinstaller de tous les appareils qui l’utilisent, utilisez la commande PnPUtil delete-driver avec l’indicateur uninstall . Cela permet de désinstaller le package de pilotes d’extension des appareils sans supprimer le package de pilotes de base.

Recherchez le nom oem<#>.inf du package de pilotes à désinstaller et utiliser pnputil /delete-driver oem<#>.inf /uninstall.

pnputil /enum-drivers peut être utilisé pour identifier le nom oem<#>.inf approprié.

Exemple 1 : Utilisation d’une extension INF pour définir le nom convivial de l’appareil

Dans un scénario courant, un fabricant d’appareils (IHV) fournit un package de pilotes de base, puis un générateur de système (OEM) fournit un INF d’extension qui complète et, dans certains cas, remplace la configuration et les paramètres du package de pilotes de base. L’extrait de code suivant est une extension INF complète qui montre comment définir le nom convivial de l’appareil.

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

Exemple 2 : Utilisation d’une extension INF pour installer des logiciels supplémentaires

L’extrait de code suivant est un inf d’extension complet inclus dans le kit de ressources d’installation du package de pilotes pour les pilotes universels. Cet exemple utilise la directive Inf AddComponent pour créer des composants qui installent un service et un exécutable. Pour plus d’informations sur ce que vous pouvez faire dans un inf de composant, consultez Utilisation d’un fichier INF de composant.

Pour accéder à ce fichier en ligne, consultez 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

Pour plus d’informations sur l’utilisation d’un INF d’extension pour installer un pilote de filtre, consultez l’ordre des pilotes de filtre de périphérique.

Pour améliorer l’extensibilité, nous vous recommandons de placer une fonctionnalité facultative dans un modèle INF d’extension.

Compatibilité descendante

Toute modification apportée au package de pilote de base doit être soigneusement testée pour s’assurer qu’elle n’interrompt pas la compatibilité descendante pour les infs d’extension existantes.

Lors de la gestion d’un package de pilotes de base, suivez les bonnes pratiques suivantes :

  • Plages de valeurs de paramètre de document et contraintes à la fois dans les commentaires de code et dans un document de conception. Les modifications futures doivent être conformes aux plages spécifiées.
  • Pour prendre en charge de nouvelles plages, ajoutez un paramètre facultatif (aucune valeur par défaut).

Envoi d’un INF d’extension pour la certification

Pour plus d’informations sur l’utilisation des infs d’extension sur l’Centre de développement matériel, consultez Utilisation des infs d’extension dans le tableau de bord windows Centre de développement matériel.

Utilisation des fonctions INF d’extension dans l’Espace partenaires

Exemple de package de pilote compatible DCH

Utilisation d’un fichier INF universel

Prise en main des pilotes Windows

Kit de ressources d’installation du package de pilotes pour les pilotes universels