Verwenden einer Erweiterungs-INF-Datei
Vor Windows 10 wählte Windows ein einziges Treiberpaket zur Installation für ein bestimmtes Gerät aus. Dies führte zu großen, komplexen Treiberpaketen, die Code für alle Szenarien und Konfigurationen enthielten, und jedes Nebenupdate erforderte ein Update für das gesamte Treiberpaket. Ab Windows 10 können Sie die INF-Funktionalität in mehrere Komponenten aufteilen, von denen jede unabhängig gewartet werden kann. Das Haupttreiberpaket, das auf einem Gerät installiert wird, wird jetzt als Basistreiberpaket bezeichnet und wird vom System auf die gleiche Weise gehandhabt wie die Treiberpakete vor Windows 10. Um die Funktionalität eines Basistreiberpakets zu erweitern, stellen Sie eine Erweiterungs-INF in einem separaten Treiberpaket bereit. Eine Erweiterungs-INF:
Kann von einem anderen Unternehmen bereitgestellt und unabhängig von der Basis-INF aktualisiert werden.
Verwendet die gleiche INF-Syntax wie eine Basis-INF, kann aber die Basis-INF zur Anpassung oder Spezialisierung erweitern.
Erweitert den Wert des Geräts, ist aber nicht notwendig, damit das Basistreiberpaket funktioniert. Wenn die Erweiterungs-INF nicht vorhanden ist, muss das System in der Lage sein, nur mit dem Basistreiberpaket zu booten und sich mit dem Netzwerk zu verbinden. Im System erstellte Eingabegeräte, wie z. B. eine Tastatur, müssen ohne Erweiterungs-INFs zumindest mit den Grundfunktionen funktionieren.
Es muss eine universelle INF-Datei sein.
Für jedes Gerät muss ein Basistreiberpaket installiert sein, dem optional eine oder mehrere Erweiterungs-INFs zugeordnet sein können. Eine Erweiterungs-INF kann nicht auf einem Gerät installiert werden, wenn kein Basistreiberpaket vorhanden ist, das ebenfalls auf dem Gerät installiert werden kann.
Typische Szenarien, in denen Sie eine Erweiterungs-INF verwenden können, sind:
Ändern von Einstellungen, die in einem Basistreiberpaket enthalten sind, wie z.B . das Anpassen des Anzeigenamens des Geräts oder das Ändern einer Hardwarekonfigurationseinstellung.
Erstellen einer oder mehrerer Softwarekomponenten durch Angabe der INF-AddComponent-Direktive und Bereitstellung einer Komponenten-INF-Datei.
Festlegen von Einstellungen, die für das Modell oder den Formfaktor des Systems spezifisch sind und das Erlebnis oder die Funktionalität des Geräts verbessern, sodass z.B . Hardwarekalibrierungsdaten zur Verfügung stehen.
Hinzufügen eines Filtertreibers zum Gerätestack.
In den unten stehenden Beispielen finden Sie Code-Beispiele für einige dieser Szenarien. Lesen Sie auch Beispiel für ein DCH-konformes Treiberpaket, in dem beschrieben wird, wie das Beispiel DCHU-Universaltreiber-Erweiterungs-INFs verwendet.
Zusammenarbeit von Erweiterungs-INF und Basistreiberpaket
Während der Installation eines Geräts werden die Einstellungen in einer Erweiterungs-INF nach den Einstellungen in einem Basistreiberpaket angewendet. Wenn also eine Erweiterungs-INF und ein Basistreiberpaket die gleiche Einstellung festlegen, wird die Version in der Erweiterungs-INF angewendet. Wenn sich das Basistreiberpaket ändert, bleibt die Erweiterungs-INF bestehen und wird auf das neue Basistreiberpaket angewendet. Wenn mehrere Erweiterungs-INFs auf demselben Gerät installiert sind, gibt es keine vorgegebene Reihenfolge, in der die Erweiterungs-INFs angewandt werden, sodass eine Erweiterungs-INF nicht deterministisch Werte überschreiben kann, die von einer anderen Erweiterungs-INF bereitgestellt werden. Unterschiedliche Erweiterungs-INFs, die auf dieselben Geräte abzielen, sollten nicht versuchen, dieselben Einstellungen zu ändern.
Es ist hilfreich, Kommentare in das Basistreiberpaket aufzunehmen, in denen beschrieben wird, welche Einträge von einer Erweiterungs-INF überschrieben werden können, sowie die entsprechenden Parameterwertebereiche und Beschränkungen.
Angabe von ExtensionId
Wenn Sie eine Erweiterungs-INF schreiben, generieren Sie eine spezielle GUID namens ExtensionId, die ein Eintrag im Abschnitt [Version] der INF ist.
Das System identifiziert mögliche Erweiterungs-INFs für ein bestimmtes Gerät, indem es die Hardware-ID und die kompatiblen IDs des Geräts mit denen abgleicht, die in einer Erweiterungs-INF in einem Modelle-Abschnitt angegeben sind, der für dieses System gilt.
Unter allen möglichen Erweiterungs-INFs, die denselben ExtensionId-Wert angeben, wählt das System nur eine zur Installation aus und wendet deren Einstellungen anstelle derjenigen des Basistreiberpakets an. Das in der INF angegebene Treiberdatum und die Treiberversion werden in dieser Reihenfolge verwendet, um die einzelne INF zwischen mehreren Erweiterungs-INFs mit der gleichen ExtensionId auszuwählen.
Zur Veranschaulichung betrachten Sie das folgende Szenario mit einem hypothetischen Gerät, für das es drei Erweiterungs-INFs gibt:
Die ExtensionId-Werte {A}
und {B}
sind in geschweiften Klammern dargestellt, und der Rang jedes Basistreiberpakets wird in den Menübändern angezeigt.
Zunächst wählt das System das Basistreiberpaket mit dem besten Rang und der höchsten Version aus.
Als nächstes verarbeitet das System die verfügbaren Erweiterungs-INFs. Zwei haben den ExtensionId-Wert {B}
und eine hat den ExtensionId-Wert {A}
. Von den ersten beiden nehmen wir an, dass das Treiberdatum das gleiche ist. Das nächste Entscheidungskriterium ist die Treiberversion, also wählt das System die Erweiterungs-INF mit v2.0.
Die Erweiterung INF mit dem eindeutigen Wert ExtensionId wird ebenfalls ausgewählt. Das System wendet das Basistreiberpaket für das Gerät an und wendet dann die beiden Erweiterungs-INFs für dieses Gerät an.
Die Erweiterungs-INF-Dateien werden immer nach dem Basistreiberpaket angewendet, aber es gibt keine festgelegte Reihenfolge, in der die Erweiterungs-INFs angewendet werden.
Erstellen einer Erweiterungs-INF
Hier sind die Einträge, die Sie benötigen, um eine INF als Erweiterungs-INF zu definieren.
Geben Sie diese Werte für Class und ClassGuid im Abschnitt Version an. Weitere Informationen über Setup-Klassen finden Sie unter Systemdefinierte Klassen für die Einrichtung von Geräten, die Herstellern zur Verfügung stehen.
[Version] ... Class = Extension ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57} ...
Geben Sie einen ExtensionId-Eintrag im Abschnitt [Version] an. Generieren Sie eine neue GUID für die erste Version einer Erweiterungs-INF, oder verwenden Sie die letzte GUID für spätere Aktualisierungen der ersten Erweiterungs-INF.
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
Eine Organisation darf nur eine ExtensionID verwenden, die ihr selbst gehört. Informationen zur Registrierung einer Erweiterungs-ID finden Sie unter Verwaltung von Hardware-Übermittlungen im Dashboard des Windows Hardware Dev Centers.
Wenn Sie eine Erweiterungs-INF aktualisieren, behalten Sie die ExtensionId bei und erhöhen Sie die Version und das Datum, die in der Direktive DriverVer angegeben sind. Für einen bestimmten ExtensionId-Wert wählt PnP die INF mit der höchsten DriverVer aus.
Hinweis
Wenn Ihre Erweiterungs-INF auf Windows 10 S abzielt, finden Sie unter Treiberanforderungen für Windows 10 im S-Modus Informationen zur Treiberinstallation auf dieser Windows-Version.
Geben Sie im Abschnitt INF Models eine oder mehrere Hardware- und kompatible IDs an, die mit denen des Zielgeräts übereinstimmen. Diese Hardware- und kompatiblen IDs müssen nicht mit denen des Basistreiberpakets übereinstimmen. In der Regel listet eine Erweiterungs-INF eine spezifischere Hardware-ID auf als das Basistreiberpaket, um eine bestimmte Treiberkonfiguration weiter zu spezialisieren. Beispielsweise könnte das Basistreiberpaket eine zweiteilige PCI-Hardware-ID verwenden, während die Erweiterungs-INF eine vierteilige PCI-Hardware-ID angibt, wie im Folgenden dargestellt:
[DeviceExtensions.NTamd64] %Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX
Alternativ könnte die Erweiterungs-INF dieselbe Hardware-ID wie das Basistreiberpaket auflisten, zum Beispiel wenn das Gerät bereits eingegrenzt ist, oder wenn das Basistreiberpaket bereits die spezifischste Hardware-ID auflistet.
In einigen Fällen kann die Erweiterungs-INF eine weniger spezifische Geräte-ID angeben, z. B. eine kompatible ID, um eine Einstellung für eine größere Anzahl von Geräten festzulegen.
CHID targeting kann verwendet werden, wenn eine vierteilige Hardware-ID nicht möglich ist oder nicht restriktiv genug ist.
Definieren Sie einen Dienst nicht mit
SPSVCINST_ASSOCSERVICE
. Eine Erweiterung INF kann keinen Funktionstreiber für ein Gerät bereitstellen. Eine Erweiterungs-INF kann jedoch andere Dienste definieren, z. B. einen Filtertreiber für das Gerät. Weitere Informationen über die Angabe von Diensten finden Sie unter INF AddService-Direktive.
In den meisten Fällen werden Sie ein Erweiterungs-INF-Treiberpaket getrennt vom Basistreiberpaket an das Hardware Dev Center senden. Beispiele für das Packaging von Erweiterungs-INFs und Links zu Code-Beispielen finden Sie unter Beispiel für ein DCH-konformes Treiberpaket.
Der Prozess der Treibervalidierung und -übermittlung ist für Erweiterungs-INFs derselbe wie für Basistreiberpakete. Weitere Informationen finden Sie unter Windows-HLK: Erste Schritte.
Deinstallation eines Erweiterungstreibers
Um ein Erweiterungstreiber-Paket aus dem System zu entfernen und es von allen Geräten zu deinstallieren, die es verwenden, verwenden Sie den PnPUtil-Befehl delete-driver
mit dem Flag uninstall
. Dies bietet die Möglichkeit, das Erweiterungstreiberpaket von Geräten zu deinstallieren, ohne das Basistreiberpaket zu entfernen.
Suchen Sie den Namen oem<#>.inf des zu deinstallierenden Treiberpakets und verwenden Sie pnputil /delete-driver oem<#>.inf /uninstall
.
pnputil /enum-drivers
kann Ihnen helfen, den passenden oem<#>.inf Namen zu finden.
Beispiel 1: Verwendung einer Erweiterungs-INF zum Festlegen des Anzeigenamens für das Gerät
In einem gängigen Szenario stellt ein Gerätehersteller (IHV) ein Basistreiberpaket zur Verfügung, und ein Systemhersteller (OEM) stellt eine Erweiterungs-INF bereit, die die Konfiguration und die Einstellungen des Basistreiberpakets ergänzt und in einigen Fällen außer Kraft setzt. Der folgende Ausschnitt ist eine vollständige Erweiterungs-INF, die zeigt, wie Sie den Anzeigenamen für das Gerät festlegen.
[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"
Beispiel 2: Verwendung einer Erweiterungs-INF zur Installation zusätzlicher Software
Das folgende Snippet ist eine vollständige Erweiterungs-INF, die im Treiberpaket-Installations-Toolkit für universelle Treiber enthalten ist. Dieses Beispiel verwendet die Direktive INF AddComponent, um Komponenten zu erstellen, die einen Dienst und eine ausführbare Datei installieren. Weitere Informationen darüber, was Sie in einer Komponenten-INF tun können, finden Sie unter Verwenden einer Komponenten-INF-Datei.
Um online auf diese Datei zuzugreifen, lesen Sie 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
Informationen darüber, wie Sie eine Erweiterungs-INF zur Installation eines Filtertreibers verwenden, finden Sie unter Reihenfolge von Geräte-Filtertreibern.
Um die Erweiterbarkeit zu verbessern, empfehlen wir, dass ein IHV optionale Funktionen in eine Erweiterungs-INF-Vorlage packt.
Abwärtskompatibilität
Jede Änderung am Basistreiberpaket muss gründlich getestet werden, um sicherzustellen, dass sie die Abwärtskompatibilität für bestehende Erweiterungs-INFs nicht unterbricht.
Beachten Sie beim Management eines Basistreiberpakets die folgenden bewährten Verfahren:
- Dokumentieren Sie die Wertebereiche und Einschränkungen der Parameter sowohl in Code-Kommentaren als auch in einem Design-Dokument. Künftige Änderungen müssen mit den angegebenen Bereichen übereinstimmen.
- Um neue Bereiche zu unterstützen, fügen Sie einen optionalen Parameter hinzu (kein Standardwert).
Senden einer Erweiterungs-INF zur Zertifizierung
Ausführliche Informationen über die Arbeit mit Erweiterungs-INFs im Hardware Dev Center finden Sie unter Arbeiten mit Erweiterungs-INFs im Windows Hardware Dev Center Dashboard.
Verwandte Artikel
Arbeiten mit Erweiterungs-INFs im Partner Center
Beispiel für ein DCH-kompatibles Treiberpaket
Verwenden einer universellen INF-Datei