UMDF 드라이버에서 디바이스 풀링 사용

UMDF(User-Mode Driver Framework) 버전 1.11 및 2.0

UMDF(User-Mode Driver Framework) 드라이버가 버전 1.11 또는 2.0으로 빌드되고 Windows 8 이상에서 실행되는 경우 프레임워크는 여러 디바이스 스택을 호스트할 수 있는 Wudfhost의 단일 instance 만듭니다. 이 기술을 디바이스 풀링이라고 합니다. 디바이스 풀링의 기본 이점은 여러 UMDF 디바이스가 있는 환경에서 메모리 소비가 감소하는 것입니다.

풀된 디바이스가 실패하면 프레임워크는 Wudfhost의 instance 종료하고 이전에 풀에 있던 모든 디바이스를 다시 시작하려고 시도합니다. 풀을 풀하는 동안 디바이스가 다시 실패하면 프레임워크는 디바이스에 대해 별도의 Wudfhost 프로세스를 만들고 디바이스를 다시 시작하려고 시도합니다.

별도의 호스트 프로세스에서 디바이스가 실패하면 프레임워크는 디바이스를 최대 5번 다시 시작하려고 시도합니다. 프레임워크는 마지막 오류 이후 30분이 경과하면 디바이스 오류 수를 1로 다시 설정합니다.

시스템이 다시 부팅되면 프레임워크는 별도의 프로세스에서 실행하는 동안 실패한 디바이스를 제외하고 디바이스를 다시 풀합니다.

특정 디바이스에 대해 디바이스 풀링을 사용하지 않도록 설정하려면 INF의 WDF 관련 DDInstall 섹션에서 UmdfHostProcessSharing 지시문을 사용합니다. UmdfHostProcessSharing에 대한 자세한 내용은 INF 파일에서 WDF 지시문 지정을 참조하세요.

드라이버에서 직접 I/O를 사용하는 경우 UmdfHostProcessSharing을ProcessSharingDisabled로 설정해야 합니다. 그렇지 않으면 드라이버가 시작되지 않을 수 있습니다. WdfDeviceIoBufferedOrDirect를 선택하고 디바이스가 풀링된 경우 프레임워크는 버퍼 액세스 메서드를 버퍼링된 I/O로 변경합니다. WdfDeviceIoBufferedOrDirect를 선택하고 디바이스가 풀링되지 않은 경우 프레임워크는 버퍼 액세스 메서드를 직접 I/O로 변경합니다.

버퍼 액세스 방법을 선택하려면 드라이버가 IDriverEntry::OnDeviceAdd 콜백 함수에서 IWDFDeviceInitialize2::SetIoTypePreference 메서드를 호출해야 합니다. 액세스 방법에 대한 자세한 내용은 UMDF-Based 드라이버에서 데이터 버퍼 액세스를 참조하세요.

UMDF 버전 1.9 이하

드라이버가 UMDF 버전 1.9 이하로 빌드된 경우 프레임워크는 각 디바이스 스택에 대한 호스트 프로세스(Wudfhost)의 별도 instance 만듭니다.

디바이스를 시작하지 못하면 프레임워크는 디바이스를 최대 5번 다시 시작하려고 시도합니다. 프레임워크는 마지막 오류 이후 30분이 경과하면 디바이스 오류 수를 1로 다시 설정합니다.

풀되지 않은 환경에서 여러 디바이스 스택이 동일한 UMDF 드라이버를 공유하는 경우:

  • 각 디바이스 스택은 별도의 WudfHost 프로세스에서 로드됩니다.
  • 프레임워크는 각 디바이스 스택에 대해 드라이버의 IDriverEntry::OnInitializeIDriverEntry::OnDeinitialize 메서드를 한 번 호출합니다.
  • 프레임워크는 각 디바이스 스택에 대해 드라이버의 IDriverEntry::OnDeviceAdd 메서드를 한 번 호출합니다. 각 디바이스 개체는 별도의 드라이버 개체와 연결됩니다.

풀된 환경에서 여러 디바이스 스택이 동일한 사용자 모드 드라이버를 공유하는 경우:

  • 각 디바이스 스택은 동일한 WudfHost 프로세스에서 로드됩니다.
  • 프레임워크는 드라이버의 IDriverEntry::OnInitializeIDriverEntry::OnDeinitialize 메서드를 한 번만 호출합니다.
  • 프레임워크는 각 디바이스 스택에 대해 드라이버의 IDriverEntry::OnDeviceAdd 메서드를 한 번 호출합니다. 각 디바이스 개체는 동일한 드라이버 개체와 연결됩니다.

풀된 구성에 드라이버 개체가 하나만 있기 때문에 드라이버는 디바이스별 컨텍스트를 전역 변수 또는 드라이버 콜백 개체와 같이 디바이스 간에 공유되는 개체에 저장해서는 안 됩니다. 대신 드라이버는 디바이스 스택 간에 공유되지 않는 개체(예: 드라이버의 디바이스 콜백 개체)에 디바이스별 컨텍스트를 저장해야 합니다.