다음을 통해 공유


USB 클라이언트 드라이버를 개발하기 위한 드라이버 모델 선택

이 문서에서는 디바이스의 함수 드라이버 역할을 하는 USB 클라이언트 드라이버를 개발하기 위한 최상의 드라이버 모델을 선택하는 지침을 제공합니다.

USB 디바이스 제조업체는 종종 애플리케이션이 디바이스의 기능에 액세스할 수 있는 방법을 제공해야 합니다. USB 디바이스에 액세스하기 위한 최상의 메커니즘을 선택하려면 가장 간단한 접근 방식부터 시작하고 필요한 경우에만 더 복잡한 솔루션으로 이동합니다. 다음 목록에는 이 문서에서 설명하는 선택 항목이 요약되어 있습니다.

  1. 디바이스가 Windows에 받은 편지함 드라이버가 포함된 USB 디바이스 클래스에 속하는 경우 드라이버를 작성할 필요가 없습니다.
  2. 디바이스에 Microsoft 제공 클래스 드라이버가 없고 단일 애플리케이션만 디바이스에 액세스하는 경우 WinUSB를 함수 드라이버로 로드합니다.
  3. 동시 애플리케이션에서 디바이스에 액세스하고 디바이스에 동시 엔드포인트가 없는 경우 UMDF 기반 클라이언트 드라이버를 작성합니다.
  4. 클래스 드라이버, WinUSB 또는 UMDF 솔루션이 적합한 옵션이 아닌 경우 KMDF 기반 클라이언트 드라이버를 작성합니다.
  5. KMDF에서 특정 기능을 지원하지 않는 경우 WDM 루틴을 호출하는 하이브리드 드라이버를 작성합니다.

가장 일반적인 방법은 디바이스 드라이버(이 설명서 집합에서 USB 클라이언트 드라이버라고도 함)를 구현하고 Microsoft에서 제공하는 USB 드라이버 스택 위의 디바이스 스택에 드라이버를 함수 드라이버로 설치하는 설치 패키지를 제공하는 것입니다. 클라이언트 드라이버는 애플리케이션이 디바이스의 파일 핸들을 가져오는 데 사용할 수 있는 디바이스 인터페이스를 노출합니다. 그러면 애플리케이션에서 이 파일 핸들을 사용하여 Windows API를 호출하여 드라이버와 통신할 수 있습니다.

디바이스의 요구 사항에 맞게 사용자 지정된 드라이버를 작성하는 것이 USB 디바이스에 대한 액세스를 제공하는 가장 유연한 방법입니다. 그러나 드라이버를 구현하려면 많은 작업이 필요합니다. 드라이버는 다음과 같은 복잡한 작업을 수행해야 합니다.

  • 새 디바이스가 검색될 때 드라이버 초기화
  • 전원 관리
  • I/O 작업
  • 서프라이즈 디바이스 제거
  • 상태 관리
  • 디바이스가 제거될 때 정리

드라이버를 작성하도록 선택하기 전에 다음 질문을 합니다.

Microsoft에서 제공하는 드라이버를 사용할 수 있나요?

다음과 같은 경우 드라이버를 작성할 필요가 없을 수 있습니다.

  • 디바이스는 Microsoft에서 지원하는 USB 디바이스 클래스에 속합니다.

    이 경우 해당 클래스 드라이버가 디바이스 드라이버로 로드됩니다. Windows에 받은 편지함 드라이버가 포함된 디바이스 클래스 목록은 Windows에 포함된 USB 디바이스 클래스 드라이버를 참조하세요.

  • 디바이스가 디바이스 클래스에 속하지 않습니다.

    이러한 디바이스의 경우 디바이스 기능을 평가하여 Microsoft에서 제공하는 WinUSB (Winusb.sys)를 디바이스의 함수 드라이버로 로드할 수 있는지 여부를 결정합니다. 다음과 같은 경우 WinUSB를 사용하는 것이 가장 좋은 솔루션입니다.

    • 디바이스는 단일 애플리케이션에서 액세스합니다.

    • 디바이스는 대량, 인터럽트 또는 등시 엔드포인트를 지원합니다.

    • 디바이스는 WINDOWS SP2(서비스 팩 2) 이상 버전에서 Windows XP를 실행하는 대상 컴퓨터에서 작동합니다.

      WinUSB를 함수 드라이버로 로드하면 사용자 지정 USB 드라이버를 구현하는 보다 간단한 대안이 제공됩니다. 예를 들어 WinUSB는 디바이스로 패키지된 애플리케이션에서만 액세스하는 전자 기상 관측소의 기본 방법입니다. 디바이스와의 진단 통신 및 깜박이는 펌웨어에도 유용합니다.

      애플리케이션이 Winusb.sys 요청을 쉽게 보낼 수 있도록 WinUSB 함수를 노출 하는 사용자 모드 DLL(Winusb.dll)을 제공합니다. 애플리케이션은 해당 함수를 호출하여 디바이스에 액세스하고, 구성하고, 디바이스의 엔드포인트로 데이터를 전송할 수 있습니다.

      다음과 같은 경우 WinUSB는 옵션이 아닙니다.

    • 디바이스는 여러 애플리케이션에서 액세스합니다.

    • 디바이스에는 Windows 운영 체제에서 커널 모드가 이미 지원되는 함수가 있습니다. 예를 들어 TAPI에서 지원하는 모뎀 함수 또는 LAN 함수(NDIS가 지원하는)의 경우 Usbser.sys 드라이버가 지원하는 인터페이스를 사용하여 사용자 모드 소프트웨어를 사용하여 모뎀 디바이스를 관리해야 합니다.

      Windows 8부터 WinUSB용 INF 설치에 호환 ID를 추가했습니다. 디바이스 펌웨어에 호환 ID가 포함된 경우 WinUSB는 기본적으로 디바이스의 함수 드라이버로 로드됩니다. 즉, 하드웨어 제조업체는 WinUSB 디바이스에 대해 INF 파일을 배포할 필요가 없습니다. 자세한 내용은 WinUSB 디바이스를 참조 하세요.

USB 클라이언트 드라이버를 작성하는 경우 어떤 드라이버 모델이 가장 적합한가요?

대답은 디바이스 디자인에 따라 달라집니다. 먼저 특정 드라이버 모델이 요구 사항을 충족하는지 확인합니다. 일부 디자인 고려 사항은 여러 동시 애플리케이션에서 USB 디바이스에 액세스하고 등시 엔드포인트를 통한 데이터 스트리밍을 지원하는지 여부에 따라 결정됩니다.

드라이버를 작성하도록 선택하는 경우 옵션은 다음과 같습니다.

  • UMDF(사용자 모드 드라이버 프레임워크 )

    UMDF는 클라이언트 드라이버가 플러그 앤 플레이 Manager 및 Power Manager와 같은 Windows 구성 요소와 통합하는 데 사용할 수 있는 DDI(디바이스 드라이버 인터페이스)를 제공합니다. 또한 UMDF는 사용자 모드에서 하드웨어를 추상화하고 드라이버에 대한 I/O 작업을 간소화하는 USB 디바이스용 특수 대상 개체를 제공합니다. WDF는 UMDF 인터페이스 외에도 사용자 모드 드라이버를 위한 향상된 디버거 확장 및 추적 도구를 제공합니다. UMDF는 COM(구성 요소 개체 모델)을 기반으로 하며 C++ 개발자가 사용자 모드 드라이버를 개발하는 것이 더 쉽습니다.

    다음 경우에 USB 디바이스에 대한 UMDF 기반 클라이언트 드라이버를 구현합니다.

    • 디바이스는 여러 애플리케이션에서 동시에 액세스합니다.

    • 디바이스는 대량 또는 인터럽트 전송을 지원합니다.

      사용자 모드에서 실행되는 드라이버는 (가상) 사용자 주소 공간에만 액세스하고 시스템에 더 낮은 위험을 초래할 수 있습니다. 커널 모드 드라이버는 시스템 주소 공간 및 내부 시스템 구조에 액세스할 수 있습니다. 잘못 코딩된 커널 모드 드라이버로 인해 다른 드라이버나 시스템에 영향을 주는 문제가 발생하여 결국 컴퓨터가 충돌할 수 있습니다. 따라서 사용자 모드 드라이버는 보안 및 안정성 측면에서 커널 모드 드라이버보다 안전할 수 있습니다.

      사용자 모드 드라이버의 또 다른 장점은 모든 Win32 API를 사용할 수 있다는 것입니다. 예를 들어 드라이버는 Winsock, 압축, 암호화 API 등과 같은 API를 호출할 수 있습니다. 이러한 API는 커널 모드 드라이버에서 사용할 수 없습니다.

      UMDF 기반 클라이언트 드라이버는 등시 엔드포인트를 지원하는 USB 디바이스에 대한 옵션이 아닙니다.

      참고 항목

      Windows 8.1에서는 UMDF 버전 2.0이 도입되었습니다. UMDF 버전 2.0을 사용하면 KMDF 드라이버에서 사용할 수 있는 많은 메서드를 호출하는 UMDF 드라이버를 C 프로그래밍 언어로 작성할 수 있습니다. UMDF 버전 2.0을 사용하여 USB용 하위 필터 드라이버를 작성할 수 없습니다.

  • KMDF(커널 모드 드라이버 프레임워크 )

    KMDF는 새로운 유형의 하드웨어를 지원하도록 드라이버 모델을 쉽게 확장할 수 있도록 설계되었습니다. KMDF는 이전 WDM(Windows 드라이버 모델) 드라이버보다 커널 모드 USB 드라이버를 더 쉽게 구현할 수 있도록 하는 DDI 및 데이터 구조를 제공합니다. 또한 KMDF는 Microsoft USB 드라이버 스택을 사용하는 완벽하게 작동하는 클라이언트 드라이버를 작성하는 데 사용할 수 있는 특수 입력/출력(I/O) 대상을 제공합니다.

    특정 기능이 KMDF를 통해 노출되지 않는 경우 드라이버는 WDM 루틴을 호출해야 합니다. 드라이버는 전체 WDM 인프라를 구현할 필요는 없지만 KMDF 메서드를 사용하여 선택한 WDM 루틴 집합에 액세스합니다. 예를 들어 등시 전송을 수행하기 위해 KMDF 기반 클라이언트 드라이버는 요청을 설명하는 WDM 스타일 URL을 USB 드라이버 스택에 보낼 수 있습니다. 이러한 드라이버를 이 설명서 집합에서 하이브리드 드라이버라고 합니다.

    KMDF는 포트 미니포트 드라이버 모델도 지원합니다. 예를 들어 위쪽 가장자리에서 커널 스트리밍을 사용하는 커널 스트리밍 미니포트 드라이버(예: USB 웹캠)는 KMDF USB I/O 대상 개체를 사용하여 USB 드라이버 스택에 요청을 보낼 수 있습니다. USB와 같은 프로토콜 기반 버스에 KMDF를 사용하여 NDIS 드라이버를 작성할 수도 있습니다.

    순수 WDM 드라이버는 쓰기가 어렵고 복잡하며 견고하지 않습니다. KMDF가 진화하면서 이러한 유형의 드라이버를 더 이상 작성할 필요가 없습니다.

Microsoft Visual Studio에는 각각 UMDF 및 KMDF USB 클라이언트 드라이버에 대한 시작 코드를 생성하는 USB 사용자 모드 드라이버 및 USB 커널 모드 드라이버 템플릿이 포함되어 있습니다. 템플릿 코드는 하드웨어와의 통신을 사용하도록 USB 대상 디바이스 개체를 초기화합니다. 자세한 내용은 다음 문서를 참조하세요.

UMDF 및 KMDF 드라이버를 구현하는 방법에 대한 자세한 내용은 Windows 드라이버 파운데이션을 사용한 Microsoft Press 책 개발 드라이버를 참조하세요.

WinUSB, UMDF, KMDF 기능 비교

다음 표에는 WinUSB, UMDF 기반 USB 드라이버 및 KMDF 기반 USB 드라이버의 기능이 요약되어 있습니다.

기능 WinUSB UMDF KMDF
여러 동시 애플리케이션 지원
애플리케이션 주소 공간에서 드라이버 주소 공간 격리 아니요
대량, 인터럽트 및 제어 전송 지원
등시 전송 지원 4
USB 스택에 오버레이 계층으로 필터 드라이버와 같은 커널 모드 드라이버 설치를 지원합니다. 아니요 아니요
선택적 일시 중단 및 대기/절전 모드 해제 상태를 지원합니다.

다음 표에서는 여러 버전의 Windows에서 지원하는 WDF 옵션을 요약합니다.

Windows 버전 WinUSB UMDF KMDF
Windows 11
Windows 10
Windows 8
Windows 7
Windows Vista 1 1
Windows Server 2003 아니요 아니요
Windows XP 2 2
Microsoft Windows 2000 아니요 아니요 3

1: WinUSB 및 UMDF는 x86 기반 및 x64 기반 버전의 Windows에서만 지원됩니다.

2: WINUSB 및 UMDF는 Windows XP에서 SP2(서비스 팩 2) 이상 버전의 Windows에서 지원됩니다.

3: KMDF는 Windows 2000에서 SP4 이상 버전의 Windows에서 지원됩니다.

4: 등시 전송은 Windows 8.1 이상 버전의 Windows에서 지원됩니다.

SP2를 사용하는 32비트 버전의 Windows XP의 모든 클라이언트 SKU는 WinUSB를 지원합니다. WinUSB는 Windows XP의 네이티브가 아니며 WinUSB 코인스탈러와 함께 설치해야 합니다. 모든 Windows Vista SKU 및 이후 버전의 Windows는 WinUSB를 지원합니다.