Utilisation d'un fichier INF d'extension
Avant Windows 10, Windows sélectionnait un seul package de pilotes à 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 de base installé sur un périphérique est désormais appelé package de pilote de base et est géré par le système de la même manière 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é. Un 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’un 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 d’un INF d’extension, le système doit pouvoir démarrer et se connecter au réseau avec uniquement le package de pilotes de base. Les appareils d’entrée intégrés au système, comme un clavier, doivent être capables de fonctionner avec au moins des fonctionnalités de base sans aucun INF d’extension.
Doit être un fichier INF universel.
Chaque appareil doit avoir un package de pilotes de base installé, et peut éventuellement avoir un ou plusieurs INFs d’extension associés. Un INF d’extension ne pourra pas s’installer sur un appareil s’il n’y a pas de package de pilotes de base également présent à installer sur l’appareil.
Les scénarios typiques dans lesquels vous pourriez utiliser un INF d’extension incluent :
Modifier les paramètres fournis dans un package de pilotes de base, comme personnaliser le nom convivial de l’appareil ou modifier un paramètre de configuration matérielle.
Créer un ou plusieurs composants logiciels en spécifiant la directive INF AddComponent et en fournissant un fichier INF de composant.
Fournir des paramètres spécifiques au modèle ou au facteur de forme du système qui améliorent l’expérience ou la fonctionnalité de l’appareil, comme des données d’étalonnage matériel.
Ajouter un pilote de filtre à la pile de l’appareil.
Vous pouvez trouver du code d’exemple pour certains de ces scénarios dans les exemples ci-dessous. Veuillez également consulter la section Exemple de package de pilotes conforme à DCH, qui décrit comment l’exemple de pilote universel DCHU utilise des INFs d’extension.
Comment les INFs d’extension et le package de pilotes de base fonctionnent ensemble
Lors d’une installation d’appareil, les paramètres dans un INF d’extension sont appliqués après les paramètres dans un package de pilotes de base. En conséquence, si un INF d’extension et un package de pilotes de base spécifient le même paramètre, la version dans l’INF d’extension est appliquée. De même, si le package de pilotes de base change, l’INF d’extension reste et est appliqué par-dessus le nouveau package de pilotes de base. Si plusieurs INFs d’extension sont installés sur le même appareil, il n’y a pas d’ordre prédéterminé dans lequel les INFs d’extension seront appliqués, donc un INF d’extension ne peut pas remplacer de manière déterministe les valeurs fournies par un autre INF d’extension. Les INFs d’extension distincts ciblant 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 remplacées par un INF d’extension, ainsi que les plages de valeurs des paramètres applicables et les contraintes.
Spécification de ExtensionId
Lorsque vous rédigez un INF d’extension, 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 faisant correspondre l’ID matériel et les ID compatibles de l’appareil à ceux spécifiés dans un INF d’extension dans une section Modèles qui s’applique à ce système.
Parmi tous les INFs d’extension possibles qui spécifient la même valeur ExtensionId, le système en sélectionne un seul à installer et applique ses paramètres à ceux du package de pilotes de base. La date du pilote et la version du pilote spécifiées dans l’INF sont utilisées, dans cet ordre, pour choisir l’INF unique parmi plusieurs INFs d’extension avec le même ExtensionId.
Pour illustrer, considérons le scénario suivant qui inclut un appareil hypothétique pour lequel il existe trois INFs d’extension :
Les valeurs ExtensionId {A}
et {B}
sont montrées entre accolades, et chaque classement du package de pilotes de base est indiqué dans les rubans de bannière.
Tout d’abord, le système sélectionne le package de pilotes de base avec le meilleur classement et la version la plus récente.
Ensuite, le système traite les INFs d’extension disponibles. Deux ont la valeur ExtensionId {B}
, et un a la valeur ExtensionId {A}
. Supposons que, parmi les deux premiers, la date du pilote soit identique. Le prochain critère de départage est la version du pilote, donc le système sélectionne l’INF d’extension avec la v2.0.
L’INF d’extension avec la valeur ExtensionId unique est également sélectionné. Le système applique le package de pilotes de base pour l’appareil, puis applique les deux INFs d’extension pour cet appareil.
Les fichiers INF d’extension sont toujours appliqués après le package de pilotes de base, mais il n’y a pas d’ordre déterminé dans lequel les INFs d’extension sont appliqués.
Création d’un INF d’extension
Voici les entrées que vous devez définir dans un INF en tant qu’INF d’extension.
Spécifiez ces valeurs pour Class et ClassGuid dans la section Version. Pour plus d’informations sur les classes d’installation, veuillez consulter la section Classes d’installation de périphériques définies par le système disponibles pour les fournisseurs.
[Version] ... Class = Extension ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57} ...
Fournissez une entrée ExtensionId dans la section [Version]. Générez un nouveau GUID pour la version initiale d’un INF d’extension, ou réutilisez le dernier GUID pour les mises à jour ultérieures de l’INF d’extension initial.
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
Une organisation ne peut utiliser qu’un ExtensionID qu’elle possède. Pour des informations sur l’enregistrement d’un ID d’extension, veuillez consulter la section Gestion des soumissions de matériel dans le tableau de bord du Windows Hardware Dev Center.
Si vous mettez à jour un INF d’extension, conservez le même ExtensionId et incrémentez la version et la date spécifiées par la directive DriverVer. Pour une valeur donnée de ExtensionId, PnP sélectionne l’INF avec la version DriverVer la plus élevée.
Remarque
Si votre INF d’extension cible Windows 10 S, consultez la section Exigences relatives aux pilotes de Windows 10 en mode S pour des informations sur l’installation de pilotes sur cette version de Windows.
Dans la section Modèles INF, spécifiez un ou plusieurs ID matériels et compatibles correspondant à 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 général, un INF d’extension liste un ID matériel plus spécifique que le package de pilotes de base, avec pour objectif de spécialiser davantage une configuration de pilote spécifique. Par exemple, le package de pilotes de base pourrait utiliser un ID matériel PCI à deux parties, tandis que l’INF d’extension spécifie un ID matériel PCI à quatre parties, comme suit :
[DeviceExtensions.NTamd64] %Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX
Alternativement, l’INF d’extension pourrait lister le même ID matériel que le package de pilotes de base, par exemple si l’appareil est déjà spécifiquement ciblé, ou si le package de pilotes de base liste déjà l’ID matériel le plus spécifique.
Dans certains cas, l’INF d’extension pourrait fournir un ID d’appareil moins spécifique, comme un ID compatible, afin de personnaliser un paramètre pour un ensemble plus large d’appareils.
Le ciblage CHID peut être utilisé si un ID matériel à quatre parties n’est pas possible ou n’est pas assez restrictif.
Ne définissez pas de service avec
SPSVCINST_ASSOCSERVICE
. Un INF d’extension ne peut pas fournir un pilote fonctionnel pour un appareil. Cependant, un INF d’extension peut définir d’autres services, comme un pilote de filtre pour l’appareil. Pour plus d’informations sur la spécification des services, veuillez consulter la section Directive INF AddService.
Dans la plupart des cas, vous soumettrez un package de pilotes d’extension au Hardware Dev Center séparément du package de pilotes de base. Pour des exemples sur la façon de regrouper les INFs d’extension, et des liens vers du code d’exemple, consultez la section Exemple de package de pilotes conforme à DCH.
Le processus de validation et de soumission de pilotes est le même pour les INFs d’extension que pour les packages de pilotes de base. Pour plus d’informations, veuillez consulter la section Prise en main rapide de Windows HLK.
Désinstallation d’un pilote d’extension
Pour supprimer un package de pilotes d’extension du système et le désinstaller de tout appareil l’utilisant, 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.
Trouvez le nom oem<#>.inf du package de pilotes à désinstaller et utilisez pnputil /delete-driver oem<#>.inf /uninstall
.
pnputil /enum-drivers
peut être utilisé pour aider à identifier le nom oem<#>.inf approprié.
Exemple 1 : Utilisation d’un INF d’extension 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 constructeur de systèmes (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 suivant est un INF d’extension complet 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’un INF d’extension pour installer des logiciels supplémentaires
L’extrait suivant est un INF d’extension complet qui est inclus dans la section Trousse d’installation de packages de pilotes pour 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, veuillez consulter la section Utilisation d’un fichier INF de composant.
Pour accéder à ce fichier en ligne, veuillez consulter la section 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
Pour des informations sur la façon d’utiliser un INF d’extension pour installer un pilote de filtre, consultez la section Ordonnancement des pilotes de filtre d’appareil.
Pour améliorer l’extensibilité, nous recommandons à un IHV de placer des fonctionnalités optionnelles dans un modèle d’INF d’extension.
Compatibilité descendante
Tout changement apporté au package de pilotes de base doit être soigneusement testé pour s’assurer qu’il ne rompt pas la compatibilité avec les INFs d’extension existants.
Lors de la gestion d’un package de pilotes de base, suivez ces bonnes pratiques :
- Documentez les plages de valeurs des paramètres et les contraintes à la fois dans les commentaires de code et dans un document de conception. Les modifications futures doivent respecter les plages spécifiées.
- Pour prendre en charge de nouvelles plages, ajoutez un paramètre optionnel (sans valeur par défaut).
Soumission d’un INF d’extension pour certification
Pour des informations détaillées sur la façon de travailler avec les INFs d’extension dans le Hardware Dev Center, veuillez consulter la section Travailler avec les INFs d’extension dans le tableau de bord du Windows Hardware Dev Center.
Articles connexes
Travailler avec les INFs d’extension dans le Partner Center
Exemple de package de pilote conforme à la norme DCH
Utilisation d’un fichier INF universel
Commencez à développer des pilotes Windows
Kit d’installation de packages de pilotes pour pilotes universels