드라이버 패키지 격리
드라이버 패키지 격리는 드라이버 패키지가 외부 변경에 더 탄력적이고, 업데이트하기 쉽고, 설치가 더 간단하도록 만드는 Windows 드라이버의 요구 사항입니다.
참고 항목
Windows 드라이버에는 드라이버 패키지 격리가 필요하지만 Windows 데스크톱 드라이버는 향상된 복원력과 서비스 가능성을 통해 여전히 이점을 누릴 수 있습니다.
다음 표에서는 왼쪽 열의 Windows 드라이버에 대해 더 이상 허용되지 않는 몇 가지 레거시 드라이버 패키지 사례와 오른쪽 열의 Windows 드라이버에 대한 필수 동작을 보여 줍니다.
격리되지 않은 드라이버 | 격리된 드라이버 |
---|---|
INF에서 파일을 %windir%\System32 또는 %windir%\System32\drivers에 복사합니다. | 드라이버 파일은 드라이버 저장소에서 실행됩니다. |
하드 코딩된 경로를 사용하여 디바이스 스택/드라이버와 상호 작용 | 시스템 제공 함수 또는 디바이스 인터페이스를 사용하여 디바이스 스택/드라이버와 상호 작용 |
전역 레지스트리 위치에 대한 하드 코드 경로 | 레지스트리 및 파일 상태의 상대 위치에 HKR 및 시스템 제공 함수 사용 |
런타임 파일은 모든 위치에 씁니다. | 파일은 운영 체제에서 제공하는 위치를 기준으로 작성됩니다. |
드라이버 패키지가 드라이버 패키지 격리 요구 사항을 충족하는지 확인하는 데 도움이 필요한 경우 Windows 드라이버 유효성 검사를 참조하세요. 드라이버 패키지 격리 요구 사항을 충족하도록 INF를 업데이트하는 방법의 예는 드라이버 패키지 격리를 따르도록 INF 포팅을 참조하세요.
드라이버 저장소에서 실행
격리된 모든 드라이버 패키지는 드라이버 패키지 파일을 드라이버 저장소에 남겨 둡니다. 즉, 설치 시 드라이버 패키지 파일의 위치를 지정하기 위해 INF에 DIRID 13을 지정합니다. 드라이버 패키지에서 이를 사용하는 방법에 대한 자세한 내용은 드라이버 저장소에서 실행을 참조 하세요.
읽기 및 쓰기 상태
참고 항목
구성 요소가 디바이스 또는 디바이스 인터페이스 속성을 사용하여 상태를 저장하는 경우 해당 메서드와 적절한 OS API를 사용하여 상태를 저장하고 액세스합니다. 레지스트리 및 파일 상태에 대한 다음 지침은 구성 요소에서 저장해야 하는 다른 상태에 대한 것입니다.
다양한 레지스트리 및 파일 상태에 대한 액세스는 호출자에게 상태의 위치를 제공하는 함수를 호출한 다음 해당 위치를 기준으로 상태를 읽거나 씁니다. 하드 코딩된 절대 레지스트리 경로 및 파일 경로를 사용하지 마세요.
이 섹션에는 다음 하위 섹션이 포함되어 있습니다.
레지스트리 상태
이 섹션에는 다음 하위 섹션이 포함되어 있습니다.
PnP 디바이스 레지스트리 상태
격리된 드라이버 패키지 및 사용자 모드 구성 요소는 일반적으로 두 위치 중 하나를 사용하여 레지스트리에 디바이스 상태를 저장합니다. 디바이스의 하드웨어 키 (디바이스 키) 및 디바이스의 소프트웨어 키 (드라이버 키)입니다. 하드웨어 키는 일반적으로 개별 디바이스 인스턴스가 하드웨어와 상호 작용하는 방법과 관련된 설정에 사용됩니다. 예를 들어 하드웨어 기능을 사용하도록 설정하거나 하드웨어를 특정 모드로 전환합니다. 소프트웨어 키는 일반적으로 개별 디바이스 인스턴스가 시스템 및 기타 소프트웨어와 상호 작용하는 방법과 관련된 설정에 사용됩니다. 예를 들어 데이터 파일의 위치를 구성하거나, 프레임워크와 상호 작용하거나, 디바이스의 앱 설정에 액세스합니다. 이러한 레지스트리 위치에 대한 핸들을 검색하려면 다음 옵션 중 하나를 사용합니다.
IoOpenDeviceRegistryKey (WDM)
아래와 같이 INF DDInstall 섹션 또는 DDInstall.HW 섹션에서 참조하는 추가 레지스트리 섹션에서 HKR reg-root 항목을 사용하는 INF AddReg 지시문:
[ExampleDDInstall.HW]
AddReg = Example_DDInstall.AddReg
[Example_DDInstall.AddReg]
HKR,,ExampleValue,,%13%\ExampleFile.dll
디바이스 인터페이스 레지스트리 상태
디바이스 인터페이스 레지스트리 상태를 읽고 쓰려면 다음 옵션 중 하나를 사용합니다.
add-interface-section 섹션에서 참조하는 추가 레지스트리 섹션에서 HKR reg-root 항목을 사용하는 INF AddReg 지시문
서비스 레지스트리 상태
서비스 상태는 3가지 범주 중 하나로 분류되어야 합니다.
변경할 수 없는 서비스 레지스트리 상태
변경할 수 없는 서비스 상태는 서비스를 설치하는 드라이버 패키지에서 제공하는 상태입니다. 드라이버 및 Win32 서비스에 대해 INF에서 설정한 이러한 레지스트리 값은 AddReg 섹션에서 HKR 줄을 제공한 다음 INF의 서비스 설치 섹션에서 해당 섹션을 참조하여 서비스의 "매개 변수" 하위 키 아래에 저장되어야 합니다. 예시:
[ExampleDDInstall.Services]
Addservice = ExampleService, 0x2, Example_Service_Inst
[Example_Service_Inst]
DisplayName = %ExampleService.SvcDesc%
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %13%\ExampleService.sys
AddReg=Example_Service_Inst.AddReg
[Example_Service_Inst.AddReg]
HKR, Parameters, ExampleValue, 0x00010001, 1
런타임에 서비스에서 이 상태의 위치에 액세스하려면 다음 함수 중 하나를 사용합니다.
DriverRegKeyParameters의 DRIVER_REGKEY_TYPE 사용하는 WDM(IoOpenDriverRegistryKey)
ServiceRegistryStateParameters의 SERVICE_REGISTRY_STATE_TYPE 있는 GetServiceRegistryStateKey(Win32 Services)
서비스에 대한 "매개 변수" 하위 키에서 INF에서 제공하는 이러한 레지스트리 값은 런타임에만 읽어야 하며 수정되지 않아야 합니다. 읽기 전용으로 처리해야 합니다.
INF에서 제공하는 레지스트리 값이 런타임에 덮어쓸 수 있는 기본 설정인 경우 재정의 값은 서비스에 대한 내부 서비스 레지스트리 상태 또는 공유 서비스 레지스트리 상태에 기록되어야 합니다. 설정을 검색할 때 변경 가능한 상태에서 먼저 설정을 찾을 수 있습니다. 존재하지 않는 경우 변경할 수 없는 상태에서 설정을 찾을 수 있습니다. RtlQueryRegistryValueWithFallback 을 사용하여 재정의 및 기본값이 있는 설정과 같은 쿼리 설정을 도울 수 있습니다.
내부 서비스 레지스트리 상태
내부 서비스 상태는 런타임에 작성되고 서비스 자체에서만 소유 및 관리되며 해당 서비스에만 액세스할 수 있는 상태입니다. 내부 서비스 상태의 위치에 액세스하려면 서비스에서 다음 함수 중 하나를 사용합니다.
DriverRegKeyPersistentState의 DRIVER_REGKEY_TYPE 사용하는 WDM(IoOpenDriverRegistryKey)
ServiceRegistryStatePersistent의 SERVICE_REGISTRY_STATE_TYPE 있는 GetServiceRegistryStateKey(Win32 Services)
서비스에서 다른 구성 요소에서 이러한 설정을 수정하도록 허용하려는 경우 서비스는 다른 구성 요소가 호출할 수 있는 인터페이스를 노출하여 이러한 설정을 변경하는 방법을 서비스에 알려야 합니다. 예를 들어 Win32 서비스는 COM 또는 RPC 인터페이스를 노출할 수 있으며 드라이버 서비스는 디바이스 인터페이스를 통해 IOCTL 인터페이스를 노출할 수 있습니다.
공유 서비스 레지스트리 상태
공유 서비스 상태는 런타임에 작성되며 충분한 권한이 있는 경우 다른 사용자 모드 구성 요소와 공유할 수 있는 상태입니다. 이 공유 서비스 상태의 위치에 액세스하려면 다음 함수 중 하나를 사용합니다.
DriverRegKeySharedPersistentState의 DRIVER_REGKEY_TYPE 사용하는 WDM(IoOpenDriverRegistryKey)
ServiceSharedRegistryPersistentState의 SERVICE_SHARED_REGISTRY_STATE_TYPE 있는 GetSharedServiceRegistryStateKey(Win32 Services)
파일 상태
이 섹션에는 다음 하위 섹션이 포함되어 있습니다.
디바이스 파일 상태
디바이스와 관련된 파일을 런타임에 작성해야 하는 경우 OS API를 통해 제공되는 핸들 또는 파일 경로를 기준으로 해당 파일을 저장해야 합니다. 해당 디바이스와 관련된 구성 파일은 여기에 저장할 파일 형식의 한 예입니다. 이 상태의 위치에 액세스하려면 서비스에서 다음 함수 중 하나를 사용합니다.
DirectoryType 매개 변수가 DeviceDirectoryData로 설정된 IoGetDeviceDirectory(WDM)
서비스 파일 상태
서비스 파일 상태는 세 가지 범주 중 하나로 분류할 수 있습니다.
변경할 수 없는 서비스 파일 상태
변경할 수 없는 서비스 파일 상태는 드라이버 패키지의 일부인 파일입니다. 이러한 파일에 액세스하는 방법에 대한 자세한 내용은 드라이버 저장소에서 실행을 참조 하세요.
내부 서비스 파일 상태
내부 서비스 파일 상태는 런타임에 작성되고 서비스 자체에서만 소유 및 관리되며 해당 서비스에만 액세스할 수 있는 상태입니다. 내부 서비스 상태의 위치에 액세스하려면 서비스에서 다음 함수 중 하나를 사용합니다.
DirectoryType 매개 변수가 DriverDirectoryData로 설정된 IoGetDriverDirectory(WDM, KMDF)
eDirectoryType 매개 변수가 ServiceDirectoryPersistentState로 설정된 GetServiceDirectory(Win32 Services)
서비스에서 다른 구성 요소에서 이러한 설정을 수정하도록 허용하려는 경우 서비스는 다른 구성 요소가 호출할 수 있는 인터페이스를 노출하여 이러한 설정을 변경하는 방법을 서비스에 알려야 합니다. 예를 들어 Win32 서비스는 COM 또는 RPC 인터페이스를 노출할 수 있으며 드라이버 서비스는 디바이스 인터페이스를 통해 IOCTL 인터페이스를 노출할 수 있습니다.
공유 서비스 파일 상태
공유 서비스 파일 상태는 런타임에 작성되며 충분한 권한이 있는 경우 다른 사용자 모드 구성 요소와 공유할 수 있는 상태입니다. 이 공유 서비스 상태의 위치에 액세스하려면 다음 함수 중 하나를 사용합니다.
DirectoryType 매개 변수가 DriverDirectorySharedData로 설정된 IoGetDriverDirectory(WDM, KMDF)
DirectoryType 매개 변수가 ServiceSharedDirectoryPersistentState로 설정된 GetSharedServiceDirectory(Win32 Services)
DriverData 및 ProgramData
다른 구성 요소와 공유할 수 있지만 공유 서비스 파일 상태 범주에 맞지 않는 파일은 둘 중 하나 DriverData
또는 ProgramData
위치에 쓸 수 있습니다.
이러한 위치는 구성 요소에 다른 구성 요소에서 사용하고 다른 시스템에서 처리할 시스템에서 수집 및 복사할 수 있는 임시 상태 또는 상태를 작성할 수 있는 위치를 제공합니다. 예를 들어 사용자 지정 로그 파일 또는 크래시 덤프는 이 설명에 적합합니다.
또는 ProgramData
디렉터리 루트 DriverData
에 파일을 쓰지 마세요. 대신 회사 이름으로 하위 디렉터리를 만든 다음 해당 디렉터리 내에서 파일 및 추가 하위 디렉터리를 작성합니다.
예를 들어 Contoso의 회사 이름에 대해 커널 모드 드라이버는 사용자 지정 로그를 작성할 수 있으며 사용자 모드 애플리케이션은 %DriverData%\Contoso\Logs
로그 파일을 수집하거나 분석할 \DriverData\Contoso\Logs
수 있습니다.
DriverData
디렉터 DriverData
리 Windows 10 버전 1803 이상에서 사용할 수 있으며 관리자 및 UMDF 드라이버에 액세스할 수 있습니다.
커널 모드 드라이버는 시스템 제공 기호 링크를 \DriverData
사용하여 디렉터리에 액세스 DriverData
합니다.
사용자 모드 프로그램은 환경 변수%DriverData%
를 DriverData
사용하여 디렉터리에 액세스합니다.
ProgramData
%ProgramData%
사용자 모드 환경 변수는 데이터를 저장할 때 사용할 사용자 모드 구성 요소에 사용할 수 있습니다.
임시 파일
임시 파일은 일반적으로 중간 작업에서 사용됩니다. 이러한 변수는 하위 경로 또는 %TMP%
환경 변수 아래의 하위 경로에 %TEMP%
기록할 수 있습니다. 이러한 위치는 환경 변수를 통해 액세스되므로 이 기능은 사용자 모드 구성 요소로 제한됩니다. 이러한 임시 파일의 수명 또는 지속성은 핸들을 닫은 후에 보장되지 않습니다. 운영 체제 또는 사용자는 언제든지 제거할 수 있으며 다시 부팅 시 유지되지 않을 수 있습니다.
또는 %TMP%
디렉터리 루트 %TEMP%
에 파일을 쓰지 마세요. 대신 회사 이름으로 하위 디렉터리를 만든 다음 해당 디렉터리 내에서 파일 및 추가 하위 디렉터리를 작성합니다.
속성 상태
디바이스와 디바이스 인터페이스는 모두 PnP 속성 모델을 통해 상태 저장을 지원합니다. 속성 모델을 사용하면 구조적 속성 데이터를 디바이스 또는 디바이스 인터페이스에 대해 저장할 수 있습니다. 이는 속성 모델에서 지원하는 속성 형식에 합리적으로 맞는 더 작은 데이터를 위한 것입니다.
디바이스 속성에 액세스하기 위해 다음 API를 사용할 수 있습니다.
WDM 드라이버
WDF 드라이버
사용자 모드 코드
디바이스 인터페이스 속성에 액세스하기 위해 다음 API를 사용할 수 있습니다.
WDM 드라이버
WDF 드라이버
사용자 모드 코드
디바이스 인터페이스 사용
드라이버가 다른 구성 요소에서 드라이버의 내부 상태를 읽거나 수정하도록 허용하려는 경우 드라이버는 다른 구성 요소가 호출할 수 있는 인터페이스를 노출하여 반환할 설정 또는 특정 설정을 수정하는 방법을 드라이버에 알려야 합니다. 예를 들어 드라이버 서비스는 디바이스 인터페이스를 통해 IOCTL 인터페이스를 노출할 수 있습니다.
일반적으로 상태를 소유하는 드라이버는 사용자 지정 디바이스 인터페이스 클래스에서 디바이스 인터페이스를 노출합니다. 드라이버가 다른 구성 요소에서 상태에 액세스할 준비가 되면 인터페이스를 사용하도록 설정합니다. 디바이스 인터페이스를 사용할 때 알림을 받으려면 사용자 모드 구성 요소가 디바이스 인터페이스 도착 알림에 등록할 수 있으며 커널 모드 구성 요소는 IoRegisterPlugPlayNotification을 사용할 수 있습니다. 이러한 구성 요소가 상태에 액세스하려면 인터페이스를 사용하도록 설정하는 드라이버는 사용자 지정 디바이스 인터페이스 클래스에 대한 계약을 정의해야 합니다. 이 계약은 일반적으로 다음 두 가지 종류 중 하나입니다.
I/O 계약은 상태에 액세스하기 위한 메커니즘을 제공하는 해당 디바이스 인터페이스 클래스와 연결할 수 있습니다. 다른 구성 요소는 사용 가능한 디바이스 인터페이스를 사용하여 계약을 준수하는 I/O 요청을 보냅니다.
쿼리 인터페이스를 통해 반환되는 직접 호출 인터페이스입니다. 다른 드라이버는 호출할 드라이버에서 함수 포인터를 검색하기 위해 IRP_MN_QUERY_INTERFACE 보낼 수 있습니다.
또는 상태를 소유한 드라이버가 상태에 직접 액세스할 수 있는 경우 다른 드라이버는 시스템 제공 함수를 사용하여 디바이스 인터페이스 상태에 프로그래밍 방식으로 액세스하여 상태에 액세스할 수 있습니다. 자세한 내용은 디바이스 인터페이스 레지스트리 상태를 참조하세요.
이러한 인터페이스 또는 상태(사용된 공유 방법에 따라 다름)는 상태를 소유하는 드라이버가 해당 상태에 액세스하는 다른 구성 요소와 독립적으로 서비스를 받을 수 있도록 올바르게 버전 관리되어야 합니다. 드라이버 공급업체는 드라이버와 동시에 서비스되고 동일한 버전에 머무르는 다른 구성 요소에 의존할 수 없습니다.
인터페이스를 제어하는 디바이스와 드라이버가 오고 가기 때문에 드라이버와 애플리케이션은 구성 요소 시작 시 IoGetDeviceInterfaces를 호출하여 활성화된 인터페이스 목록을 가져오는 것을 피해야 합니다. 대신 디바이스 인터페이스 도착 또는 제거 알림에 등록한 다음 적절한 함수를 호출하여 컴퓨터에서 기존 활성화된 인터페이스 목록을 가져오는 것이 가장 좋습니다.
디바이스 인터페이스에 대한 자세한 내용은 다음을 참조하세요.
상태 관리 API에 대한 운영 체제 지원에 대한 빠른 참조
대부분의 드라이버 패키지는 다양한 운영 체제 버전을 지원해야 합니다. 드라이버 패키지에서 이 작업을 수행하는 방법에 대한 자세한 내용은 여러 운영 체제 버전 지원을 참조하세요. 다음 표에서는 다양한 상태 관리 API에 대한 운영 체제 지원이 추가된 경우에 대한 빠른 참조를 제공합니다.
WDM 드라이버
운영 체제 | 추가된 지원 |
---|---|
Windows 2000 | IoOpenDeviceRegistryKey IoOpenDeviceInterfaceRegistryKey |
Windows Vista | IoGetDevicePropertyData IoSetDevicePropertyData |
Windows 8 | IoGetDeviceInterfacePropertyData IoSetDeviceInterfacePropertyData |
Windows 8.1 | IoQueryFullDriverPath |
Windows 10 1803 | DriverRegKeyParameters 및 DriverRegKeyPersistentState의 RegKeyType용 IoOpenDriverRegistryKey IoGetDeviceDirectory DriverDirectoryImage 및 DriverDirectoryData의 DirectoryType에 대한 IoGetDriverDirectory |
Windows 10 1809 | RtlQueryRegistryValueWithFallback |
Windows 11 21H2 | DriverRegKeySharedPersistentState의 RegKeyType용 IoOpenDriverRegistryKey DriverDirectorySharedData의 DirectoryType에 대한 IoGetDriverDirectory |
KMDF 드라이버
UMDF 드라이버
사용자 모드 코드
운영 체제 | 추가된 지원 |
---|---|
Windows 2000 | CM_Open_DevNode_Key |
Windows Vista | CM_Open_Device_Interface_Key CM_Get_DevNode_Property CM_Set_DevNode_Property CM_Get_Device_Interface_Property CM_Set_Device_Interface_Property |
Windows 10 2004 | GetServiceRegistryStateKey GetServiceDirectory |
Windows 11 21H2 | GetSharedServiceRegistryStateKey GetSharedServiceDirectory |