다음을 통해 공유


확장 INF 파일 사용

Windows 10 이전에는 Windows에서 지정된 디바이스에 설치할 단일 드라이버 패키지를 선택했습니다. 이로 인해 모든 시나리오 및 구성에 대한 코드가 포함된 크고 복잡한 드라이버 패키지가 생성되었으며, 각 사소한 업데이트에는 전체 드라이버 패키지에 대한 업데이트가 필요했습니다. Windows 10부터 INF 기능을 여러 구성 요소로 분할할 수 있으며, 각 구성 요소는 독립적으로 서비스할 수 있습니다. 디바이스에 설치된 핵심 드라이버 패키지는 이제 기본 드라이버 패키지라고 하며 Windows 10 이전에 드라이버 패키지가 처리된 것과 동일한 방식으로 시스템에서 처리됩니다. 기본 드라이버 패키지의 기능을 확장하려면 별도의 드라이버 패키지에 확장 INF를 제공합니다. 확장 INF:

  • 다른 회사에서 제공하고 기본 INF와 독립적으로 업데이트할 수 있습니다.

  • 기본 INF와 동일한 INF 구문을 사용하지만 사용자 지정 또는 특수화를 위해 기본 INF를 확장할 수 있습니다.

  • 디바이스의 값을 향상하지만 기본 드라이버 패키지가 작동할 필요는 없습니다 . INF 확장이 없는 경우 시스템은 기본 드라이버 패키지만 사용하여 부팅하고 네트워크에 연결할 수 있어야 합니다. 키보드와 같이 시스템에 기본 제공되는 입력 디바이스는 확장 INF 없이 최소한 기본 기능으로 작동할 수 있어야 합니다.

  • 범용 INF 파일이어야 합니다.

모든 디바이스에는 하나의 기본 드라이버 패키지가 설치되어 있어야 하며, 필요에 따라 하나 이상의 확장 INF를 연결할 수 있습니다. 디바이스에 설치할 기본 드라이버 패키지가 없는 경우 확장 INF를 디바이스에 설치할 수 없습니다.

확장 INF를 사용할 수 있는 일반적인 시나리오는 다음과 같습니다.

  • 디바이스 이름을 사용자 지정하거나 하드웨어 구성 설정을 수정하는 등 기본 드라이버 패키지에 제공된 설정을 수정합니다.

  • INF AddComponent 지시문을 지정하고 구성 요소 INF 파일을 제공하여 하나 이상의 소프트웨어 구성 요소를 만듭니다.

  • 하드웨어 보정 데이터와 같이 디바이스의 환경이나 기능을 향상시키는 시스템의 모델 또는 폼 팩터와 관련된 설정을 제공합니다.

  • 디바이스 스택에 필터 드라이버를 추가합니다.

아래 예제에서는 이러한 시나리오 중 일부에 대한 샘플 코드를 찾을 수 있습니다. 또한 DCHU 유니버설 드라이버 샘플에서 확장 INF를 사용하는 방법을 설명하는 DCH 규격 드라이버 패키지 예제를 참조하세요.

확장 INF 및 기본 드라이버 패키지가 함께 작동하는 방법

디바이스를 설치하는 동안 확장 INF의 설정은 기본 드라이버 패키지의 설정 후에 적용됩니다. 따라서 확장 INF 및 기본 드라이버 패키지가 동일한 설정을 지정하면 확장 INF의 버전이 적용됩니다. 마찬가지로 기본 드라이버 패키지가 변경되면 확장 INF가 유지되고 새 기본 드라이버 패키지에 적용됩니다. 동일한 디바이스에 여러 확장 INF가 설치된 경우 확장 INF가 적용되도록 미리 정해진 순서가 없으므로 하나의 확장 INF가 다른 확장 INF에서 제공하는 값을 결정적으로 재정의할 수 없습니다. 동일한 디바이스를 대상으로 하는 고유 확장 INF는 동일한 설정을 변경하려고 시도해서는 안 됩니다.

확장 INF에서 재정의할 수 있는 항목과 해당 매개 변수 값 범위 및 제약 조건을 설명하는 주석을 기본 드라이버 패키지에 포함하는 것이 유용합니다.

ExtensionId 지정

확장 INF를 작성할 때 INF의 [버전] 섹션에 있는 항목인 ExtensionId라는 특수 GUID를 생성합니다.

시스템은 해당 시스템에 적용되는 모델 섹션의 확장 INF에 지정된 것과 디바이스의 하드웨어 ID 및 호환 ID를 일치시켜 특정 디바이스에 대해 가능한 확장 INF를 식별합니다.

동일한 ExtensionId 값을 지정하는 가능한 모든 확장 INF 중에서 시스템은 설치할 확장 INF를 하나만 선택하고 기본 드라이버 패키지의 설정보다 해당 설정을 적용합니다. INF에 지정된 드라이버 날짜 및 드라이버 버전은 해당 순서대로 동일한 ExtensionId를 사용하는 여러 확장 INF 간에 단일 INF를 선택하는 데 사용됩니다.

설명하려면 세 개의 확장 INF가 있는 가상 디바이스를 포함하는 다음 시나리오를 고려합니다.

기본 INF 및 확장 INF를 선택하는 방법을 보여 주는 다이어그램

ExtensionId{A}{B} 중괄호로 표시되며 각 기본 드라이버 패키지의 순위는 배너 리본에 표시됩니다.

먼저 시스템은 가장 높은 순위와 가장 높은 버전의 기본 드라이버 패키지를 선택합니다.

다음으로, 시스템은 사용 가능한 확장 INF를 처리합니다. 두 값에는 ExtensionId{B}이 있고, 다른 하나는 ExtensionId 값을 {A}습니다. 처음 두 가지에서 드라이버 날짜가 동일하다고 가정해 보겠습니다. 다음 타이브레이커는 드라이버 버전이므로 시스템은 v2.0을 사용하여 확장 INF를 선택합니다.

고유한 ExtensionId 값이 있는 확장 INF도 선택됩니다. 시스템은 디바이스에 대한 기본 드라이버 패키지를 적용한 다음 해당 디바이스에 대해 두 개의 확장 INF를 적용합니다.

확장 INF 파일은 항상 기본 드라이버 패키지 후에 적용되지만 확장 INF가 적용되는 순서는 결정되지 않습니다.

확장 INF 만들기

INF를 확장 INF로 정의해야 하는 항목은 다음과 같습니다.

  1. 버전 섹션에서 ClassClassGuid 대해 이러한 값을 지정합니다. 설치 클래스 에 대한 자세한 내용은 공급업체에서 사용할 수 있는 시스템 정의 디바이스 설정 클래스를 참조하세요.

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. [버전] 섹션에 ExtensionId 항목을 제공합니다. 확장 INF의 초기 버전에 대한 새 GUID를 생성하거나 초기 확장 INF의 후속 업데이트에 마지막 GUID를 다시 사용합니다.

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

조직에서 소유한 ExtensionID만 사용할 수 있습니다. 확장 ID 등록에 대한 자세한 내용은 Windows Hardware Dev Center 대시보드 하드웨어 제출 관리를 참조하세요.

  1. 확장 INF를 업데이트하는 경우 ExtensionId를 동일하게 유지하고 DriverVer 지시문에 지정된 버전과 날짜를 증분합니다. 지정된 ExtensionId 값의 경우 PnP는 DriverVer가 가장 높은 INF를 선택합니다.

    참고 항목

    확장 INF가 Windows 10 S를 대상으로 하는 경우 해당 버전의 Windows에서 드라이버 설치에 대한 자세한 내용은 Windows 10 S 모드 드라이버 요구 사항을 참조하세요.

  2. INF 모델 섹션에서 대상 디바이스와 일치하는 하나 이상의 하드웨어 및 호환 ID를 지정합니다. 이러한 하드웨어 및 호환 ID는 기본 드라이버 패키지의 ID와 일치할 필요가 없습니다. 일반적으로 확장 INF는 기본 드라이버 패키지보다 더 구체적인 하드웨어 ID를 나열하며, 특정 드라이버 구성을 추가로 특수화합니다. 예를 들어 기본 드라이버 패키지는 두 부분으로 구성된 PCI 하드웨어 ID를 사용할 수 있지만 확장 INF는 다음과 같이 4부로 구성된 PCI 하드웨어 ID를 지정합니다.

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

    또는 확장 INF는 기본 드라이버 패키지와 동일한 하드웨어 ID를 나열할 수 있습니다. 예를 들어 디바이스가 이미 좁게 대상으로 지정되었거나 기본 드라이버 패키지에 이미 가장 구체적인 하드웨어 ID가 나열되어 있는 경우입니다.

    경우에 따라 확장 INF는 광범위한 디바이스 집합에서 설정을 사용자 지정하기 위해 호환 ID와 같은 덜 구체적인 디바이스 ID를 제공할 수 있습니다.

    4부로 구성된 하드웨어 ID가 불가능하거나 제한적이지 않은 경우 CHID 대상 지정 을 사용할 수 있습니다.

  3. 을 사용하여 서비스를 SPSVCINST_ASSOCSERVICE정의하지 마세요. 확장 INF는 디바이스에 대한 함수 드라이버를 제공할 수 없습니다. 그러나 확장 INF는 디바이스에 대한 필터 드라이버와 같은 다른 서비스를 정의할 수 있습니다. 서비스 지정에 대한 자세한 내용은 INF AddService 지시문을 참조 하세요.

대부분의 경우 기본 드라이버 패키지와 별도로 확장 INF 드라이버 패키지를 하드웨어 개발자 센터 제출합니다. 확장 INF를 패키지하는 방법 및 샘플 코드에 대한 링크에 대한 예제는 DCH 규격 드라이버 패키지 예제를 참조 하세요.

드라이버 유효성 검사 및 제출 프로세스는 기본 드라이버 패키지와 마찬가지로 확장 INF에 대해 동일합니다. 자세한 내용은 Windows HLK 시작을 참조 하세요.

확장 드라이버 제거

시스템에서 확장 드라이버 패키지를 제거하고 이를 사용하는 모든 디바이스에서 제거하려면 플래그와 함께 uninstall PnPUtil의 delete-driver 명령을 사용합니다. 이렇게 하면 기본 드라이버 패키지를 제거하지 않고 디바이스에서 확장 드라이버 패키지를 제거할 수 있습니다.

제거하여 사용할 pnputil /delete-driver oem<#>.inf /uninstall드라이버 패키지의 oem<#>.inf 이름을 찾습니다.

pnputil /enum-drivers 는 적절한 oem<#>.inf 이름을 식별하는 데 사용할 수 있습니다.

예제 1: 확장 INF를 사용하여 디바이스 이름 설정

한 가지 일반적인 시나리오에서 IHV(디바이스 제조업체)는 기본 드라이버 패키지를 제공하고 OEM(시스템 작성기)은 기본 드라이버 패키지의 구성 및 설정을 재정의하는 확장 INF를 제공합니다. 다음 코드 조각은 디바이스 이름을 설정하는 방법을 보여 주는 전체 확장 INF입니다.

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

예제 2: 확장 INF를 사용하여 추가 소프트웨어 설치

다음 코드 조각은 범용 드라이버용 드라이버 패키지 설치 도구 키트에 포함된 전체 확장 INF입니다. 이 예제에서는 INF AddComponent 지시문을 사용하여 서비스 및 실행 파일을 설치하는 구성 요소를 만듭니다. 구성 요소 INF에서 수행할 수 있는 작업에 대한 자세한 내용은 구성 요소 INF 파일 사용을 참조 하세요.

이 파일에 온라인으로 액세스하려면 다음을 참조하세요 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

확장 INF를 사용하여 필터 드라이버를 설치하는 방법에 대한 자세한 내용은 디바이스 필터 드라이버 순서를 참조 하세요.

확장성을 향상하려면 IHV에서 확장 INF 템플릿에 선택적 기능을 배치하는 것이 좋습니다.

이전 버전과의 호환성

기본 드라이버 패키지에 대한 변경 내용을 철저히 테스트하여 기존 확장 INF에 대한 이전 버전과의 호환성이 손상되지 않도록 해야 합니다.

기본 드라이버 패키지를 관리할 때는 다음 모범 사례를 따릅니다.

  • 코드 주석과 디자인 문서에서 모두 매개 변수 값 범위 및 제약 조건을 문서화합니다. 이후 변경 내용은 지정된 범위를 따라야 합니다.
  • 새 범위를 지원하려면 선택적 매개 변수(기본값 없음)를 추가합니다.

인증을 위해 확장 INF 제출

하드웨어 개발자 센터 확장 INF를 사용하는 방법에 대한 자세한 내용은 Windows 하드웨어 개발자 센터 대시보드에서 확장 INF 작업을 참조하세요.

파트너 센터에서 확장 INF 작업

DCH 규격 드라이버 패키지 예제

범용 INF 파일 사용

Windows 드라이버 개발 시작

범용 드라이버용 드라이버 패키지 설치 도구 키트