Verwenden einer Extension INF-Datei

Vor Windows 10 hat Windows ein einzelnes Treiberpaket für die Installation für ein bestimmtes Gerät ausgewählt. Dies führte zu großen, komplexen Treiberpaketen, die Code für alle Szenarien und Konfigurationen enthielten, und jedes kleinere Update erforderte eine Aktualisierung des gesamten Treiberpakets. Ab Windows 10 können Sie die INF-Funktionalität in mehrere Komponenten aufteilen, die jeweils unabhängig voneinander gewartet werden können. Das auf einem Gerät installierte Kerntreiberpaket wird jetzt als Basistreiberpaket bezeichnet und vom System genauso 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. Ein Erweiterungs-INF:

  • Kann von einem anderen Unternehmen bereitgestellt und unabhängig vom Basis-INF aktualisiert werden.

  • Verwendet die gleiche INF-Syntax wie ein Basis-INF, kann aber den Basis-INF für Anpassungen oder Spezialisierungen erweitern.

  • Verbessert den Wert des Geräts, ist aber nicht erforderlich, damit das Basistreiberpaket funktioniert. Wenn die Erweiterung INF nicht vorhanden ist, muss das System in der Lage sein, nur mit dem Basistreiberpaket zu starten und eine Verbindung mit dem Netzwerk herzustellen. Eingabegeräte, die in das System integriert sind, z. B. eine Tastatur, müssen ohne Erweiterungs-INFs mit mindestens grundlegenden Funktionen funktionieren können.

  • Muss eine universelle INF-Datei sein.

Auf jedem Gerät muss ein Basistreiberpaket installiert sein, und es kann optional ein oder mehrere Erweiterungs-INFs zugeordnet sein. Eine Erweiterungs-INF kann auf einem Gerät nicht installiert werden, wenn kein Basistreiberpaket vorhanden ist, das auch auf dem Gerät installiert werden kann.

Typische Szenarien, in denen Sie eine Erweiterung INF verwenden können, sind:

  • Ändern von Einstellungen, die in einem Basistreiberpaket bereitgestellt werden, z. B. anpassen des Anzeigenamens des Geräts oder Ändern einer Hardwarekonfigurationseinstellung.

  • Erstellen einer oder mehrerer Softwarekomponenten durch Angeben der INF AddComponent-Direktive und Bereitstellen einer Komponenten-INF-Datei.

  • Bereitstellung spezifischer Einstellungen für das Modell oder den Formfaktor des Systems, die die Benutzeroberfläche oder Funktionalität des Geräts verbessern, z. B. Hardwarekalibrierungsdaten.

  • Hinzufügen eines Filtertreibers zum Gerätestapel.

Beispielcode für einige dieser Szenarien finden Sie in den folgenden Beispielen. Siehe auch DCH-kompatibles Treiberpaketbeispiel, in dem beschrieben wird, wie das Beispiel für den universellen DCHU-Treiber Erweiterungs-INFs verwendet.

Zusammenarbeit von Erweiterungs-INF und Basistreiberpaket

Während einer Geräteinstallation werden Einstellungen in einer Erweiterung INF nach Einstellungen in einem Basistreiberpaket angewendet. Wenn also 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 unverändert und wird auf 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 Erweiterungs-INF nicht deterministisch Werte außer Kraft setzen kann, die von einer anderen Erweiterung 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 dem beschrieben wird, welche Einträge von einer Erweiterung INF überschrieben 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, bei der es sich um einen Eintrag im Abschnitt [Version] des INF handelt.

Das System identifiziert mögliche Erweiterungs-INFs für ein bestimmtes Gerät, indem die Hardware-ID und die kompatiblen IDs des Geräts mit den in einer Erweiterungs-INF in einem Abschnitt Modelle angegebenen übereinstimmen, der für dieses System gilt.

Unter allen möglichen Erweiterungs-INFs, die denselben ExtensionId-Wert angeben, wählt das System nur einen aus, der installiert werden soll, und wendet seine Einstellungen auf die des Basistreiberpakets an. Das im INF angegebene Treiberdatum und die Treiberversion werden in dieser Reihenfolge verwendet, um den einzelnen INF zwischen mehreren Erweiterungs-INFs mit derselben ExtensionId auszuwählen.

Betrachten Sie zur Veranschaulichung das folgende Szenario, das ein hypothetisches Gerät enthält, für das es drei Erweiterungs-INFs gibt:

Diagramm, das zeigt, wie Basis-INF und Erweiterungs-INFs ausgewählt werden.

Die ExtensionId-Werte{A} und {B} werden in geschweiften Klammern angezeigt, und der Rang jedes Basistreiberpakets wird in den Bannerbä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 den ExtensionId-Wert{A}. Nehmen wir von den ersten beiden an, dass das Treiberdatum identisch ist. Der nächste Tiebreaker ist die 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.

Erweiterungs-INF-Dateien werden immer nach dem Basistreiberpaket angewendet, aber es gibt keine bestimmte Reihenfolge, in der die Erweiterung INFs angewendet werden.

Erstellen eines Erweiterungs-INF

Hier sind die Einträge, die Sie benötigen, um einen INF als Erweiterung INF zu definieren.

  1. Geben Sie diese Werte für Class und ClassGuid im Abschnitt Version an. Weitere Informationen zu Setupklassen finden Sie unter Systemdefinierte Gerätesetupklassen, die für Anbieter verfügbar sind.

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. Geben Sie im Abschnitt [Version] einen ExtensionId-Eintrag an. Generieren Sie eine neue GUID für die erste Version einer Erweiterung INF, oder verwenden Sie die letzte GUID für nachfolgende Updates der anfänglichen Erweiterung INF wieder.

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

Ein organization darf nur eine ExtensionID verwenden, die ihr gehört. Informationen zum Registrieren einer Erweiterungs-ID finden Sie unter Verwalten von Hardwareübermittlungen im Windows Hardware Dev Center-Dashboard.

  1. Wenn Sie eine Erweiterung INF aktualisieren, behalten Sie die ExtensionId unverändert, und erhöhen Sie die Version und das Datum, die von der DriverVer-Direktive angegeben werden. 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 abzielt, finden Sie informationen zur Treiberinstallation unter Windows 10 in S-Modus-Treiberanforderungen.

  2. Geben Sie im Abschnitt INF-Modelle mindestens eine Hardware und kompatible IDs an, die denen des Zielgeräts entsprechen. Diese Hardware- und kompatiblen IDs müssen nicht mit denen des Basistreiberpakets übereinstimmen. In der Regel listet eine Erweiterung INF eine spezifischere Hardware-ID als das Basistreiberpaket auf, mit dem Ziel, 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 wie folgt angibt:

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

    Alternativ kann die Erweiterung INF dieselbe Hardware-ID wie das Basistreiberpaket für instance auflisten, wenn das Gerät bereits eng anvisiert ist oder wenn das Basistreiberpaket bereits die spezifischste Hardware-ID auflistet.

    In einigen Fällen kann die Erweiterung INF eine weniger spezifische Geräte-ID bereitstellen, z. B. eine kompatible ID, um eine Einstellung für eine breitere Gruppe von Geräten anzupassen.

    CHID-Targeting kann verwendet werden, wenn eine vierteilige Hardware-ID nicht möglich oder nicht restriktiv genug ist.

  3. Definieren Sie keinen Dienst mit SPSVCINST_ASSOCSERVICE. Ein Erweiterungs-INF kann keinen Funktionstreiber für ein Gerät bereitstellen. Eine Erweiterung INF kann jedoch andere Dienste definieren, z. B. einen Filtertreiber für das Gerät. Weitere Informationen zum Angeben von Diensten finden Sie unter INF AddService-Direktive.

In den meisten Fällen übermitteln Sie ein Erweiterungs-INF-Treiberpaket getrennt vom Basistreiberpaket an das Hardware Dev Center. Beispiele zum Packen von Erweiterungs-INFs und Links zu Beispielcode finden Sie unter DCH-kompatibles Treiberpaketbeispiel.

Der Überprüfungs- und Übermittlungsprozess des Treibers ist für Erweiterungs-INFs identisch mit basisbasierten Treiberpaketen. Weitere Informationen finden Sie unter Windows HLK Erste Schritte.

Deinstallieren eines Erweiterungstreibers

Verwenden Sie den PnPUtil-Befehl mit dem Flag, um ein Erweiterungstreiberpaket delete-driver aus dem System zu entfernen und es von allen Geräten zu deinstallieren, die uninstall es verwenden. Dadurch kann das Erweiterungstreiberpaket von Geräten deinstalliert werden, ohne das Basistreiberpaket zu entfernen.

Suchen Sie den oem<#>.inf-Namen des Treiberpakets, um 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 Anzeigename des Geräts festgelegt wird.

[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: 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       = 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 zur Verwendung eines Erweiterungs-INF zum Installieren eines Filtertreibers finden Sie unter Bestellung von Gerätefiltertreibern.

Um die Erweiterbarkeit zu verbessern, wird empfohlen, dass ein IHV optionale Funktionen in eine Erweiterungs-INF-Vorlage einbindet.

Abwärtskompatibilität

Jede Änderung am Basistreiberpaket muss gründlich getestet werden, um sicherzustellen, dass die Abwärtskompatibilität für vorhandene Erweiterungs-INFs nicht beeinträchtigt 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 eines Erweiterungs-INF für die 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

DCH-kompatibles Treiberpaketbeispiel

Verwenden einer universellen INF-Datei

Erste Schritte mit Windows-Treibern

Treiberpaketinstallations-Toolkit für universelle Treiber