WinUSB 디바이스

이 문서에서는 Windows에서 WinUSB 디바이스를 인식하는 방법에 대해 알아봅니다.

이 문서의 정보는 OEM 또는 IHV(독립 하드웨어 공급업체)가 Winusb.sys 함수 드라이버로 사용하고 사용자 지정 INF를 제공하지 않고도 자동으로 드라이버를 로드하려는 디바이스를 개발하는 경우에 적용됩니다.

WinUSB 디바이스란?

WinUSB 디바이스는 호환되는 ID를 "WINUSB"로 보고하는 특정 Microsoft OS(운영 체제) 기능 설명자를 정의하는 USB(유니버설 직렬 버스) 디바이스입니다.

WinUSB 디바이스의 목적은 Windows가 사용자 지정 INF 파일 없이 디바이스의 함수 드라이버로 Winusb.sys 로드할 수 있도록 하는 것입니다. WinUSB 디바이스의 경우 디바이스에 대해 INF 파일을 배포할 필요가 없으므로 최종 사용자가 드라이버 설치 프로세스를 간단하게 만들 수 있습니다. 반대로 사용자 지정 INF를 제공해야 하는 경우 디바이스를 WinUSB 디바이스로 정의하고 INF에서 디바이스의 하드웨어 ID를 지정해서는 안 됩니다.

Microsoft는 USB 디바이스의 디바이스 드라이버로 Winusb.sys 설치하는 데 필요한 정보를 포함하는 Winusb.inf를 제공합니다.

Windows 8 전에 Winusb.sys 함수 드라이버로 로드하려면 사용자 지정 INF를 제공해야 했습니다. 사용자 지정 INF는 디바이스별 하드웨어 ID를 지정하고 기본 제공 Winusb.inf의 섹션도 포함합니다. 이러한 섹션은 서비스를 인스턴스화하고, 받은 편지함 이진 파일을 복사하고, 애플리케이션이 디바이스를 찾고 통신하는 데 필요한 디바이스 인터페이스 GUID를 등록하는 데 필요합니다. 사용자 지정 INF를 작성하는 방법에 대한 자세한 내용은 WinUSB(Winusb.sys) 설치를 참조하세요.

Windows 8 Windows가 INF와 WinUSB 디바이스를 자동으로 일치시킬 수 있도록 In-box Winusb.inf 파일이 업데이트되었습니다.

기본 제공 Winusb.inf를 사용하여 WinUSB 디바이스 설치

Windows 8 기본 제공 Winusb.inf 파일이 업데이트되었습니다. INF에는 "USB\MS_COMP_WINUSB"라는 호환 ID를 참조하는 설치 섹션이 포함되어 있습니다.

[Generic.Section.NTamd64]
%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB

업데이트된 INF에는 "USBDevice"라는 새 설정 클래스도 포함되어 있습니다.

"USBDevice" 설정 클래스는 Microsoft가 기본 제공 드라이버를 제공하지 않는 디바이스에서 사용할 수 있습니다. 일반적으로 이러한 디바이스는 오디오, Bluetooth 등과 같은 잘 정의된 USB 클래스에 속하지 않으며 사용자 지정 드라이버가 필요합니다. 디바이스가 WinUSB 디바이스인 경우 디바이스가 USB 클래스에 속하지 않을 가능성이 높습니다. 따라서 디바이스를 "USBDevice" 설정 클래스 아래에 설치해야 합니다. 업데이트된 Winusb.inf는 해당 요구 사항을 용이하게 합니다.

USBDevice 클래스 사용 정보

분류되지 않은 디바이스에는 "USB" 설정 클래스를 사용하지 마세요. 해당 클래스는 컨트롤러, 허브 및 복합 디바이스를 설치하기 위해 예약되어 있습니다. "USB" 클래스를 잘못 사용하면 상당한 안정성 및 성능 문제가 발생할 수 있습니다. 분류되지 않은 디바이스의 경우 "USBDevice"를 사용합니다.

Windows 8 "USBDevice" 디바이스 클래스를 사용하려면 INF에 이 클래스를 추가하기만 하면 됩니다.

  [Version]
  ...
  Class=USBDevice
  ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
  ...

장치 관리자 새 노드 USB 유니버설 직렬 버스 디바이스가 표시되고 해당 노드 아래에 디바이스가 나타납니다.

Windows 7에서는 이전 줄 외에도 INF에서 이러한 레지스트리 설정을 만들어야 합니다.

  ;---------- Add Registry Section ----------
  [USBDeviceClassReg]
  HKR,,,,"Universal Serial Bus devices"
  HKR,,NoInstallClass,,1
  HKR,,SilentInstall,,1
  HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"

장치 관리자 USB 유니버설 직렬 버스 디바이스 아래에 디바이스가 표시되는 것을 볼 수 있습니다. 그러나 디바이스 클래스 설명은 INF에 지정된 레지스트리 설정에서 파생됩니다.

"USBDevice" 클래스는 WinUSB로 제한되지 않습니다. 디바이스에 대한 사용자 지정 드라이버가 있는 경우 사용자 지정 INF에서 "USBDevice" 설정 클래스를 사용할 수 있습니다.

디바이스 열거 중에 USB 드라이버 스택은 디바이스에서 호환되는 ID를 읽습니다. 호환 ID가 "WINUSB"인 경우 Windows는 이를 디바이스 식별자로 사용하고 업데이트된 기본 제공 Winusb.inf에서 일치 항목을 찾은 다음 Winusb.sys 디바이스의 함수 드라이버로 로드합니다.

이 이미지는 WinUSB 디바이스로 정의되고 결과적으로 Winusb.sys 디바이스의 함수 드라이버로 로드되는 단일 인터페이스 MUTT 디바이스용입니다.

WinUSB 디바이스를 보여 주는 Windows 장치 관리자 스크린샷

Windows 8 이전 버전의 Windows의 경우 업데이트된 Winusb.inf는 Windows 업데이트 통해 사용할 수 있습니다. 컴퓨터가 자동으로 드라이버 업데이트를 받도록 구성된 경우 WinUSB 드라이버는 새 INF 패키지를 사용하여 사용자 개입 없이 설치됩니다.

WinUSB 디바이스에 대한 디바이스 설명을 변경하는 방법

WinUSB 디바이스의 경우 장치 관리자 "WinUsb 디바이스"를 디바이스 설명으로 표시합니다. 해당 문자열은 Winusb.inf에서 파생됩니다. 여러 WinUSB 디바이스가 있는 경우 모든 디바이스는 동일한 디바이스 설명을 가져옵니다.

장치 관리자 디바이스를 고유하게 식별하고 구분하기 위해 Windows 8 INF의 설명보다 디바이스에서 보고한 디바이스 설명(iProduct 문자열 설명자)에 우선 순위를 부여하도록 시스템에 지시하는 새 속성을 디바이스 클래스에 제공합니다. Windows 8 정의된 "USBDevice" 클래스는 이 속성을 설정합니다. 즉, 디바이스가 "USBDevice" 클래스 아래에 설치되면 시스템은 디바이스에 디바이스 설명을 쿼리하고 장치 관리자 문자열을 쿼리에서 검색된 항목으로 설정합니다. 이 경우 INF에 제공된 디바이스 설명은 무시됩니다. 앞의 이미지에서 디바이스 설명 문자열인 "MUTT"를 확인합니다. 문자열은 제품 문자열 설명자의 USB 디바이스에서 제공됩니다.

새 클래스 속성은 이전 버전의 Windows에서 지원되지 않습니다. 이전 버전의 Windows에서 사용자 지정 디바이스 설명을 사용하려면 사용자 지정 INF를 작성해야 합니다.

WinUSB 디바이스를 구성하는 방법

USB 디바이스를 WinUSB 디바이스로 식별하려면 디바이스 펌웨어에 Microsoft OS 설명자가 있어야 합니다. 설명자에 대한 자세한 내용은 Microsoft OS 설명자에 설명된 사양을 참조하세요.

확장 기능 설명자 지원

USB 드라이버 스택이 디바이스가 확장 기능 설명자를 지원한다는 것을 알려면 디바이스가 문자열 인덱스 0xEE 저장된 OS 문자열 설명자를 정의해야 합니다. 열거 중에 드라이버 스택은 문자열 설명자를 쿼리합니다. 설명자가 있는 경우 드라이버 스택은 디바이스에 하나 이상의 OS 기능 설명자와 해당 기능 설명자를 검색하는 데 필요한 데이터가 포함되어 있다고 가정합니다.

검색된 문자열 설명자에는 bMS_VendorCode 필드 값이 있습니다. 값은 USB 드라이버 스택이 확장 기능 설명자를 검색하는 데 사용해야 하는 공급업체 코드를 나타냅니다.

OS 문자열 설명자를 정의하는 방법에 대한 자세한 내용은 Microsoft OS 설명자에 설명된 사양의 " OS 문자열 설명자"를 참조하세요.

호환되는 ID 설정

기본 제공 Winusb.inf와 일치하고 WinUSB 드라이버 모듈을 로드하는 데 필요한 확장 호환 ID OS 기능 설명자입니다.

확장 호환 ID OS 기능 설명자에는 헤더 섹션과 디바이스가 복합 디바이스인지 비 복합 디바이스인지에 따라 하나 이상의 함수 섹션이 포함됩니다. 헤더 섹션은 전체 설명자의 길이, 함수 섹션 수 및 버전 번호를 지정합니다. 비 복합 디바이스의 경우 헤더 뒤에 디바이스의 유일한 인터페이스와 연결된 하나의 함수 섹션이 잇습니다. 해당 섹션의 compatibleID 필드는 "WINUSB"를 필드 값으로 지정해야 합니다. 복합 디바이스의 경우 여러 함수 섹션이 있습니다. 각 함수 섹션의 compatibleID 필드는 "WINUSB"를 지정해야 합니다.

디바이스 인터페이스 GUID 등록

디바이스 인터페이스 GUID를 등록하는 데 필요한 확장 속성 OS 기능 설명자입니다. GUID는 애플리케이션 또는 서비스에서 디바이스를 찾고, 디바이스를 구성하고, I/O 작업을 수행하는 데 필요합니다.

이전 버전의 Windows에서는 사용자 지정 INF를 통해 디바이스 인터페이스 GUID 등록이 수행됩니다. Windows 8 디바이스는 확장 속성 OS 기능 설명자를 사용하여 인터페이스 GUID를 보고해야 합니다.

확장 속성 OS 기능 설명자에는 하나 이상의 사용자 지정 속성 섹션 뒤에 헤더 섹션이 포함됩니다. 헤더 섹션에서는 총 길이, 버전 번호 및 사용자 지정 속성 섹션 수를 포함하여 전체 확장 속성 설명자를 설명합니다. 디바이스 인터페이스 GUID를 등록하려면 bPropertyName 필드를 "DeviceInterfaceGUID"로 설정하고 wPropertyNameLength 를 40바이트로 설정하는 사용자 지정 속성 섹션을 추가합니다. GUID 생성기를 사용하여 고유한 디바이스 인터페이스 GUID를 생성하고 bPropertyData 필드를 해당 GUID로 설정합니다(예: "{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}"). GUID는 유니코드 문자열로 지정되고 문자열 길이는 78바이트(null 종결자 포함)입니다.

       
bPropertyData 78바이트 7B 00 38 00 46 00 45 00 36 00 44 00 34 00 37 00 2D 00 34 00 39 00 00 44 00 2D 00 34 00 31 00 45 00 37 00 2D 00 39 00 34 00 38 00 36 00 2D 00 34 00 39 00 41 00 46 0 0 43 00 36 00 42 00 46 00 45 00 34 00 37 00 35 00 7D 00 00 00 속성 값은 {8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}입니다.

디바이스 열거 중에 USB 드라이버 스택은 확장 속성 OS 기능 설명자에서 DeviceInterfaceGUID 값을 검색하고 디바이스의 하드웨어 키에 디바이스를 등록합니다. 애플리케이션은 SetupDiXxx API 를 사용하여 값을 검색할 수 있습니다( SetupDiOpenDevRegKey 참조). 자세한 내용은 WinUSB 함수를 사용하여 USB 디바이스에 액세스하는 방법을 참조하세요.

WinUSB 전원 관리 기능 사용 또는 사용 안 함

Windows 8 전에 WinUSB의 전원 관리 기능을 구성하려면 HW에 레지스트리 항목 값을 작성해야 했습니다. 사용자 지정 INF의 AddReg 섹션입니다.

Windows 8 이상에서는 디바이스에서 전원 설정을 지정할 수 있습니다. 해당 디바이스에 대해 WinUSB에서 기능을 사용하거나 사용하지 않도록 설정하는 확장 속성 OS 기능 설명자를 통해 값을 보고할 수 있습니다. 구성할 수 있는 두 가지 기능인 선택적 일시 중단 및 시스템 절전 모드 해제가 있습니다. 선택적 일시 중단을 사용하면 디바이스가 유휴 상태일 때 저전력 상태로 전환할 수 있습니다. 시스템 절전 모드 해제는 시스템이 저전력 상태일 때 디바이스가 시스템을 절전 모드에서 해제하는 기능을 나타냅니다.

WinUSB의 전원 관리 기능에 대한 자세한 내용은 WinUSB 전원 관리를 참조하세요.

속성 이름 Description
DeviceIdleEnabled 이 값은 유휴 상태일 때 디바이스의 전원이 끊어질 수 있음을 나타내기 위해 1로 설정됩니다(선택적 일시 중단).
DefaultIdleState 이 값은 기본적으로 유휴 상태일 때 디바이스가 일시 중단될 수 있음을 나타내기 위해 1로 설정됩니다.
DefaultIdleTimeout 이 값은 디바이스가 유휴 상태임을 확인하기 전에 대기할 시간(밀리초)을 나타내기 위해 밀리초 단위로 설정됩니다.
UserSetDeviceIdleEnabled 이 값은 사용자가 USB 선택적 일시 중단을 사용하거나 사용하지 않도록 설정하는 디바이스의 기능을 제어할 수 있도록 1로 설정됩니다. 검사 상자 컴퓨터가 디바이스 전원 관리 속성 페이지에서 전원을 절약하기 위해 이 디바이스를 끄도록 허용하고 사용자가 USB 선택적 일시 중단을 사용하거나 사용하지 않도록 설정하려면 상자를 검사 선택 취소할 수 있습니다.
SystemWakeEnabled 이 값은 사용자가 저전력 상태에서 시스템을 절전 모드 해제하는 디바이스의 기능을 제어할 수 있도록 1로 설정됩니다. 사용하도록 설정하면 디바이스 전원 관리 속성 페이지에 컴퓨터 검사 절전 모드 해제 허용 상자가 나타납니다. 사용자는 확인란을 검사 선택 취소하여 USB 시스템 절전 모드 해제를 사용하거나 사용하지 않도록 설정할 수 있습니다.

예를 들어 디바이스에서 선택적 일시 중단을 사용하도록 설정하려면 bPropertyName 필드를 유니코드 문자열인 "DeviceIdleEnabled" 및 wPropertyNameLength 를 36바이트로 설정하는 사용자 지정 속성 섹션을 추가합니다. bPropertyData 필드를 "0x00000001"로 설정합니다. 속성 값은 little-endian 32비트 정수로 저장됩니다.

열거하는 동안 USB 드라이버 스택은 확장 속성 기능 설명자를 읽고 이 키 아래에 레지스트리 항목을 만듭니다.

Hkey_local_machine\시스템\CurrentControlSet\열거형\Usb\<디바이스 식별자>\<인스턴스 식별자>\디바이스 매개 변수

이 이미지는 WinUSB 디바이스에 대한 샘플 설정을 보여줍니다.

WinUSB 디바이스에 대한 설정을 보여 주는 Windows 레지스트리 편집기의 스크린샷

추가 예제는 Microsoft OS 설명자의 사양을 참조하세요.