Freigeben über


Verwenden einer Erweiterungs-INF-Datei

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 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 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 Erweiterungs-INF in einem separaten Treiberpaket bereit. Eine Erweiterung INF:

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

  • Verwendet dieselbe INF-Syntax wie eine Basis-INF, kann aber die Basis-INF für Anpassungen oder Spezialisierung erweitern.

  • Verbessert den Wert des Geräts, ist jedoch nicht erforderlich, damit das Basistreiberpaket funktioniert. Wenn die Erweiterung INF nicht vorhanden ist, muss das System in der Lage sein, mit nur 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 mit mindestens grundlegenden Funktionen ohne Erweiterungs-INFs funktionieren können.

  • Muss eine universelle INF-Datei sein.

Auf jedem Gerät muss ein Basistreiberpaket installiert sein und optional eine oder mehrere Erweiterungs-INFs zugeordnet sein. Eine Erweiterung INF kann nicht auf einem Gerät 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, umfassen:

  • Ä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.

In den folgenden Beispielen finden Sie Beispielcode für einige dieser Szenarien. Siehe auch DCH-kompatibles Treiberpaketbeispiel, in dem beschrieben wird, wie das Universelle DCHU-Treiberbeispiel ErweiterungS-INFs verwendet.

Zusammenarbeit des Erweiterungs-INF- und Basistreiberpakets

Während einer Geräteinstallation werden Einstellungen in einer Erweiterung 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 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 keine deterministischen Werte außer Kraft setzen kann, die von einer anderen Erweiterung INF bereitgestellt werden. Unterschiedliche Erweiterungs-INFs, die auf dieselben Geräte ausgerichtet sind, sollten nicht versuchen, dieselben Einstellungen zu ändern.

Es ist hilfreich, Kommentare in das Basistreiberpaket einzuschließen, das beschreibt, 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] von INF handelt.

Das System identifiziert mögliche Erweiterungs-INFs für ein bestimmtes Gerät, indem er die Hardware-ID und kompatible IDs des Geräts mit denen übereinstimmt, die in einer Erweiterung 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 für die Installation aus und wendet seine Einstellungen auf die des Basistreiberpakets an. 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 das folgende Szenario, das ein hypothetisches Gerät enthält, für das drei Erweiterungs-INFs vorhanden sind:

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 Banner-Menübändern angezeigt.

Zuerst wählt das System das Basistreiberpaket mit der besten Rangfolge und der 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}. Nehmen wir an, dass das Treiberdatum von den ersten beiden 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.

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

Erstellen einer Erweiterung INF

Hier sind die Einträge, die Sie zum Definieren einer INF-Erweiterung als Erweiterung INF benötigen.

  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 Lieferanten verfügbar sind.

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. 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 ursprünglichen Erweiterung INF.

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

Eine Organisation darf nur eine Erweiterungs-ID verwenden, die sie besitzt. Informationen zum Registrieren einer Erweiterungs-ID finden Sie unter Verwalten von Hardwareübermittlungen im Windows Hardware Dev Center-Dashboard.

  1. Wenn Sie eine Erweiterungs-INF aktualisieren, behalten Sie die ExtensionId unverändert bei, und erhöhen Sie die durch die DriverVer-Direktive angegebene Version und das angegebene Datum. 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, finden Sie informationen zur Treiberinstallation in dieser Version von Windows unter Windows 10 unter Windows 10 im S-Modus treiberanforderungen .

  2. Geben Sie im Abschnitt INF-Modelle 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 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 angibt, z. B. folgendes:

    [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 eng ausgerichtet ist oder das Basistreiberpaket bereits die spezifische Hardware-ID auflistet.

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

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

  3. 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 unter INF-AddService-Direktive.

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

Der Treiberüberprüfungs- und Übermittlungsprozess ist für Erweiterungs-INFs identisch wie für Basistreiberpakete. Weitere Informationen finden Sie unter Windows HLK Getting Started.

Deinstallieren eines Erweiterungstreibers

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

Suchen Sie den oem<#>.inf-Namen des Treiberpakets, um es 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 INF-Datei für Komponenten.

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 einer Erweiterungs-INF zum Installieren eines Filtertreibers finden Sie unter "Sortierung 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

Alle Änderungen am Basistreiberpaket müssen 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 hinzu (kein Standardwert).

Ü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