Developing Windows applications for USB devices

This topic provides guidelines for deciding whether you should write a Windows Store app or a Windows desktop app to communicate with a USB device.

Windows provides API sets that you can use to write apps that talk to a custom USB devices. The API performs common USB-related tasks such as, finding the device, data transfers.

"Custom device" in this context means, a device for which Microsoft does not provide an in-box class driver. Instead, you can install WinUSB (Winusb.sys) as the device driver.

Choosing a programming model

If you install Winusb.sys, here are the programming model options:

The strategy for choosing the best programming model depends on various factors.

  • Will your app communicate with an internal USB device?

    The APIs are primarily designed for accessing peripheral devices. The API can also access PC internal USB devices. However access to PC internal USB devices from a Windows Store app is limited to a privileged app that is explicitly declared in device metadata by the OEM for that PC.

  • Will your app communicate with USB isochronous endpoints?

    If your app transmits data to or from isochronous endpoints of the device, you must write a Windows desktop app. In Windows 8.1, new WinUSB Functions have been added to the API set that allow a desktop app to send data to and receive data from isochronous endpoints.

  • Is your app a "control panel" type of app?

    Windows Store apps are per-user apps and do not have the ability to make changes outside the scope of each app. For these types of apps, you must write a Windows desktop app.

  • Is the USB device class supported classes by Windows Store apps?

    Write a Windows Store app if your device belongs to one these device classes.

    • name:cdcControl, classId:02 * *
    • name:physical, classId:05 * *
    • name:personalHealthcare, classId:0f 00 00
    • name:activeSync, classId:ef 01 01
    • name:palmSync, classId:ef 01 02
    • name:deviceFirmwareUpdate, classId:fe 01 01
    • name:irda, classId:fe 02 00
    • name:measurement, classId:fe 03 *
    • name:vendorSpecific, classId:ff * *

    Note  If your device belongs to DeviceFirmwareUpdate class, your app must be a privileged app.

    If your device does not belong to one the preceding device classes, write a Windows desktop app.

Driver requirement

Driver requirementWindows Store appWindows desktop app
Function driver Microsoft-provided Winusb.sys (kernel-mode driver). Microsoft-provided Winusb.sys (kernel-mode driver).
Filter driver If filter drivers are present, access is limited to privileged apps. The app is declared as privileged apps in device metadata by the OEM. Filter driver can be present in the kernel mode device stack as long as it doesn't block access to Winusb.sys.

 

Code samples

SampleWindows Store appWindows desktop app
Get started with these samples

 

Development tools

Development toolsWindows Store appWindows desktop app
Developer environment

Microsoft Visual Studio 2013

Microsoft Windows Software Development Kit (SDK) for Windows 8.1

Use WinUSB Application template included with Visual Studio (Ultimate or Professional) and Windows Driver Kit (WDK) 8

Note  For isochronous transfers, Visual Studio 2013 with Windows Driver Kit (WDK) 8.1

Programming languagesC#, VB.NET, C++, JavaScript C/C++

 

Feature implementation

Key scenarioWindows Store appWindows desktop app
Device discoveryUse Windows.Devices.Enumeration namespace to get a UsbDevice.Use SetupAPI functions and WinUsb_Initialize to get a WINUSB_INTERFACE_HANDLE.
USB control transfer

UsbSetupPacket

UsbControlRequestType

UsbDevice.SendControlInTransferAsync

UsbDevice.SendControlOutTransferAsync

WINUSB_SETUP_PACKET

WinUsb_ControlTransfer

Getting USB descriptors

UsbDevice.DeviceDescriptor

UsbConfiguration.Descriptors

UsbInterface.Descriptors

UsbEndpointDescriptor

WinUsb_GetDescriptor
Sending USB bulk transfer

UsbBulkInPipe

UsbBulkOutPipe

WinUsb_ReadPipe

WinUsb_WritePipe

Sending USB interrupt transfer

UsbInterruptInPipe

UsbInterruptOutPipe

WinUsb_ReadPipe

WinUsb_WritePipe

Sending USB isochronous transferNot supported.

WinUsb_ReadIsochPipe

WinUsb_ReadIsochPipeAsap

WinUsb_WriteIsochPipe

WinUsb_WriteIsochPipeAsap

Closing the device UsbDevice.Close WinUsb_Free

 

Documentation

DocumentationWindows Store appWindows desktop app
Programming guide Talking to USB devices, start to finish How to Access a USB Device by Using WinUSB Functions
API reference Windows.Devices.Usb WinUSB Functions

 

Related topics

Universal Serial Bus (USB)

 

 

Send comments about this topic to Microsoft

Show:
© 2014 Microsoft. All rights reserved.