Getting Started with Universal Windows drivers
Universal Windows drivers enable developers to create a single driver package that runs across multiple device types, from embedded systems to tablets to desktop PCs.
A Universal Windows driver package contains an INF file and binaries that install and run on Universal Windows Platform (UWP)-based editions of Windows 10. They also install and run on other editions of Windows 10 that share a common set of interfaces.
A universal driver consists of the following parts:
- A base driver
- Optional component packages
- An optional hardware support app
The base driver contains all the core functionality and shared code. The optional component packages can contain customizations and additional settings.
Typically, a device manufacturer, or independent hardware vendor (IHV), writes the base driver. Then, a system builder, or original equipment manufacturer (OEM), provides any optional component packages.
An IHV follows the design best practices of driver package isolation to ensure the driver is reliable and robust to servicing operations.
After the IHV has certified the base driver, it can be deployed on all OEM systems. Because a base driver can be used across all systems that share a hardware part, Microsoft can test the base driver broadly by using Windows Insider driver flighting instead of limiting distribution to specific machines.
After IHV has certified the base driver package, it can be deployed on all OEM systems. Because a base driver package can be used across all systems that share a hardware part, Microsoft can test the base driver package broadly via Windows Insider flighting, rather than limiting distribution to specific machines.
The OEM validates only the optional customizations that it provides for the OEM system.
Universal drivers are distributed through Windows Update, and hardware support apps are distributed through Microsoft Store.
When you write a universal driver package, there are four design principles to consider:
Declarative (D): Install the driver by using only declarative INF directives. Don't include co-installers or RegisterDll functions.
Componentized (C): Edition-specific, OEM-specific, and optional customizations to the driver are separate from the base driver package. As a result, the base driver, which provides only core device functionality, can be targeted, flighted, and serviced independently from the customizations.
Hardware Support App (H): Any user interface (UI) component associated with a universal driver must be packaged as a Hardware Support App (HSA) or preinstalled on the OEM device. An HSA is an optional device-specific app that's paired with a driver. The application can be a Universal Windows Platform (UWP) or Desktop Bridge app. You must distribute and update an HSA through the Microsoft Store. For details, see Hardware Support App (HSA): Steps for driver developers and Hardware Support App (HSA): Steps for app developers.
Universal API compliance (U): Binaries in the universal driver package call only those APIs and DDIs that are included in UWP-based editions of Windows 10. These DDIs are marked as Universal on the corresponding documentation reference pages. INF files use only universal INF syntax.
Additionally, Universal drivers also benefit from the principles of driver package isolation. You'll find detailed guidance on how to follow these best practices in the Driver Package Isolation page.
In the documentation, we use the DCHU acronym to refer to these principles. Later in this article, you'll find guidance to make your driver package DCHU-compliant. Also check out Universal driver scenarios, which describes how the DCHU universal driver sample applies the DCHU design principles.
When you write a universal driver package, follow these steps:
- Create a universal INF file for your driver:
- Review the list of INF sections and directives that are valid in universal driver packages.
- Use the InfVerif tool to verify that your driver package's INF file is universal.
- Use the ApiValidator tool to verify that the APIs your binaries call are valid for a universal driver package.
If you're using the Windows Driver Kit (WDK) with Visual Studio, set the Target Platform value in the driver project properties to
Universal. This automatically adds the correct libraries, and it runs the Universal INF validation and APiValidator as a part of build. To do this:
- Open the driver project properties.
- Select Driver Settings.
- Use the drop-down menu to set Target Platform to
Driver Package Isolation:
- To maximize reliability and serviceability of your Universal driver, ensure your driver follows the principles of driver package isolation
- Driver package isolation is a new concept that allows your driver to be self-contained and robust to OS changes
- See more details on the Driver Package Isolation page
If your INF performs any custom setup actions that depend on the target platform, consider separating them out into an extension INF. You can update an extension INF independently from the base driver package to make it more robust and serviceable. For more information, see Using an extension INF file.
If you want to provide an application that works with your device, include a UWP app. For more information, see Hardware Support App (HSA): Steps for driver developers. An OEM can preload such an app by using DISM - Deployment Image Servicing and Management. Or, users can manually download the app from the Microsoft Store.
Submit your universal driver package for certification in the Windows Hardware Compatibility Program. See the following topics for more details: