如何彻底清除并重装 VS 2022,解决内核驱动缺少 ntddk.h
结论
通常不需要重装 Windows。出现这类问题,更常见的原因是 WDK 的 MSBuild 配置没有正确导入,或者 WindowsSdkDir、WindowsTargetPlatformVersion、IncludePath 等属性被环境变量、用户级属性表或 Directory.Build.props 覆盖。
不要手工添加 ...\Include\10.0.26100.0\km,也不要自行定义 _AMD64_。这样做会绕过 WDK 对体系结构宏和 KMDF include 路径的配置,随后往往会依次出现:
ntdef.h: #error: "No Target Architecture"
wdf.h: No such file or directory
先排查配置被覆盖的位置。只有确认无法修复后,才需要清除 VS、MSBuild 的用户配置和 WDK 残留。
为什么手工添加 include 路径无效
内核驱动项目会使用多个 include 目录。正常构建时,WDK 的 .props 和 .targets 文件会根据目标平台配置以下内容:
- Windows SDK 的共享头文件
- WDK 的
km头文件 - KMDF 对应版本的
wdf头文件 - x64、ARM64 等目标体系结构宏
- 内核模式库目录和链接参数
驱动代码通常只需要正常包含:
#include <ntddk.h>
#include <wdf.h>
ntdef.h 一般由其他 WDK 头文件间接包含,不适合作为排查路径问题的入口。
wdf.h 不在 ...\Include\10.0.26100.0\km 中,通常位于 WDK 的 Include\wdf\kmdf\<KMDF版本> 目录。只添加 km 路径仍会缺少 KMDF 头文件。
驱动工具链会根据 x64 目标自动定义 _AMD64_。手工定义只能暂时跳过一项检查,无法补全其余 WDK 配置。
检查实际生效的构建属性
在 Visual Studio 中打开项目属性,确认顶部选择了当前构建使用的配置和平台,例如:
Configuration: Debug
Platform: x64
检查以下项目:
Configuration Type
Platform Toolset
Windows SDK Version
Driver Type
KMDF Version
KMDF 驱动项目的 Platform Toolset 通常应为:
WindowsKernelModeDriver10.0
Windows SDK Version 应对应实际存在的目录,例如:
10.0.26100.0
控制面板中显示的 10.0.26100.3916 是安装包的维护版本,include 目录则使用 10.0.26100.0 作为平台版本。两者尾号不同并不表示安装有问题。
还需要在“视图 > 其他窗口 > 属性管理器”中检查项目导入的属性表,查看自定义 .props 文件是否重写了以下属性:
<WindowsSdkDir>...</WindowsSdkDir>
<WindowsTargetPlatformVersion>...</WindowsTargetPlatformVersion>
<IncludePath>...</IncludePath>
<LibraryPath>...</LibraryPath>
如果自定义属性需要修改 IncludePath,必须保留继承值,例如:
<IncludePath>C:\MyIncludes;$(IncludePath)</IncludePath>
如果完全替换 $(IncludePath),VS 和 WDK 已经计算出的目录也会被删掉。
排查环境变量覆盖
打开普通 PowerShell,分别检查进程、当前用户和系统级环境变量:
$names = @(
'WindowsSdkDir',
'WindowsSDKVersion',
'UniversalCRTSdkDir',
'UCRTVersion',
'WDKContentRoot',
'VCToolsInstallDir',
'INCLUDE',
'LIB'
)
foreach ($scope in 'Process', 'User', 'Machine') {
"`n[$scope]"
foreach ($name in $names) {
$value = [Environment]::GetEnvironmentVariable($name, $scope)
if ($null -ne $value) {
"$name=$value"
}
}
}
如果用户级或系统级变量指向旧版 SDK、WDK,或者指向已经不存在的目录,先备份变量值,再删除对应变量。不要手工将它们设置为当前安装路径。正常情况下,VS 和 MSBuild 会自动解析这些路径。
删除一个已经确认有误的用户级变量,可以使用:
[Environment]::SetEnvironmentVariable(
'WindowsSdkDir',
$null,
'User'
)
修改后,关闭所有 Visual Studio、Developer Command Prompt 和终端窗口,再重新打开。已经启动的进程不会自动读取新的环境变量。
同时核对 Windows Kits 在注册表中的安装根目录:
reg query "HKLM\SOFTWARE\Microsoft\Windows Kits\Installed Roots" /v KitsRoot10
正常结果应指向类似目录:
C:\Program Files (x86)\Windows Kits\10\
查找隐藏的 MSBuild 全局配置
InstallCleanup.exe 不一定会删除用户自行创建的 MSBuild 属性表。检查以下目录:
%LOCALAPPDATA%\Microsoft\MSBuild\
%APPDATA%\Microsoft\VisualStudio\
%LOCALAPPDATA%\Microsoft\VisualStudio\
还要从 solution 所在目录开始,沿父目录逐级检查:
Directory.Build.props
Directory.Build.targets
MSBuild 会自动导入父目录中的 Directory.Build.props。即使新建了示例项目,只要项目仍在同一父目录树下,错误配置就可能继续生效。
可以在一个完全无关的目录中重新创建 KMDF 示例项目,例如 C:\WdkProbe。如果这个项目能够构建,问题就在原目录树的属性文件或项目属性中,VS 安装本身通常没有问题。
用诊断日志确认 WDK 是否被导入
在“Developer Command Prompt for VS 2022”中进入项目目录并执行:
msbuild Driver.vcxproj /t:Rebuild /p:Configuration=Debug /p:Platform=x64 /v:diag /bl:driver-build.binlog > driver-build.log
在日志中搜索:
findstr /i "WindowsSdkDir WindowsTargetPlatformVersion WDKContentRoot IncludePath WindowsDriver" driver-build.log
需要核对以下三项:
WindowsSdkDir是否指向当前的 Windows Kits 目录。WindowsTargetPlatformVersion是否对应实际存在的平台目录。- 构建过程中是否导入了 Windows Driver Kit 相关的
.props和.targets文件。
如果日志中完全没有 WDK 相关的导入记录,优先修复 VS 的 WDK 组件和项目工具集。如果 WDK 已经导入,但相关属性随后变成了旧路径,就在日志中继续查找最后一次赋值的位置。覆盖通常发生在那里。
完整清理并重新安装
完成上述检查后仍找不到覆盖项,再考虑完整清理。
1. 卸载组件
按以下顺序卸载:
- Windows Driver Kit
- Windows Software Development Kit
- Visual Studio 2022
- Visual Studio Installer
卸载完成后重启系统。
2. 运行 InstallCleanup.exe
先查看当前安装程序支持的参数:
"C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\layout\InstallCleanup.exe" -?
如果当前版本支持 -f,且机器上没有需要保留的其他 Visual Studio 实例,可以执行:
"C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\layout\InstallCleanup.exe" -f
-f 是全局清理选项,可能影响其他 Visual Studio 产品。如果机器上还有 Build Tools、Preview 或其他版本,不要直接运行。
3. 隔离用户级配置
先不要删除用户配置,可以将以下目录改名并添加 .bak 后缀:
%LOCALAPPDATA%\Microsoft\MSBuild
%LOCALAPPDATA%\Microsoft\VisualStudio
%APPDATA%\Microsoft\VisualStudio
这些目录可能包含自定义属性表、扩展缓存和用户设置。改名后,仍可随时恢复需要的内容。
接着检查并清除已经确认有误的 VS、SDK 和 WDK 环境变量。不要删除整个系统的 PATH、INCLUDE 或 LIB,只移除其中明确失效的条目。
4. 重新安装
重新安装时至少选择:
Desktop development with C++
MSVC v143 C++ build tools
Windows 11 SDK,或项目要求的 Windows SDK
Windows Driver Kit
具体组件名称可能会随 Visual Studio Installer 和 WDK 版本变化。安装 SDK 和 WDK 时,尽量选择同一 Windows 平台系列。安装完成后重启,并在全新目录中创建一个 KMDF 示例项目进行验证。
最后验证
先不要打开原项目。在新目录中创建 KMDF 示例项目,并构建 Debug | x64。
如果新项目构建成功,再打开原项目并删除以下临时状态目录:
.vs
x64
Debug
Release
这些目录只包含缓存和构建产物,不能修复全局工具链,但删除后可以避免旧的 IntelliSense 数据或中间文件干扰验证。
如果全新目录中的 KMDF 示例仍然构建失败,以 driver-build.log 或 .binlog 中记录的实际属性值为准。反复卸载通常解决不了这类问题,因为残留的环境变量、用户属性表和 Directory.Build.props 可能会在重装后继续覆盖新工具链。
备注:内容仅供参考。
