Udostępnij za pośrednictwem


Używanie pliku INF dla rozszerzenia

Przed systemem Windows 10 system Windows wybrał pojedynczy pakiet sterowników do zainstalowania dla danego urządzenia. Spowodowało to duże, złożone pakiety sterowników, które zawierały kod dla wszystkich scenariuszy i konfiguracji, a każda aktualizacja pomocnicza wymagała aktualizacji całego pakietu sterowników. Począwszy od systemu Windows 10, można podzielić funkcje INF na wiele składników, z których każda może być obsługiwana niezależnie. Podstawowy pakiet sterowników zainstalowany na urządzeniu jest teraz nazywany pakietem sterowników podstawowych i jest obsługiwany przez system w taki sam sposób, jak pakiety sterowników obsługiwane przed systemem Windows 10. Aby rozszerzyć funkcjonalność podstawowego pakietu sterowników, podaj rozszerzenie INF w osobnym pakiecie sterowników. Rozszerzenie INF:

  • Może być dostarczana przez inną firmę i aktualizowana niezależnie od podstawowego INF.

  • Używa tej samej składni INF co podstawowa funkcja INF, ale może rozszerzyć podstawową funkcję INF na potrzeby dostosowywania lub specjalizacji.

  • Zwiększa wartość urządzenia, ale nie jest niezbędne do działania pakietu sterowników podstawowych. W przypadku braku rozszerzenia INF system musi mieć możliwość rozruchu i połączenia z siecią przy użyciu tylko podstawowego pakietu sterowników. Urządzenia wejściowe wbudowane w system, takie jak klawiatura, muszą być w stanie działać z co najmniej podstawową funkcjonalnością bez żadnych rozszerzeń INFs.

  • Musi być plikiem INF uniwersalnym.

Każde urządzenie musi mieć zainstalowany jeden podstawowy pakiet sterowników i opcjonalnie może mieć co najmniej jeden plik INF rozszerzenia skojarzony z nim. Rozszerzenie INF nie będzie mogło zostać zainstalowane na urządzeniu, jeśli najpierw nie zostanie zainstalowany podstawowy pakiet sterowników.

Typowe scenariusze, w których można użyć rozszerzenia INF, obejmują:

  • Modyfikowanie ustawień dostępnych w pakiecie sterowników podstawowych, takich jak dostosowywanie przyjaznej nazwy urządzenia lub modyfikowanie ustawienia konfiguracji sprzętu.

  • Utworzenie co najmniej jednego składnika oprogramowania przez określenie dyrektywy INF AddComponent i dostarczenie pliku INF składnika .

  • Zapewnienie ustawień specyficznych dla modelu lub formy czynnika systemu, które poprawiają wrażenia lub funkcjonalność urządzenia, takie jak dane kalibracji sprzętu.

  • Dodawanie sterownika filtra do stosu urządzenia.

Przykładowy kod dla niektórych z tych scenariuszy można znaleźć w poniższych przykładach. Zobacz również DCH-Compliant Driver Package Example, który opisuje, jak przykładowy uniwersalny sterownik DCHU używa rozszerzeń INFs.

Jak rozszerzenie INF i podstawowy pakiet sterowników współpracują ze sobą

Podczas instalacji urządzenia ustawienia w rozszerzeniu INF są stosowane po ustawieniach w podstawowym pakiecie sterowników. W związku z tym jeśli rozszerzenie INF i podstawowy pakiet sterowników określi to samo ustawienie, zostanie zastosowana wersja rozszerzenia INF. Podobnie, jeśli pakiet sterowników podstawowych zmieni się, rozszerzenie INF pozostanie i zostanie zastosowane w nowym podstawowym pakiecie sterowników. Jeśli na tym samym urządzeniu jest zainstalowanych wiele rozszerzeń INF, nie ma wstępnie ustalonej kolejności, w której zostaną zastosowane rozszerzenia INF, więc jedno rozszerzenie INF nie może deterministycznie zastąpić wartości dostarczonych przez innego rozszerzenia INF. Oddzielne pliki INF rozszerzeń skierowane na te same urządzenia nie powinny próbować zmieniać tych samych parametrów.

Warto uwzględnić komentarze w pakiecie sterowników podstawowych opisujących, które wpisy mogą być zastępowane przez rozszerzenie INF, a także odpowiednie zakresy wartości parametrów i ograniczenia.

Określanie identyfikatora ExtensionId

Podczas pisania rozszerzenia INF wygenerujesz specjalny identyfikator GUID o nazwie ExtensionId, który jest wpisem w sekcji INF [Wersja].

System identyfikuje możliwe rozszerzenia plików INF dla określonego urządzenia, dopasowując identyfikator sprzętu oraz zgodne identyfikatory urządzenia do tych określonych w rozszerzeniu pliku INF w sekcji Models, która ma zastosowanie do tego systemu.

Wśród wszystkich możliwych rozszerzeń INFs, które określają tę samą wartość ExtensionId, system wybiera tylko jeden do zainstalowania i stosuje jego ustawienia względem pakietu sterowników podstawowych. Data sterownika i wersja sterownika określona w INF są używane w tej kolejności, aby wybrać jeden INF między wieloma plikami INF rozszerzenia o tym samym identyfikatorze rozszerzenia ExtensionId.

Aby zilustrować, rozważmy następujący scenariusz obejmujący hipotetyczne urządzenie, dla którego istnieją trzy rozszerzenia INF:

Diagram przedstawiający sposób wybierania podstawowych funkcji INF i rozszerzeń INF.

Wartości ExtensionId{A} i {B} są wyświetlane w nawiasach klamrowych, a każdy podstawowy pakiet sterowników rangi jest wyświetlany na wstążkach baneru.

Najpierw system wybiera podstawowy pakiet sterowników z najlepszą klasyfikacją i najwyższą wersją.

Następnie system przetwarza dostępne rozszerzenia INFs. Dwie mają wartość ExtensionId{B}, a jedna ma wartość ExtensionId{A}. Z dwóch pierwszych powiedzmy, że data sterownika jest taka sama. Następnym tiebreakerem jest wersja sterownika, więc system wybiera rozszerzenie INF z wersją 2.0.

Wybrano również rozszerzenie INF z unikatową wartością ExtensionId. System aplikuje podstawowy pakiet sterowników dla urządzenia, a następnie aplikuje dwa rozszerzenia INF dla tego urządzenia.

Pliki INF rozszerzeń są zawsze stosowane po podstawowym pakiecie sterowników, ale nie ma ustalonej kolejności, w której pliki INF rozszerzeń są aplikowane.

Tworzenie rozszerzenia INF

Poniżej przedstawiono wpisy, które należy zdefiniować jako INF rozszerzenia INF.

  1. Określ te wartości dla Class i ClassGuid w wersji sekcji. Aby uzyskać więcej informacji na temat klas konfiguracji, zobacz System-Defined Klasy konfiguracji urządzeń dostępne dla dostawców.

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. Podaj wpis ExtensionId w sekcji [Wersja]. Wygeneruj nowy identyfikator GUID dla początkowej wersji rozszerzenia INF lub użyj ponownie ostatniego identyfikatora GUID dla kolejnych aktualizacji początkowego rozszerzenia INF.

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

Organizacja może używać tylko ExtensionID, którego jest właścicielem. Aby uzyskać informacje na temat rejestrowania identyfikatora rozszerzenia, zobacz Zarządzanie przesyłaniem sprzętu w panelu Centrum deweloperów sprzętu dla systemu Windows.

  1. Jeśli aktualizujesz rozszerzenie INF, zachowaj ExtensionId taki sam i zwiększ wersję oraz datę określonej przez dyrektywę DriverVer. PnP wybiera plik INF z najwyższym DriverVerdla danej wartości ExtensionId.

    Notatka

    Jeśli rozszerzenie INF jest przeznaczone dla systemu Windows 10 S, zobacz Windows 10 w trybie S Wymagania dotyczące sterowników, aby uzyskać informacje o instalacji sterowników w tej wersji systemu Windows.

  2. W sekcji modele INFokreśl jeden lub więcej identyfikatorów sprzętu i zgodności pasujących do identyfikatorów urządzenia docelowego. Te identyfikatory sprzętowe i zgodne nie muszą być zgodne z identyfikatorami podstawowego pakietu sterowników. Zazwyczaj rozszerzenie INF zawiera bardziej szczegółowy identyfikator sprzętu niż podstawowy pakiet sterowników, w celu dalszego dostosowania określonej konfiguracji sterownika. Na przykład podstawowy pakiet sterowników może używać dwuczęściowego identyfikatora sprzętu PCI, podczas gdy rozszerzenie INF określa czteroczęściowy identyfikator sprzętu PCI, jak pokazano poniżej:

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

    Alternatywnie rozszerzenie INF może wyświetlić ten sam identyfikator sprzętu co podstawowy pakiet sterowników, na przykład jeśli urządzenie jest już wąsko docelowe, lub jeśli podstawowy pakiet sterowników zawiera już najbardziej konkretny identyfikator sprzętu.

    W niektórych przypadkach rozszerzenie INF może dostarczyć mniej specyficzny identyfikator urządzenia, taki jak zgodny identyfikator, w celu dostosowania ustawienia w szerszym zestawie urządzeń.

    identyfikatora CHID można użyć, jeśli czteroczęściowy identyfikator sprzętu nie jest możliwy lub nie jest wystarczająco restrykcyjny.

  3. Nie należy definiować usługi przy użyciu SPSVCINST_ASSOCSERVICE. Rozszerzenie INF nie może zapewnić sterownika funkcji dla urządzenia. Rozszerzenie INF może jednak definiować inne usługi, takie jak sterownik filtru dla urządzenia. Aby uzyskać więcej informacji na temat określania usług, zobacz INF AddService Directive.

Zazwyczaj należy przesłać pakiet sterowników INF rozszerzenia do Centrum Deweloperów Sprzętu oddzielnie od pakietu sterownika bazowego. Aby zapoznać się z przykładami dotyczącymi sposobu tworzenia pakietów rozszerzeń INFs i linków do przykładowego kodu, zobacz DCH-Compliant Driver Package Example (Przykład pakietu sterowników DCH-Compliant).

Proces sprawdzania poprawności i przesyłania sterownika jest taki sam w przypadku plików INF rozszerzenia, co w przypadku pakietów sterowników podstawowych. Aby uzyskać więcej informacji, zobacz Windows HLK Getting Started.

Odinstalowywanie sterownika rozszerzenia

Aby usunąć pakiet sterowników rozszerzenia z systemu i odinstalować go z dowolnego urządzenia, użyj poleceniadelete-driver PnPUtil z flagą uninstall. Umożliwia to odinstalowanie pakietu sterownika rozszerzenia z urządzeń bez usuwania podstawowego pakietu sterowników.

Znajdź nazwę pliku .inf oem<#>pakietu sterowników do odinstalowania i użyj pnputil /delete-driver oem<#>.inf /uninstall.

pnputil /enum-drivers może służyć do identyfikowania odpowiedniej nazwy pliku oem<#>.inf.

Przykład 1: Ustawianie przyjaznej nazwy urządzenia przy użyciu rozszerzenia INF

W jednym z typowych scenariuszy producent urządzenia (IHV) udostępnia podstawowy pakiet sterowników, a następnie konstruktor systemu (OEM) zapewnia rozszerzenie INF, które uzupełnia i w niektórych przypadkach zastępuje konfigurację i ustawienia podstawowego pakietu sterowników. Poniższy fragment kodu to kompletne rozszerzenie INF, które pokazuje, jak ustawić przyjazną nazwę urządzenia.

[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"

Przykład 2: Instalowanie dodatkowego oprogramowania przy użyciu rozszerzenia INF

Poniższy fragment kodu jest kompletnym rozszerzeniem INF dołączonym do zestawu narzędzi instalacyjnych pakietów sterowników dla uniwersalnych sterowników. W tym przykładzie użyto dyrektywy AddComponent INF do dodania składników, które instalują usługę i plik wykonywalny. Aby uzyskać więcej informacji na temat tego, co można zrobić w składniku INF, zobacz Using a Component INF File.

Aby uzyskać dostęp do tego pliku w trybie online, zobacz 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

Aby uzyskać informacje na temat sposobu instalowania sterownika filtra za pomocą rozszerzenia INF, zobacz Kolejność sterowników filtru urządzenia.

Aby zwiększyć rozszerzalność, zalecamy, aby IHV umieszcza opcjonalne funkcje w szablonie rozszerzenia INF .

Zgodność z poprzednimi wersjami

Każda zmiana pakietu sterowników podstawowych musi być dokładnie przetestowana, aby upewnić się, że nie przerywa zgodności z poprzednimi wersjami dla istniejących plików INF rozszerzeń.

Podczas zarządzania pakietem sterowników podstawowych postępuj zgodnie z następującymi najlepszymi rozwiązaniami:

  • Zakresy wartości parametrów dokumentu i ograniczenia zarówno w komentarzach kodu, jak i w dokumencie projektowym. Przyszłe zmiany muszą być zgodne z określonymi zakresami.
  • Aby obsługiwać nowe zakresy, dodaj opcjonalny parametr (bez wartości domyślnej).

Przesyłanie rozszerzenia INF do certyfikacji

Aby uzyskać szczegółowe informacje na temat pracy z plikami INF rozszerzeń w Centrum deweloperów sprzętu, zobacz sekcję Praca z plikami INF rozszerzeń w Centrum deweloperów sprzętu systemu Windows na pulpicie nawigacyjnym.

Praca z rozszerzeniami INFs w Centrum Partnerskim

przykład pakietu sterowników DCH-Compliant

Korzystanie z uniwersalnego pliku INF

Wprowadzenie do opracowywania sterowników systemu Windows

zestaw narzędzi instalacyjnych pakietów sterowników dla sterowników uniwersalnych