USB 디바이스용 Windows 데스크톱 앱
이 문서에서는 애플리케이션이 WinUSB 함수를 호출하여 USB 디바이스와 통신하는 방법에 대해 알아봅니다. 이러한 애플리케이션 의 경우 WinUSB (Winusb.sys)를 디바이스의 함수 드라이버로 설치해야 합니다. 디바이스의 커널 모드 스택에 있는 WinUSB입니다. 이 드라이버는 \Windows\System32\drivers 폴더의 Windows에 포함되어 있습니다.
Winusb.sys USB 디바이스의 함수 드라이버로 사용하는 경우 애플리케이션에서 WinUSB 함수를 호출하여 디바이스와 통신할 수 있습니다. 사용자 모드 DLL Winusb.dll 노출되는 이러한 함수는 통신 프로세스를 간소화합니다. 애플리케이션은 표준 USB 작업(예: 디바이스 구성, 제어 요청 보내기 및 디바이스 간 데이터 전송)을 수행하기 위해 디바이스 I/O 제어 요청을 생성하는 대신 동등한 WinUSB 함수를 호출합니다.
Winusb.dll 애플리케이션 제공 데이터를 사용하여 적절한 디바이스 I/O 제어 요청을 생성한 다음 처리를 위해 Winusb.sys 요청을 보냅니다. USB 스택과 통신하기 위해 WinUSB 함수는 애플리케이션의 요청과 상관 관계가 있는 적절한 IOCTL을 사용하여 DeviceIoControl 함수를 호출합니다. 요청이 완료되면 WinUSB 함수는 Winusb.sys 반환된 모든 정보(예: 읽기 요청의 데이터)를 호출 프로세스에 다시 전달합니다. DeviceIoControl 호출에 성공하면 0이 아닌 값을 반환합니다. 호출이 실패하거나 보류 중인 경우(즉시 처리되지 않음) DeviceIoControl 은 0 값을 반환합니다. 오류가 발생하면 애플리케이션에서 GetLastError를 호출하여 더 자세한 오류 메시지를 표시할 수 있습니다.
드라이버를 구현하는 것보다 WinUSB 함수를 사용하여 디바이스와 통신하는 것이 더 간단합니다. 그러나 다음과 같은 제한 사항에 유의하세요.
WinUSB 함수를 사용하면 한 번에 하나의 애플리케이션이 디바이스와 통신할 수 있습니다. 둘 이상의 애플리케이션이 디바이스와 동시에 통신해야 하는 경우 함수 드라이버를 구현해야 합니다.
Windows 8.1 전에 WinUSB 함수는 동시 엔드포인트 간 스트리밍 데이터를 지원하지 않습니다.
WinUSB 함수는 커널 모드가 이미 지원되는 디바이스를 지원하지 않습니다. 이러한 디바이스의 예로는 모뎀 및 네트워크 어댑터가 있으며, 이 어댑터는 각각 TAPI(전화 통신 API) 및 NDIS에서 지원됩니다.
다기능 디바이스의 경우 디바이스의 INF 파일을 사용하여 각 USB 함수에 대한 기본 커널 모드 드라이버 또는 Winusb.sys 별도로 지정할 수 있습니다. 그러나 둘 다 아닌 특정 함수에 대해 이러한 옵션 중 하나만 지정할 수 있습니다.
참고 항목
WinUSB 함수에는 Windows XP 이상이 필요합니다. C/C++ 애플리케이션에서 이러한 함수를 사용하여 USB 디바이스와 통신할 수 있습니다. WinUSB API를 사용하는 UWP 앱을 작성하려면 USB 디바이스에 대한 UWP 앱을 참조하세요.
시작
디바이스용 Windows 데스크톱 앱을 작성하는 데 필요한 도구 가져오기
- Windows 드라이버 키트 다운로드의 지침을 따릅니다.
테스트 USB 디바이스 및 해당 하드웨어 사양을 가져옵니다.
사양을 사용하여 앱의 기능 및 관련 디자인 결정을 결정합니다.
MICROSOFT MUTT(USB 테스트 도구) 디바이스는 JJG Technologies에서 사용할 수 있습니다. 이 디바이스에는 MUTT 소프트웨어 패키지 다운로드에서 사용할 수 있는 Microsoft의 펌웨어가 필요합니다.
디바이스에 핸들을 가져오는 기본 앱을 작성합니다.
첫 번째 애플리케이션을 작성하는 방법에는 두 가지가 있습니다.
Visual Studio에 포함된 WinUSB 템플릿을 기반으로 작성합니다. 자세한 내용은 WinUSB 템플릿을 기반으로 Windows 데스크톱 앱 작성을 참조하세요.
SetupAPI 루틴을 호출하여 디바이스에 대한 핸들을 가져오고 WinUsb_Initialize 호출하여 엽니다. 자세한 내용은 WinUSB 함수를 사용하여 USB 디바이스에 액세스하는 방법을 참조 하세요.
디바이스에 대한 Winusb.sys 설치합니다.
Visual Studio를 사용하는 경우 Visual Studio 배포를 사용하여 대상 컴퓨터에 드라이버 패키지를 설치합니다. 지침은 WinUSB 템플릿을 기반으로 Windows 데스크톱 앱 작성을 참조하세요. 그렇지 않으면 사용자 지정 INF를 작성하여 장치 관리자 드라이버를 수동으로 설치합니다. 자세한 내용은 WinUSB(Winusb.sys) 설치를 참조 하세요.
디바이스에 대한 정보를 얻고 해당 설명자를 봅니다.
개념 정보는 모든 USB 개발자를 위한 개념을 참조 하세요. 구성 설명자, 지원되는 각 대체 설정에 대한 인터페이스 설명자 및 해당 엔드포인트 설명자를 읽어 디바이스 기능에 대한 정보를 가져옵니다. 자세한 내용은 USB 설명자에 대한 디바이스 쿼리를 참조 하세요.
USB 컨트롤 전송을 보냅니다.
표준 제어 요청 및 공급업체 명령을 디바이스에 보냅니다. 자세한 내용은 기본 엔드포인트로 제어 전송 보내기를 참조 하세요.
대량 전송 또는 인터럽트 전송을 보냅니다.
디바이스에서 지원하는 대량, 인터럽트 및 등시 엔드포인트 간 읽기 및 쓰기 작업을 수행합니다. 자세한 내용은 문제 I/O 요청을 참조 하세요.
등시 전송을 보냅니다.
스트리밍 데이터에 주로 사용되는 등시 읽기 및 쓰기 요청을 보냅니다. 이 기능은 Windows 8.1 이상에서만 사용할 수 있습니다. 자세한 내용은 WinUSB 데스크톱 앱에서 USB 등시 전송 보내기를 참조 하세요.