Introduction to WinUSB for Developers

Important

This topic is for programmers. If you are a customer experiencing USB problems, see Fix USB-C problems in Windows.

Why WinUSB Matters for Driver Developers

As a driver developer, understanding WinUSB (Windows USB) can significantly streamline your development process, especially when working with USB devices. WinUSB is a generic driver included with Windows that allows you to communicate with USB devices without the need to write a custom driver. This can save you time, reduce complexity, and ensure compatibility across different Windows versions.

Key Benefits of Using WinUSB

  1. Simplified Development:

    • Ease of Use: WinUSB abstracts much of the complexity involved in USB communication, making it easier for you to interact with USB devices.
    • No Custom Driver Needed: For many USB devices, WinUSB can be used directly, eliminating the need to write and maintain a custom driver.
  2. Cross-Platform Compatibility:

    • Standardized Interface: WinUSB provides a standardized interface for USB communication, which can be beneficial for ensuring compatibility across different Windows versions.
  3. Time and Cost Efficiency:

    • Reduced Development Time: Using WinUSB can significantly reduce the time required to develop and test a USB driver.
    • Lower Maintenance Costs: Since WinUSB is maintained by Microsoft, you can rely on it being updated and supported, reducing long-term maintenance costs.
  4. Access to USB Features:

    • Full USB Functionality: WinUSB supports a wide range of USB features, including bulk transfers, control transfers, interrupt transfers, and isochronous transfers.

What You Can Accomplish with WinUSB

  1. Device Communication:

    • Data Transfer: Send and receive data to and from a USB device using bulk, control, interrupt, or isochronous transfers.
    • Control Requests: Send control requests to configure the device or retrieve information.
  2. Device Configuration:

    • Setting Configuration: Configure the USB device by selecting configurations, interfaces, and alternate settings.
    • Endpoint Management: Manage endpoints for data transfer.
  3. Device Enumeration:

    • Device Identification: Enumerate and identify USB devices connected to the system.
    • Descriptor Retrieval: Retrieve device descriptors, configuration descriptors, interface descriptors, and endpoint descriptors.
  4. Custom Applications:

    • User-Mode Applications: Develop user-mode applications that communicate with USB devices using the WinUSB API.
    • Firmware Updates: Implement firmware update mechanisms for USB devices.
  5. Testing and Debugging:

    • Prototyping: Quickly prototype USB device communication to test hardware functionality.
    • Debugging: Use WinUSB to debug communication issues between the host and the USB device.

Components of WinUSB

WinUSB includes:

  • A kernel-mode driver (Winusb.sys)
  • A user-mode dynamic link library (Winusb.dll) that exposes WinUSB functions described in winusb.h. You can use these functions to manage USB devices with user-mode software.

By default, Winusb.sys is installed in the device's kernel-mode stack as an upper filter driver. Apps communicate with the device's UMDF function driver to issue read, write, or device I/O control requests. In this configuration, Winusb.sys serves as the device stack's Plug and Play and power owner. You can also install Winusb.sys as the function driver for a USB device.

Getting Started with WinUSB

This section includes information on:

  • Selecting the correct driver for a device
  • Using WinUSB to communicate with USB devices
  • Installing Winusb.sys as the function driver for a USB device

You will also find detailed code examples that show how apps and USB devices communicate.

Note

Windows 7 supports WinUSB on x86-based, x64-based, and Itanium-based systems. More recent versions of Windows support WinUSB on x86-based and x64-based systems.

WinUSB supports isochronous transfers starting in Windows 8.