DCH-Compliant 드라이버 패키지 예제
이 문서에서는 DCHU 드라이버 샘플 이 DCH 디자인 원칙을 적용하는 방법을 설명합니다. 이를 모델로 사용하여 DCH 디자인 원칙을 사용자 고유의 드라이버 패키지에 적용할 수 있습니다.
샘플 리포지토리의 로컬 복사본을 원하는 경우 Windows-driver-samples에서 복제합니다.
샘플의 일부 부분에서는 특정 버전의 Windows 10 이상에서만 사용할 수 있는 지시문 및 API를 사용할 수 있습니다. 지정된 지시문이 지원되는 OS 버전을 보려면 디바이스 및 드라이버 설치 를 참조하세요.
필수 조건
이 섹션을 읽기 전에 DCH 디자인 원칙에 익숙해져야 합니다.
개요
이 샘플에서는 Contoso(시스템 빌더 또는 OEM) 및 Fabrikam(디바이스 제조업체 또는 IHV)이 함께 작동하여 Contoso의 예정된 시스템에서 디바이스에 대해 DCH 규격 드라이버를 만드는 예제 시나리오를 제공합니다. 문제의 디바이스는 OSR USB FX2 학습 키트입니다. 과거에 Fabrikam은 특정 Contoso 제품 라인에 사용자 지정된 레거시 드라이버 패키지를 작성한 다음 서비스를 처리하기 위해 OEM에 전달했습니다. 이로 인해 상당한 유지 관리 오버헤드가 발생했기 때문에 Fabrikam은 코드를 리팩터링하고 대신 DCH 규격 드라이버 패키지를 만들기로 결정했습니다.
선언적 섹션/지시문을 사용하고 INF를 올바르게 격리합니다.
먼저 Fabrikam은 DCH 규격 드라이버 패키지 에서 잘못된 INF 섹션 및 지시문 목록을 검토합니다. 이 연습에서 Fabrikam은 드라이버 패키지에서 이러한 섹션 및 지시문을 많이 사용하고 있음을 알 수 있습니다.
드라이버 INF는 플랫폼 종속 설정 및 파일을 적용하는 공동 설치 관리자를 등록합니다. 즉, 드라이버 패키지가 예상보다 크며 버그가 드라이버를 제공하는 OEM 시스템의 하위 집합에만 영향을 줄 때 드라이버를 서비스하기가 더 어렵습니다. 또한 대부분의 OEM 관련 수정 사항은 브랜딩과 관련이 있으므로 Fabrikam은 OEM이 추가되거나 사소한 문제가 OEM 시스템의 하위 집합에 영향을 줄 때마다 드라이버 패키지를 업데이트해야 합니다.
Fabrikam은 선언적이지 않은 섹션 및 지시문을 제거하고 InfVerif 도구를 사용하여 새 드라이버 패키지의 INF 파일이 선언적 INF 요구 사항을 따르는지 확인합니다.
확장 INF를 사용하여 드라이버 패키지 구성 요소화
다음으로 Fabrikam은 OEM 파트너(예: Contoso)와 관련된 사용자 지정을 기본 드라이버 패키지에서 확장 INF로 구분합니다.
[osrfx2_DCHU_extension.inx
]에서 업데이트된 다음 코드 조각은 클래스를 Extension
지정하고 확장 드라이버 패키지를 소유하므로 Contoso를 공급자로 식별합니다.
[Version]
...
Class = Extension
ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider = Contoso
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
...
[osrfx2_DCHU_base.inx
]에서 Fabrikam은 다음 항목을 지정합니다.
[OsrFx2_AddReg]
HKR, OSR, "OperatingMode",, "Default" ; FLG_ADDREG_TYPE_SZ
HKR, OSR, "OperatingParams",, "None" ; FLG_ADDREG_TYPE_SZ
[osrfx2_DCHU_extension.inx
]에서 Contoso는 기본으로 설정된 OperatingParams 레지스트리 값을 재정의하고 OperatingExceptions를 추가합니다.
[OsrFx2Extension_AddReg]
HKR, OSR, "OperatingParams",, "-Extended"
HKR, OSR, "OperatingExceptions",, "x86"
확장은 항상 기본 INF 이후에 처리되지만 명확한 순서는 없습니다. 기본 INF가 최신 버전으로 업데이트되는 경우 새 기본 INF가 설치된 후에도 확장이 다시 적용됩니다.
INF 파일에서 서비스 설치
Fabrikam은 Win32 서비스를 사용하여 OSR 보드에서 LED를 제어합니다. 이 구성 요소는 디바이스의 핵심 기능의 일부로 간주하므로 기본 INF([osrfx2_DCHU_base.inx
])의 일부로 포함합니다. 이 사용자 모드 서비스(usersvc)는 INF 파일에서 AddService 지시문을 지정하여 선언적으로 추가하고 시작할 수 있습니다.
[OsrFx2_Install.NT]
CopyFiles = OsrFx2_CopyFiles
[OsrFx2_Install.NT.Services]
AddService = WUDFRd, 0x000001fa, WUDFRD_ServiceInstall ; Flag 0x2 sets this as the service for the device
AddService = osrfx2_DCHU_usersvc,, UserSvc_ServiceInstall
[UserSvc_ServiceInstall]
DisplayName = %UserSvcDisplayName%
ServiceType = 0x10 ; SERVICE_WIN32_OWN_PROCESS
StartType = 0x3 ; SERVICE_DEMAND_START
ErrorControl = 0x1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %13%\osrfx2_DCHU_usersvc.exe
AddTrigger = UserSvc_AddTrigger ; AddTrigger syntax is only available in Windows 10 Version 2004 and above
[UserSvc_AddTrigger]
TriggerType = 1 ; SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL
Action = 1 ; SERVICE_TRIGGER_ACTION_SERVICE_START
SubType = %GUID_DEVINTERFACE_OSRFX2% ; Interface GUID
DataItem = 2, "USB\VID_0547&PID_1002" ; SERVICE_TRIGGER_DATA_TYPE_STRING
[OsrFx2_CopyFiles]
osrfx2_DCHU_base.dll
osrfx2_DCHU_filter.dll
osrfx2_DCHU_usersvc.exe
이러한 서비스는 시나리오에 따라 구성 요소 또는 확장 INF에 설치될 수도 있습니다.
구성 요소를 사용하여 드라이버 패키지에서 레거시 소프트웨어 설치
Fabrikam에는 이전에 공동 설치 관리자를 사용하여 설치한 실행 파일이 osrfx2_DCHU_componentsoftware.exe
있습니다. 이 레거시 소프트웨어는 보드에서 설정한 레지스트리 키를 표시하며 OEM에 필요합니다. 데스크톱 버전용 Windows에서만 실행되는 GUI 기반 실행 파일입니다. 설치하기 위해 Fabrikam은 별도의 구성 요소 드라이버 패키지를 만들고 확장 INF에 추가합니다.
[osrfx2_DCHU_extension.inx
]의 다음 코드 조각은 AddComponent 지시문을 사용하여 가상 자식 디바이스를 만듭니다.
[OsrFx2Extension_Install.NT.Components]
AddComponent = osrfx2_DCHU_component,,OsrFx2Extension_ComponentInstall
[OsrFx2Extension_ComponentInstall]
ComponentIds=VID_045e&PID_94ab
그런 다음 구성 요소 INF [osrfx2_DCHU_component.inx
]에서 Fabrikam은 선택적 실행 파일을 설치하기 위해 AddSoftware 지시문을 지정합니다.
[OsrFx2Component_Install.NT.Software]
AddSoftware = osrfx2_DCHU_componentsoftware,, OsrFx2Component_SoftwareInstall
[OsrFx2Component_SoftwareInstall]
SoftwareType = 1
SoftwareBinary = osrfx2_DCHU_componentsoftware.exe
SoftwareArguments = <<DeviceInstanceId>>
SoftwareVersion = 1.0.0.0
[OsrFx2Component_CopyFiles]
osrfx2_DCHU_componentsoftware.exe
Win32 앱의 소스 코드가 샘플에 포함되어 있습니다.
구성 요소 드라이버 패키지는 Windows Hardware Dev Center 대시보드 설정된 대상 지정으로 인해 데스크톱 SKU에만 배포됩니다. 자세한 내용은 Windows 업데이트 드라이버 게시를 참조하세요.
하드웨어 지원 앱과의 통신 허용
Fabrikam은 Windows 드라이버 패키지의 일부로 GUI 기반 도우미 앱을 제공하려고 합니다. Win32 기반 도우미 애플리케이션은 Windows 드라이버 패키지의 일부가 될 수 없으므로 Win32 앱을 유니버설 Windows 플랫폼(UWP)로 이식하고 앱을 디바이스와 페어링합니다.
다음 코드 조각 osrfx2_DCHU_base/device.c
은 기본 드라이버 패키지가 디바이스 인터페이스 instance 사용자 지정 기능을 추가하는 방법을 보여 줍니다.
WDF_DEVICE_INTERFACE_PROPERTY_DATA PropertyData = { 0 };
static const wchar_t customCapabilities[] = L"CompanyName.yourCustomCapabilityName_YourStorePubId\0";
WDF_DEVICE_INTERFACE_PROPERTY_DATA_INIT(&PropertyData,
&GUID_DEVINTERFACE_OSRUSBFX2,
&DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities);
Status = WdfDeviceAssignInterfaceProperty(Device,
&PropertyData,
DEVPROP_TYPE_STRING_LIST,
sizeof(customCapabilities),
(PVOID)customCapabilities);
새 앱(샘플에 포함되지 않음)은 안전하며 Microsoft Store에서 쉽게 업데이트할 수 있습니다. UWP 애플리케이션이 준비되면 Contoso는 DISM - 배포 이미지 서비스 및 관리를 사용하여 Windows Desktop 버전 이미지에 애플리케이션을 미리 로드합니다.
여러 INF 파일을 긴밀하게 결합
이상적으로는 기본, 확장 및 구성 요소 간에 강력한 버전 관리 계약이 있어야 합니다. 이러한 세 패키지를 독립적으로 서비스하는 경우("느슨하게 결합된" 시나리오) 서비스 이점이 있지만 버전 관리 계약이 좋지 않아 단일 드라이버 패키지("긴밀하게 결합")에 번들로 묶어야 하는 시나리오가 있습니다. 샘플에는 두 시나리오의 예가 포함되어 있습니다.
DCHU_Sample\osrfx2_DCHU_extension_tight
확장 및 구성 요소가 동일한 드라이버 패키지("긴밀하게 결합됨")에 있는 경우 확장 INF는 구성 요소 INF가 대상 시스템에 복사되도록 CopyINF 지시문을 지정합니다. DCHU_Sample \osrfx2_DCHU_extension_tight\osrfx2_DCHU_extension\osrfx2_DCHU_extension.inx에서 설명합니다.
[OsrFx2Extension_Install.NT]
CopyInf=osrfx2_DCHU_component.inf
이 지시문은 다기능 디바이스에서 INF 파일의 설치를 조정하는 데도 사용할 수 있습니다. 자세한 내용은 INF 파일 복사를 참조하세요.
참고
기본 드라이버는 확장을 페이로드하고 배송 레이블의 기본 드라이버를 대상으로 할 수 있지만 다른 드라이버와 함께 번들로 제공되는 확장은 확장 하드웨어 ID에 게시할 수 없습니다.
드라이버 저장소에서 실행
드라이버를 보다 쉽게 업데이트할 수 있도록 Fabrikam은 가능한 경우 dirid 13을 사용하여 드라이버 파일을 복사할 대상으로 드라이버 저장소를 지정합니다. 대상 디렉터리 값 13을 사용하면 드라이버 업데이트 프로세스 중에 안정성이 향상될 수 있습니다. 다음은 [osrfx2_DCHU_base.inx
]의 예입니다.
[DestinationDirs]
OsrFx2_CopyFiles = 13 ; copy to Driver Store
드라이버 저장소에서 파일을 동적으로 찾고 로드하는 방법에 대한 자세한 내용은 드라이버 스토어에서 실행을 참조하세요.
요약
다음 다이어그램에서는 Fabrikam 및 Contoso가 DCH 규격 드라이버에 대해 만든 드라이버 패키지를 보여 줍니다. 느슨하게 결합된 예제에서는 Windows Hardware Dev Center 대시보드 3개의 개별 제출을 만듭니다. 하나는 베이스용, 하나는 확장용, 하나는 구성 요소에 대한 것입니다. 긴밀하게 결합된 예제에서는 기본 및 확장/구성 요소의 두 가지 제출을 수행합니다.
구성 요소 INF는 구성 요소 하드웨어 ID에서 일치하는 반면 기본 및 확장은 보드의 하드웨어 ID에서 일치합니다.
참고 항목
"느슨하게 결합된" osrfx2_DCHU_component.inx
"느슨하게 결합된" osrfx2_DCHU_extension.inx