드라이버 패키지 격리

드라이버 패키지 격리는 Windows 드라이버 의 요구 사항으로, 드라이버 패키지가 외부 변경에 더 탄력적이고, 업데이트하기 쉽고, 설치가 더 간단해집니다.

참고

Windows 드라이버에는 드라이버 패키지 격리가 필요하지만 Windows 데스크톱 드라이버는 복원력 및 서비스 효율성 향상을 통해 여전히 이점을 누릴 수 있습니다.

다음 표에서는 왼쪽 열의 Windows 드라이버에 대해 더 이상 허용되지 않는 몇 가지 레거시 드라이버 패키지 사례와 오른쪽 열의 Windows 드라이버에 필요한 동작을 보여 줍니다.

격리되지 않은 드라이버 격리된 드라이버
INF는 파일을 %windir%\System32 또는 %windir%\System32\drivers에 복사합니다. 드라이버 파일은 드라이버 저장소에서 실행됩니다.
하드 코딩된 경로를 사용하여 디바이스 스택/드라이버와 상호 작용 시스템 제공 함수 또는 디바이스 인터페이스를 사용하여 디바이스 스택/드라이버와 상호 작용
전역 레지스트리 위치에 대한 하드 코드 경로 레지스트리 및 파일 상태의 상대 위치에 HKR 및 시스템 제공 함수 사용
런타임 파일은 모든 위치에 씁니다. 파일은 운영 체제에서 제공하는 위치를 기준으로 작성됩니다.

드라이버 패키지가 드라이버 패키지 격리 요구 사항을 충족하는지 확인하는 도움말은 Windows 드라이버 유효성 검사를 참조하세요. 드라이버 패키지 격리 요구 사항을 충족하도록 INF를 업데이트하는 방법의 예는 드라이버 패키지 격리를 따르도록 INF 포팅을 참조하세요.

드라이버 저장소에서 실행

격리된 모든 드라이버 패키지는 드라이버 패키지 파일을 드라이버 저장소에 남겨 둡니다. 즉, 설치할 때 드라이버 패키지 파일의 위치를 지정하기 위해 INF에 DIRID 13 을 지정합니다. 드라이버 패키지에서 이를 사용하는 방법에 대한 자세한 내용은 드라이버 저장소에서 실행을 참조하세요.

읽기 및 쓰기 상태

참고

구성 요소가 디바이스 또는 디바이스 인터페이스 속성을 사용하여 상태를 저장하는 경우 해당 메서드와 적절한 OS API를 사용하여 상태를 저장하고 액세스합니다. 레지스트리 및 파일 상태에 대한 다음 지침은 구성 요소에서 저장해야 하는 다른 상태에 대한 것입니다.

호출자에게 상태의 위치를 제공하는 함수를 호출하여 다양한 레지스트리 및 파일 상태에 액세스한 다음 해당 위치를 기준으로 상태를 읽기/기록해야 합니다. 하드 코딩된 절대 레지스트리 경로 및 파일 경로를 사용하지 마세요.

이 섹션은 다음 하위 섹션을 포함합니다.

레지스트리 상태

이 섹션은 다음 하위 섹션을 포함합니다.

PnP 디바이스 레지스트리 상태

격리된 드라이버 패키지 및 사용자 모드 구성 요소는 일반적으로 두 위치 중 하나를 사용하여 레지스트리에 디바이스 상태를 저장합니다. 디바이스의 하드웨어 키 (디바이스 키)와 디바이스의 소프트웨어 키 (드라이버 키)입니다. 하드웨어 키는 일반적으로 개별 디바이스 instance 하드웨어와 상호 작용하는 방법과 관련된 설정에 사용됩니다. 예를 들어 하드웨어 기능을 사용하도록 설정하거나 하드웨어를 특정 모드로 전환합니다. 소프트웨어 키는 일반적으로 개별 디바이스 instance 시스템 및 기타 소프트웨어와 상호 작용하는 방법과 관련된 설정에 사용됩니다. 예를 들어 데이터 파일의 위치를 구성하거나, 프레임워크와 상호 작용하거나, 디바이스의 앱 설정에 액세스합니다. 이러한 레지스트리 위치에 대한 핸들을 검색하려면 다음 옵션 중 하나를 사용합니다.

[ExampleDDInstall.HW]
AddReg = Example_DDInstall.AddReg

[Example_DDInstall.AddReg] 
HKR,,ExampleValue,,%13%\ExampleFile.dll

디바이스 인터페이스 레지스트리 상태

디바이스 인터페이스 레지스트리 상태를 읽고 쓰려면 다음 옵션 중 하나를 사용합니다.

서비스 레지스트리 상태

서비스 상태는 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

런타임에 서비스에서 이 상태의 위치에 액세스하려면 다음 함수 중 하나를 사용합니다.

서비스의 "매개 변수" 하위 키에서 INF에서 제공하는 이러한 레지스트리 값은 런타임에만 읽어야 하며 수정되지 않아야 합니다. 읽기 전용으로 처리해야 합니다.

INF에서 제공하는 레지스트리 값이 런타임에 덮어쓸 수 있는 기본 설정인 경우 재정의 값은 서비스에 대한 내부 서비스 레지스트리 상태 또는 공유 서비스 레지스트리 상태로 기록되어야 합니다. 설정을 검색할 때 변경 가능한 상태에서 먼저 설정을 찾을 수 있습니다. 존재하지 않는 경우 변경할 수 없는 상태에서 설정을 찾을 수 있습니다. RtlQueryRegistryValueWithFallback 을 사용하여 재정의 및 기본값이 있는 설정과 같은 쿼리 설정을 도울 수 있습니다.

내부 서비스 레지스트리 상태

내부 서비스 상태는 런타임에 작성되고 서비스 자체에서만 소유 및 관리되며 해당 서비스에만 액세스할 수 있는 상태입니다. 내부 서비스 상태의 위치에 액세스하려면 서비스에서 다음 함수 중 하나를 사용합니다.

서비스에서 다른 구성 요소에서 이러한 설정을 수정하도록 허용하려는 경우 서비스는 다른 구성 요소가 호출할 수 있는 인터페이스를 노출해야 합니다. 이 인터페이스는 이러한 설정을 변경하는 방법을 서비스에 알려줍니다. 예를 들어 Win32 서비스는 COM 또는 RPC 인터페이스를 노출할 수 있으며 드라이버 서비스는 디바이스 인터페이스를 통해 IOCTL 인터페이스를 노출할 수 있습니다.

공유 서비스 레지스트리 상태

공유 서비스 상태는 런타임에 기록되는 상태이며 충분한 권한이 있는 경우 다른 사용자 모드 구성 요소와 공유할 수 있습니다. 이 공유 서비스 상태의 위치에 액세스하려면 다음 함수 중 하나를 사용합니다.

파일 상태

이 섹션은 다음 하위 섹션을 포함합니다.

디바이스 파일 상태

디바이스와 관련된 파일을 런타임에 작성해야 하는 경우 OS API를 통해 제공되는 핸들 또는 파일 경로를 기준으로 해당 파일을 저장해야 합니다. 해당 디바이스와 관련된 구성 파일은 여기에 저장할 파일 형식의 한 예입니다. 이 상태의 위치에 액세스하려면 서비스에서 다음 함수 중 하나를 사용합니다.

서비스 파일 상태

서비스 파일 상태는 3가지 범주 중 하나로 분류할 수 있습니다.

변경할 수 없는 서비스 파일 상태

변경할 수 없는 서비스 파일 상태는 드라이버 패키지의 일부인 파일입니다. 이러한 파일에 액세스하는 방법에 대한 자세한 내용은 드라이버 저장소에서 실행을 참조하세요.

내부 서비스 파일 상태

내부 서비스 파일 상태는 런타임에 작성되고 서비스 자체에서만 소유 및 관리되며 해당 서비스에만 액세스할 수 있는 상태입니다. 내부 서비스 상태의 위치에 액세스하려면 서비스에서 다음 함수 중 하나를 사용합니다.

서비스에서 다른 구성 요소에서 이러한 설정을 수정하도록 허용하려는 경우 서비스는 다른 구성 요소가 호출할 수 있는 인터페이스를 노출하여 서비스에 이러한 설정을 변경하는 방법을 알려야 합니다. 예를 들어 Win32 서비스는 COM 또는 RPC 인터페이스를 노출할 수 있으며 드라이버 서비스는 디바이스 인터페이스를 통해 IOCTL 인터페이스를 노출할 수 있습니다.

공유 서비스 파일 상태

공유 서비스 파일 상태는 런타임에 작성되며 충분한 권한이 있는 경우 다른 사용자 모드 구성 요소와 공유할 수 있는 상태입니다. 이 공유 서비스 상태의 위치에 액세스하려면 다음 함수 중 하나를 사용합니다.

  • DirectoryType 매개 변수가 DriverDirectorySharedData로 설정된 IoGetDriverDirectory(WDM, KMDF)

  • DirectoryType 매개 변수가 ServiceSharedDirectoryPersistentState로 설정된 GetSharedServiceDirectory(Win32 Services)

DriverData 및 ProgramData

다른 구성 요소와 공유할 수 있지만 공유 서비스 파일 상태 범주에 맞지 않는 파일은 또는 ProgramData 위치에 쓸 DriverData 수 있습니다.

이러한 위치는 구성 요소에 다른 구성 요소에서 사용하고 다른 시스템에서 처리할 시스템에서 잠재적으로 수집 및 복사될 수 있는 임시 상태 또는 상태를 작성할 수 있는 위치를 제공합니다. 예를 들어 사용자 지정 로그 파일 또는 크래시 덤프는 이 설명에 적합합니다.

또는 ProgramData 디렉터리 루트 DriverData 에 파일을 쓰지 마세요. 대신 회사 이름으로 하위 디렉터리를 만든 다음 해당 디렉터리 내에서 파일 및 추가 하위 디렉터리를 작성합니다.

예를 들어 회사 이름 Contoso의 경우 커널 모드 드라이버는 에 사용자 지정 로그 \DriverData\Contoso\Logs 를 쓸 수 있고 사용자 모드 애플리케이션은 에서 %DriverData%\Contoso\Logs로그 파일을 수집하거나 분석할 수 있습니다.

DriverData

DriverData 디렉터리를 Windows 10 버전 1803 이상에서 사용할 수 있으며 관리자 및 UMDF 드라이버에서 액세스할 수 있습니다.

커널 모드 드라이버는 라는 \DriverData시스템 제공 기호 링크를 사용하여 디렉터리에 액세스 DriverData 합니다.

사용자 모드 프로그램은 환경 변수 %DriverData%DriverData 사용하여 디렉터리에 액세스합니다.

ProgramData

%ProgramData% 사용자 모드 환경 변수는 사용자 모드 구성 요소가 데이터를 저장할 때 사용할 수 있습니다.

임시 파일

임시 파일은 일반적으로 중간 작업에서 사용됩니다. 또는 환경 변수 아래의 하위 경로에 %TEMP%%TMP% 기록할 수 있습니다. 이러한 위치는 환경 변수를 통해 액세스되므로 이 기능은 사용자 모드 구성 요소로 제한됩니다. 이러한 임시 파일에 대한 핸들이 닫힌 후 이러한 임시 파일의 수명 또는 지속성에 대한 보장은 없습니다. 운영 체제 또는 사용자는 언제든지 제거할 수 있으며 다시 부팅 시 지속되지 않을 수 있습니다.

또는 %TMP% 디렉터리 루트 %TEMP% 에 파일을 쓰지 마세요. 대신 회사 이름으로 하위 디렉터리를 만든 다음 해당 디렉터리 내에서 파일 및 추가 하위 디렉터리를 작성합니다.

속성 상태

디바이스 및 디바이스 인터페이스는 모두 PnP 속성 모델을 통해 상태 저장을 지원합니다. 속성 모델을 사용하면 디바이스 또는 디바이스 인터페이스에 대해 구조적 속성 데이터를 저장할 수 있습니다. 이는 속성 모델에서 지원하는 속성 형식에 합리적으로 맞는 더 작은 데이터를 위한 것입니다.

디바이스 속성에 액세스하기 위해 다음 API를 사용할 수 있습니다.

디바이스 인터페이스 속성에 액세스하기 위해 다음 API를 사용할 수 있습니다.

디바이스 인터페이스 사용

드라이버가 다른 구성 요소가 드라이버의 내부 상태를 읽거나 수정하도록 허용하려는 경우 드라이버는 반환할 설정 또는 특정 설정을 수정하는 방법을 드라이버에 알려주는 다른 구성 요소가 호출할 수 있는 인터페이스를 노출해야 합니다. 예를 들어 드라이버 서비스는 디바이스 인터페이스를 통해 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 및 DriverRegKeyPersistentStateRegKeyTypeIoOpenDriverRegistryKey
IoGetDeviceDirectory
DriverDirectoryImage 및 DriverDirectoryDataDirectoryType에 대한 IoGetDriverDirectory
Windows 10 1809 RtlQueryRegistryValueWithFallback
Windows 11 21H2 DriverRegKeySharedPersistentStateRegKeyTypeIoOpenDriverRegistryKey
DriverDirectorySharedDataDirectoryType에 대한 IoGetDriverDirectory

KMDF 드라이버

KMDF 버전 추가된 지원
1.0 WdfDeviceOpenRegistryKey
WdfFdoInitOpenRegistryKey
WdfDriverOpenParametersRegistryKey
WdfDeviceQueryProperty
WdfDeviceAllocAndQueryProperty
WdfFdoInitQueryProperty
WdfFdoInitAllocAndQueryProperty
1.13 WdfDeviceQueryPropertyEx
WdfDeviceAllocAndQueryPropertyEx
WdfDeviceAssignProperty
WdfFdoInitQueryPropertyEx
WdfFdoInitAllocAndQueryPropertyEx
1.25 WdfDriverOpenPersistentStateRegistryKey(Windows 10 1803)

UMDF 드라이버

UMDF 버전 추가된 지원
2.0 WdfDeviceOpenRegistryKey
WdfFdoInitOpenRegistryKey
WdfDriverOpenParametersRegistryKey
WdfDeviceQueryProperty
WdfDeviceAllocAndQueryProperty
WdfDeviceQueryPropertyEx
WdfDeviceAllocAndQueryPropertyEx
WdfDeviceAssignProperty
WdfFdoInitQueryProperty
WdfFdoInitAllocAndQueryProperty
WdfFdoInitQueryPropertyEx
WdfFdoInitAllocAndQueryPropertyEx
WdfDeviceQueryInterfaceProperty(Windows 8.1)
WdfDeviceAllocAndQueryInterfaceProperty(Windows 8.1)
WdfDeviceAssignInterfaceProperty(Windows 8.1)
2.25 WdfDeviceRetrieveDeviceDirectoryString
WdfDriverOpenPersistentStateRegistryKey(Windows 10 1803)
2.27 WdfDriverRetrieveDriverDataDirectoryString

사용자 모드 코드

운영 체제 추가된 지원
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