HID architecture
The architecture of the HID driver stack in Windows is built on the class driver named hidclass.sys. Clients and transport minidrivers access the class driver from user-mode or kernel-mode.
The HID class driver
The system-supplied HID class driver is the WDM function driver and bus driver for the HID device setup class (HIDClass). The executable component of the HID class driver is hidclass.sys. The HID class driver is the glue between HID clients and various transports, allowing a HID client to be written in an independent way from transports. This level of abstraction allows clients to continue to work (with little to no modifications) when a new standard, or a third-party transport is introduced.
The following diagram is a representation of the HID architecture.
The preceding diagram includes:
- HID clients – Identifies the Windows and third-party clients and their interfaces.
- HID class driver - The hidclass.sys executable.
- HID transport minidriver - Identifies the Windows and third-party transports and their interfaces.
Here's the device stack diagram of a generic HID client and transport.
Here's another device stack diagram showing HID keyboard and mouse collections over USB.
HID clients
The HID Clients are drivers, services, or applications that communicate with HIDClass.sys and often represent a specific type of device (for example, sensor, keyboard, mouse, and so on). They identify the device via a hardware ID or a specific HID Collection and communicate with the HID Collection via the following guidance.
User-mode drivers and applications, and kernel-mode drivers, do the following to operate HID collections:
- User-mode drivers and applications use HIDClass support routines (HidD_Xxx) to obtain information about a HID collection.
- Kernel-mode drivers, user-mode drivers, and applications use HID parsing support routines (HidP_Xxx), and kernel-mode drivers use HID class driver IOCTLs to handle HID reports.
The following table simplifies the information.
Mode | Drivers | Applications |
---|---|---|
User Mode | HidD_Xxx | HidP_Xxx |
Kernel Mode | HidD_Xxx OR IOCTL_HID_xxx | N/A |
For more information, see Opening HID collections.
HID clients supported in Windows
Windows supports the following top-level collections:
Usage page | Usage | Notes | Access mode |
---|---|---|---|
0x0001 | 0x0001 - 0x0002 | Mouse class driver and mapper driver | Exclusive |
0x0001 | 0x0004 - 0x0005 | Game controllers | Shared |
0x0001 | 0x0006 - 0x0007 | Keyboard / Keypad class driver and mapper driver | Exclusive |
0x0001 | 0x000C | Flight mode switch | Shared |
0x0001 | 0x0080 | System controls (Power) | Shared |
0x000C | 0x0001 | Consumer controls | Shared |
0x000D | 0x0001 | External pen device | Exclusive |
0x000D | 0x0002 | Integrated pen device | Exclusive |
0x000D | 0x0004 | Touchscreen | Exclusive |
0x000D | 0x0005 | Precision touchpad (PTP) | Exclusive |
0x0020 | *Multiple | Sensors | Shared |
0x0084 | 0x0004 | HID UPS battery | Shared |
0x008C | 0x0002 | Barcode scanner (hidscanner.dll) | Shared |
In the preceding table, the access mode for input HID clients is exclusive to prevent other HID clients from intercepting or receiving global input state when they aren't the target recipient of that input. For security reasons, Raw Input Manager (RIM) opens all such devices exclusively.
If RIM opens a device in exclusive mode, the user can still open a HID device interface without requesting read and write permissions and obtain HID device information via HIDClass support routines (HidD_GetXxx).
Sharing mode allows multiple applications to access a device. For example, multiple applications can access a barcode scanner to inquire about device capabilities and retrieve statistics. However, retrieving decoded data from a barcode scanner is done in exclusive mode. Usages are defined in the USB-IF Usage Tables.
*Multiple: Sensors usages from 0x00 – 0xFF are segmented for different purposes. For example, 0x10 indicates a biometric sensor; 0x40 indicates a light sensor. Those allocations aren't contiguous. For the list of sensor usages, see USB-IF Device Class Definitions for HID. For information about sensors usages that are supported in Windows, see HID Sensors Usages.
The HID transport driver
The HID class driver is designed to use HID minidrivers to access a hardware input device. A HID minidriver abstracts the device-specific operation of the input devices that it supports. The HID minidriver binds its operation to the HID class driver by registering with the HID class driver. The HID class driver communicates with a HID minidriver by calling the minidriver's support routines. The HID minidriver, in turn, sends communications down the driver stack to an underlying bus or port driver.
HID Transports Supported in Windows
For a list of supported HID transports, see the HID Transport Overview.
USB Generic HID Test in the Windows Hardware Lab Kit (HLK) covers HidUsb and HidClass drivers. There's no HLK test for third-party HID minidrivers.