- Artikel
- 8Minuten Lesedauer
Vor Windows 10 hat Windows ein einzelnes Treiberpaket ausgewählt, das für ein bestimmtes Gerät installiert werden soll. Dies führte zu großen, komplexen Treiberpaketen, die Code für alle Szenarien und Konfigurationen enthalten, 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 dienstbar sein kann. Das auf einem Gerät installierte Kerntreiberpaket wird jetzt als Basistreiberpaket bezeichnet und wird vom System auf die gleiche Weise behandelt, wie Treiberpakete vor Windows 10 behandelt wurden. Um die Funktionalität eines Basistreiberpakets zu erweitern, stellen Sie eine Erweiterung 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 dieselbe INF-Syntax wie eine Basis-INF, kann jedoch die Basis-INF für Anpassungen oder Spezialisierung erweitern.
- Verbessert den Wert des Geräts, ist jedoch nicht erforderlich, damit das Basistreiberpaket funktioniert. Ohne die ErweiterungS-INF muss das System in der Lage sein, mit nur dem Basistreiberpaket eine Verbindung mit dem Netzwerk herzustellen und eine Verbindung mit dem Netzwerk herzustellen. Eingabegeräte, die in das System integriert sind, z. B. eine Tastatur, müssen mit mindestens grundlegenden Funktionen ohne Erweiterungs-INFs funktionieren können.
- Muss eine universelle INF-Datei sein.
Jedes Gerät muss über ein Basistreiberpaket verfügen, das darauf installiert ist, und kann optional eine oder mehrere Erweiterungs-INFs zugeordnet sein. Eine ErweiterungS-INF kann nicht auf einem Gerät installiert werden, wenn kein Basistreiberpaket vorhanden ist, das auch auf dem Gerät installiert werden soll.
Typische Szenarien, in denen Sie möglicherweise eine Erweiterung INF verwenden können:
- Ändern von Einstellungen in einem Basistreiberpaket, z. B. Anpassen des Anzeigenamens des Geräts oder Ändern einer Hardwarekonfigurationseinstellung.
- Erstellen Sie eine oder mehrere Softwarekomponenten, indem Sie die INF-AddComponent-Direktive angeben und eine INF-Komponente bereitstellen.
- Bereitstellen von Einstellungen, die für das Modell oder den Formfaktor des Systems spezifisch sind, die die Erfahrung oder Funktionalität des Geräts verbessern, z. B. Hardwarekalibrierungsdaten.
- Hinzufügen eines Filtertreibers zum Gerätestapel.
Sie finden Beispielcode für einige dieser Szenarien in den folgenden Beispielen. Siehe auch DCH-kompatibles Treiberpaketbeispiel, das beschreibt, wie das Universelle DCHU-Treiberbeispiel ErweiterungS-INFs verwendet.
Zusammenarbeit von ErweiterungS-INF- und Basistreiberpaketen
Während einer Geräteinstallation werden Einstellungen in einer ErweiterungS-INF nach Einstellungen in einem Basistreiberpaket angewendet. Wenn daher eine Erweiterung INF und ein Basistreiberpaket dieselbe Einstellung angeben, wird die Version in der Erweiterung INF angewendet. Wenn sich das Basistreiberpaket ändert, bleibt die Erweiterung INF erhalten und wird über das neue Basistreiberpaket angewendet. Wenn mehrere Erweiterungs-INFs auf demselben Gerät installiert sind, gibt es keine vordefinierte Reihenfolge, in der die ErweiterungS-INFs angewendet werden, sodass eine Erweiterung INF keine deterministischen Werte außer Kraft setzen kann, die von einer anderen Erweiterung INF bereitgestellt werden. Eindeutige Erweiterungs-INFs, die auf dieselben Geräte ausgerichtet sind, sollten nicht versuchen, die gleichen Einstellungen zu ändern.
Es ist hilfreich, Kommentare in das Basistreiberpaket einzuschließen, das beschreibt, welche Einträge von einer Erweiterung INF außer Kraft gesetzt werden können, sowie anwendbare Parameterwertbereiche und Einschränkungen.
Angeben von ExtensionId
Wenn Sie eine Erweiterung INF schreiben, generieren Sie eine spezielle GUID namens ExtensionId, die ein Eintrag im Abschnitt [Version] des INF ist.
Das System identifiziert mögliche Erweiterungs-INFs für ein bestimmtes Gerät, indem die Hardware-ID und kompatible IDs des Geräts mit denen übereinstimmen, die in einer ErweiterungS-INF in einem Abschnitt "Modelle " angegeben sind, der für dieses System gilt.
Unter allen möglichen Erweiterungs-INFs, die denselben ExtensionId-Wert angeben, wählt das System nur einen aus, um die Einstellungen für das Basistreiberpaket zu installieren und anzuwenden. Das in der INF angegebene Treiberdatum und treiberversion werden in dieser Reihenfolge verwendet, um den einzelnen INF zwischen mehreren Erweiterungs-INFs mit derselben ExtensionId auszuwählen.
Betrachten Sie zum Veranschaulichen des folgenden Szenarios ein hypothetisches Gerät, für das drei Erweiterungs-INFs vorhanden sind:
Die ExtensionId-Werte{A}
und {B}
werden in geschweiften Klammern angezeigt, und der Rang jedes Basistreiberpakets wird im Bannerband angezeigt.
Zuerst wählt das System das Basistreiberpaket mit der besten Rang- und höchsten Version aus.
Als Nächstes verarbeitet das System die verfügbaren Erweiterungs-INFs. Zwei weisen den ExtensionId-Wert{B}
auf, und eine hat den ExtensionId-Wert{A}
. Aus den ersten beiden sagen wir, dass das Treiberdatum identisch ist. Der nächste Tiebreaker ist treiberversion, sodass das System die Erweiterung INF mit v2.0 auswählt.
Die Erweiterung INF mit dem eindeutigen ExtensionId-Wert ist 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.
Beachten Sie, dass Erweiterungs-INF-Dateien immer nach dem Basistreiberpaket angewendet werden, aber es gibt keine bestimmte Reihenfolge, in der die ErweiterungS-INFs angewendet werden.
Erstellen einer Erweiterung INF
Hier sind die Einträge, die Sie als ErweiterungS-INF definieren müssen.
Geben Sie diese Werte für Class and ClassGuid im Abschnitt "Version " an. Weitere Informationen zu Setupklassen finden Sie unter System-Defined Device Setup Classes Available to Vendors.
[Version]...Class = ExtensionClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Geben Sie einen ExtensionId-Eintrag im Abschnitt [Version] an. Generieren Sie eine neue GUID für die ursprüngliche Version einer Erweiterung INF, oder verwenden Sie die letzte GUID für nachfolgende Updates der anfänglichen Erweiterung INF.
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
Beachten Sie, dass eine Organisation möglicherweise nur eine Erweiterungs-ID verwendet, die sie besitzt. Informationen zum Registrieren einer Erweiterungs-ID finden Sie unter Verwalten von Hardwareübermittlungen im Windows Hardware Dev Center-Dashboard.
- Wenn Sie eine ErweiterungS-INF aktualisieren, behalten Sie die ExtensionId gleich, und erhöhen Sie die version und das datum, das durch die DriverVer-Direktive angegeben wird. Für einen bestimmten ExtensionId-Wert wählt PnP den INF mit dem höchsten DriverVer aus.
Hinweis
Wenn Ihre Erweiterung INF auf Windows 10 S ausgerichtet ist, lesen Sie Windows 10 in den S-Modus-Treiberanforderungen informationen zur Treiberinstallation in dieser Windows-Version.
Geben Sie im Abschnitt INF-Modelle mindestens eine Hardware- und kompatible IDs an, die mit denen des Zielgeräts übereinstimmen. Beachten Sie, dass diese Hardware- und kompatiblen IDs nicht mit denen des Basistreiberpakets übereinstimmen müssen. In der Regel listet eine Erweiterung INF eine spezifischere Hardware-ID als das Basistreiberpaket auf, wobei das Ziel besteht, eine bestimmte Treiberkonfiguration weiter zu spezialisieren. Beispielsweise kann das Basistreiberpaket eine zweiteilige PCI-Hardware-ID verwenden, während die Erweiterung INF eine vierteilige PCI-Hardware-ID angibt, wie folgt:
[DeviceExtensions.NTamd64]%Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX
Alternativ kann die Erweiterung INF die gleiche Hardware-ID wie das Basistreiberpaket auflisten, z. B. wenn das Gerät bereits sehr eng ausgerichtet ist oder wenn das Basistreiberpaket bereits die spezifische Hardware-ID enthält.
In einigen Fällen kann die Erweiterung INF eine weniger spezifische Geräte-ID wie eine kompatible ID bereitstellen, um eine Einstellung über eine breitere Gruppe von Geräten anzupassen.
DIE CHID-Zielbestimmung kann verwendet werden, wenn eine vierteilige Hardware-ID nicht möglich ist oder nicht restriktiv genug ist.
Definieren Sie keinen Dienst mit
SPSVCINST_ASSOCSERVICE
. Eine ErweiterungS-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 zum Angeben von Diensten finden Sie in der INF-AddService-Richtlinie.
In den meisten Fällen übermitteln Sie ein Erweiterungs-INF-Treiberpaket separat vom Basistreiberpaket an das Hardware Dev Center. Beispiele zum Verpacken von Erweiterungs-INFs sowie Links zu Beispielcode finden Sie unter DCH-kompatibles Treiberpaketbeispiel.
Der Treiberüberprüfungs- und Übermittlungsprozess entspricht für Erweiterungs-INFs wie für Basistreiberpakete. Weitere Informationen finden Sie unter Windows HLK Erste Schritte.
Deinstallieren eines Erweiterungstreibers
Um ein Erweiterungstreiberpaket aus dem System zu entfernen und von allen Geräten zu deinstallieren, die es verwenden, verwenden Sie den Befehl PnPUtildelete-driver
mit dem uninstall
Flag. Dadurch kann das Erweiterungstreiberpaket von Geräten deinstalliert werden, ohne das Basistreiberpaket zu entfernen.
Suchen Sie den oem<#>.inf-Namen des Treiberpakets, um das Treiberpaket zu deinstallieren und zu verwenden pnputil /delete-driver oem<#>.inf /uninstall
.
pnputil /enum-drivers
kann verwendet werden, um den entsprechenden oem<#>.inf-Namen zu identifizieren.
Beispiel 1: Verwenden einer Erweiterung INF zum Festlegen des Anzeigenamens des Geräts
In einem gängigen Szenario stellt ein Gerätehersteller (IHV) ein Basistreiberpaket bereit, und dann stellt ein System-Generator (OEM) eine Erweiterung INF bereit, die die Konfiguration und Einstellungen des Basistreiberpakets ergänzt und in einigen Fällen außer Kraft setzt. Der folgende Codeausschnitt ist eine vollständige Erweiterung INF, die zeigt, wie der Gerätefreundlichkeitsname festgelegt wird.
[Version]Signature = "$WINDOWS NT$"Class = ExtensionClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}Provider = %CONTOSO%ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUIDDriverVer = 05/28/2013,1.0.0.0CatalogFile = delta.catPnpLockdown = 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: Verwenden einer Erweiterung INF zum Installieren zusätzlicher Software
Der folgende Codeausschnitt ist eine vollständige Erweiterung INF, die im Treiberpaketinstallations-Toolkit für universelle Treiber enthalten ist. In diesem Beispiel wird die INF AddComponent-Direktive verwendet, um Komponenten zu erstellen, die einen Dienst und eine ausführbare Datei installieren. Weitere Informationen dazu, was Sie in einer Komponenten-INF tun können, finden Sie unter Verwenden einer Komponenten-INF-Datei.
Informationen zum Onlinezugriff auf diese Datei finden Sie unter 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 = ExtensionClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}Provider = %ManufacturerName%ExtensionId = {3846ad8c-dd27-433d-ab89-453654cd542a}CatalogFile = osrfx2_DCHU_extension.catDriverVer = 05/16/2017,15.14.36.721[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_AddRegAddReg = 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_ComponentInstallAddComponent = 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 = 0x00020000FLG_ADDREG_KEYONLY = 0x00000010
Informationen zur Verwendung einer Erweiterungs-INF zum Installieren eines Filtertreibers finden Sie unter "Bestellung des Gerätefiltertreibers".
Um die Erweiterbarkeit zu verbessern, empfehlen wir, dass eine IHV optionale Funktionalität in einer ErweiterungS-INF-Vorlage platziert.
Abwärtskompatibilität
Jede Änderung des Basistreiberpakets muss gründlich getestet werden, um sicherzustellen, dass die Abwärtskompatibilität für vorhandene Erweiterungs-INFs nicht abgebrochen wird.
Befolgen Sie beim Verwalten eines Basistreiberpakets die folgenden bewährten Methoden:
- Dokumentparameterwertbereiche und Einschränkungen sowohl in Codekommentaren als auch in einem Entwurfsdokument. Zukünftige Änderungen müssen den angegebenen Bereichen entsprechen.
- Um neue Bereiche zu unterstützen, fügen Sie einen optionalen Parameter (kein Standardwert) hinzu.
Übermitteln einer Erweiterung INF zur Zertifizierung
Ausführliche Informationen zum Arbeiten mit Erweiterungs-INFs im Hardware Dev Center finden Sie unter "Arbeiten mit Erweiterungs-INFs" im Windows Hardware Dev Center-Dashboard.
- Arbeiten mit Erweiterungs-INFs im Partner Center
- Beispiel für DCH-kompatibles Treiberpaket
- Verwenden einer universellen INF-Datei
- Erste Schritte mit Windows-Treibern
- Treiberpaketinstallations-Toolkit für universelle Treiber