适配不同版本Windows 10时应当选择哪个版本的WDK?
针对Windows驱动跨LTSC版本适配问题的解答
问题1:是否需要安装两个版本的SDK分别编译两次?
- 该认知不正确,不需要安装两套SDK也不需要分开编译两次。
- 只要安装版本不低于你要支持的最高目标系统版本的SDK即可,这里你只要安装1809(10.0.17763.0)及以上版本的Win10 SDK就可以。
- 项目配置中添加宏定义即可实现向下兼容:将
WINVER、_WIN32_WINNT、NTDDI_VERSION三个宏统一设置为0x0A000003(对应Win10 1607的版本标识),编译出来的二进制文件天然支持1607及以上版本的Windows系统。 - 特殊情况:如果你的代码中用到了1809版本才引入的内核API,需要做动态版本检测+分支处理,不需要分开编译。
问题2:应该选择什么版本的WDK,是否可以用VS2019替代VS2017?
- WDK的唯一硬性匹配要求是必须和你使用的SDK版本号完全一致,版本号不匹配的SDK和WDK无法正常配合编译驱动。
- 完全可以使用最新的支持VS2019的WDK版本替换旧版本,不需要并行安装多套WDK。比如你可以选择安装Win10 2004版本(10.0.19041.0)的SDK+WDK,这套组合原生支持VS2019,只要你按上面的方法设置好目标版本宏,编译出来的驱动完全可以兼容1607和1809两个LTSC版本。
- 不需要强制使用1809版本的WDK,旧版本WDK仅对应旧的VS版本的限制,不影响你用更高版本的工具链向下兼容编译。
问题3:SDK、WDK与目标Windows版本的兼容性规则
三者的兼容性规则可以总结为3条:
- 编译侧规则:SDK与WDK版本必须严格一致,SDK/WDK版本需要和你使用的VS版本匹配(每个版本的WDK发布时都会明确标注支持的VS版本,按要求安装即可),SDK/WDK的版本只要不低于你要支持的最低目标系统版本即可,不需要和目标系统版本完全对齐。
- 目标运行侧规则:驱动支持的最低系统版本由你代码中设置的
WINVER、_WIN32_WINNT、NTDDI_VERSION三个宏的最小值决定,宏的取值不能高于你使用的SDK/WDK的版本。 - 问题触发规则:只有当你在代码中调用了高于目标版本宏定义的内核API,且未做版本校验和降级处理时,才会在低版本系统上出现驱动加载失败、运行崩溃等兼容性问题。
注:内核驱动和普通应用层程序的兼容性逻辑不同,应用层Win32 API有微软的强向下兼容保障,但内核API没有,部分内核API会在Windows小版本迭代中修改参数、甚至直接移除,所以如果用到版本敏感的内核API,必须做动态版本检测,避免低版本系统兼容性问题。
内容的提问来源于stack exchange,提问作者derdomml
相关产品推荐
相关产品推荐

