[在商业发行之前会发生实质性修改的、与预发布产品相关的一些信息。Microsoft 不对此处提供的信息作任何明示或默示的担保。]
通用 Windows 驱动程序使用一组适用于 Windows 驱动程序的接口的子集。本主题介绍了如何生成、安装、部署和调试 Windows 10 的通用 Windows 驱动程序。
通用 Windows 驱动程序简介
Windows 10 提供了一组对多个版本的 Windows 均可用的 API 和 DDI 接口。此组接口称为通用 Windows 平台 (UWP)。
通用 Windows 驱动程序是可在基于 UWP 的版本的 Windows 10(例如 Windows 10 桌面版(家庭版、专业版和企业版)和 Windows 10 移动版)上安装和运行的内核模式或用户模式驱动程序二进制文件。
通用 Windows 驱动程序仅调用属于 UWP 的设备驱动程序接口 (DDI)。这些 DDI 在相应的 MSDN 参考页面上标记为“通用”。
若要确定你现有的驱动程序是否调用除 UWP 之外的任何接口,请将该驱动程序重新编译为通用 Windows 驱动程序。如果该驱动程序调用不属于 UWP 的接口,则编译器将显示 ApiValidator 错误。在某些情况下,可以针对仅限桌面的 DDI 将这些调用替换为 MSDN 参考页面上列出的备用 DDI。 如果你找不到合适的替代,请提交反馈。
在其他情况下,如果没有合适的替代,则必须编写代码作为解决方法。如果需要,你可以通过统一的 WDK 中的驱动程序模板开始编写新的通用 Windows 驱动程序。
如果你使用的不是通用 INF 文件,则编译器还可能显示 INF 验证错误。
通用 Windows 驱动程序可以使用 KMDF、UMDF 2 或 Windows 驱动程序模型 (WDM)。
生成通用 Windows 驱动程序
可以将 Microsoft Visual Studio 2015 与 Windows 驱动程序工具包 (WDK) 10 结合使用以生成适用于桌面、移动设备或通用设备的驱动程序。可以从 Windows 硬件开发人员中心下载工具包和工具。
在许多情况下,只要在 Windows 8.1 上运行的现有内核模式驱动程序不使用任何用户模式组件,便可以将其重新编译为通用 Windows 驱动程序。 适用于 Windows 8.1 的 WDM 和 KMDF 驱动程序应在不进行任何转换的情况下重新编译为面向 Windows 10 的通用 Windows 驱动程序。
相比之下,现有的用户模式驱动程序可能需要修改,才能编译为通用 Windows 驱动程序。具体而言,你的驱动程序包不得依赖除 UWP 之外的任何平台。例如,只有一部分 Win32 API 才属于 UWP
将现有的驱动程序项目转换为通用 Windows 驱动程序项目
- 在 Visual Studio 2015 中,打开现有驱动程序项目。
- 在“解决方案资源管理器”窗格中,右键单击解决方案,然后选择“配置管理器”。 将目标操作系统设置为 Windows 10。
- 右键单击驱动程序项目,然后选择“属性”。 在“配置属性”->“驱动程序”下,验证“目标平台”是否设置为“通用”。 其他选项包括“桌面”(用于生成仅在 Windows 10 桌面版上运行的驱动程序)和“移动”****(用于生成仅在 Windows 10 移动版上运行的驱动程序)。
- 生成驱动程序。你可能会看到链接器错误。
- 通过查看错误日志逐个修复错误。有关可能的备用 API 的信息,请参阅文档中的各个参考页。如果替换不可用,你可能需要重新设计你的驱动程序。
使用 Microsoft Visual Studio 创建新的通用 Windows 驱动程序项目
通过模板创建新的驱动程序(“文件”>“新建项目”>“模板”>“Visual C++”>“Windows 驱动程序”>“WDF”,然后选择“用户模式驱动程序 (UMDF V2)”****或“内核模式驱动程序 (KMDF)”。
项目创建后,在“解决方案资源管理器”窗格中右键单击解决方案,然后选择“配置管理器”****。 将“活动解决方案配置”设置为所需的目标 Windows 版本,并将“活动解决方案平台”设置为“Win32”或“x64”。 如果“ARM”未列出,请选择“<新建...>”****为 ARM 进行生成。
如果你选择 Windows 10,则驱动程序模型默认为“通用”。
若要手动更改驱动程序模型,请右键单击驱动程序项目,然后选择“属性”。 在“配置属性”->“驱动程序设置”->“常规”下,找到“目标平台”项。选择“通用”、“桌面”或“移动”****。Visual Studio 使用此设置来确定要链接到的库。
注意 你无法为 Windows 10 之前的 Windows 版本生成通用 Windows 驱动程序。
你可能需要修改 .inf 文件来指定提供程序,此操作已指定为 %ManufacturerName% 令牌,并在后面的 INF 文件 Strings 部分中进行了详细介绍。 例如:
Provider="Contoso"你现在可以构建解决方案。 Visual Studio 将链接到所需的库并生成 .cat 文件、.inf 文件和驱动程序二进制文件。
有关在构建驱动程序时,可以在 Visual Studio 中使用的配置设置的信息,请参阅使用 WDK 构建驱动程序。
安装通用 Windows 驱动程序
注意 SetupAPI 组件不属于 UWP,因此通用 Windows 驱动程序无法调用此 API 集中的函数。
如果要在运行 Windows 10 桌面版的设备上安装通用 Windows 驱动程序,你仍然可以使用 INF 文件,但有几点需要注意。 通用 Windows 驱动程序的 INF 文件不能包含以下任一内容:
- 共同安装程序
- 类安装程序
- RegisterDLL、DelFile 或 DelReg 指令
- 非 HKR AddReg 指令
有关详细信息,请参阅使用通用 INF 文件。
如果要在 Windows 10 移动版上安装通用 Windows 驱动程序,则可以使用 .spkg 文件。.spkg(“程序包文件”)是一个独立的模块,其中包含驱动程序包。 如果不是要部署到 Windows 10 移动版,则无需生成程序包文件。 如果没有程序包文件,你仍然可以编译通用 Windows 驱动程序(如驱动程序源代码中所定义)。
WDK 10 包含 PkgGen,它是用于生成程序包文件的工具。通过使用以下过程,可在构建驱动程序时在 Visual Studio 中运行 PkgGen。
使用 PkgGen 生成程序包文件
- 右键单击驱动程序项目,然后选择“添加”->“新项”。 接下来,在“Visual C++”->“Windows 驱动程序”下,选择“程序包清单”。单击“添加”。
- Visual Studio 会将名为 Package.pkg.xml 的文件添加到你的驱动程序项目中。 可以右键单击该文件并选择属性以验证项目类型是否为“PkgGen”。(如果你之后决定要构建该驱动程序项目且不希望生成程序包文件,则可以在同一属性页上将“从构建中排除”设置为“是”。) 单击“确定”。
- 右键单击驱动程序包项目,然后选择“属性”。在“配置属性”下,打开 PackageGen 节点并将“版本”更改为任何所需的任何值。
- 保存作业并以管理员身份重新启动 Visual Studio。
- 构建你的驱动程序。 Visual Studio 将链接到所需的库并生成 .cat 文件、.inf 文件、驱动程序二进制文件以及 .spkg 文件。
若要查看程序包文件的内容,则可以将 .cab 后缀附加到该文件名,然后在 Windows 资源管理器中打开该 cab 文件。
若要了解使用除 Visual Studio 以外的工具运行 PkgGen 的信息,请参阅创建程序包。
若要安装移动驱动程序包(.spkg 文件),你有两种选择。
- 若要在目标系统上更新现有程序包或将新程序包添加到该目标系统,请使用 IUTool.exe 安装 .spkg 驱动程序包。
- 如果要将程序包合并到移动操作系统映像中,则可以使用 ImgGen 将 .spkg 驱动程序包添加到完整刷机更新 (FFU) 映像,然后该映像即可刷入到移动设备。
使用 IUTool 将移动驱动程序包 (.spkg) 添加到运行的设备中
IUTool.exe 位于WDK 10 的 \tools\bin\<architecture> 子目录中。
将你的移动设备附加到电脑。 然后,从提升的命令提示符发出以下命令:
IUTool -p MyKmdfDriver.spkg有关详细信息,请参阅 IUTool.exe:更新手机上的程序包和向测试映像添加驱动程序。
使用 ImgGen 将驱动程序包 (.spkg) 添加到移动操作系统映像 (.ffu) 中
- 在安装 Visual Studio 后,在“开始”屏幕上单击 Visual Studio 2015 文件夹。右键单击“适用于 VS2015 的开发人员命令提示符”,然后选择“以管理员身份运行”****。
- 有关 ImgGen 的详细信息,请参阅使用 ImgGen.cmd 构建手机映像。
刷入移动操作系统映像 (.ffu)
若要将映像刷入设备,则可以使用 Microsoft 提供的 FFUTool,或者开发自定义 OEM 刷机工具。 有关详细信息,请参阅更新 .FFU 映像文件中的程序包。
调试通用 Windows 驱动程序
从 Windows 10 开始,你可以生成你的 KMDF 或 UMDF 驱动程序,以便通过发行跟踪记录器获取其他驱动程序调试信息。通用 Windows 驱动程序可以使用此功能。
此外,如果你使用了 Visual Studio KMDF 模板,则驱动程序还需要使用 Windows 软件跟踪预处理器 (WPP) 写入跟踪消息。你的驱动程序是一个带有提供程序 GUID 的 ETW 提供程序。
若要从你的驱动程序发送跟踪消息,请使用以下代码:
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");
你可以访问 ETW 日志,方法是通过手机上的 TShell 工具使用 Tracelog 或在调试程序会话中使用 !wmitrace。
若要在手机上使用 Tracelog:
在主计算机和手机之间建立内核模式调试会话。
在主机上的 TShell 中,输入以下命令:
exec-device tracelog -addautologger MyLogger05 -guid c:\SteveGuid.txt -level 4 -flag 0xF –kd重新启动手机并注意查找调试程序中的跟踪消息。
所有现有的内核模式调试传输都将继续在桌面版的 Windows 10 上运行。但是,对于用户模式和内核模式驱动程序,你必须通过 KDNET 使用远程调试程序会话,才能测试 Windows 10 移动版。有关详细信息,请参阅 Visual Studio 中的通过网络电缆手动设置内核模式调试。