PAYATHON 2026

如何彻底清除并重装 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

需要核对以下三项:

  1. WindowsSdkDir 是否指向当前的 Windows Kits 目录。
  2. WindowsTargetPlatformVersion 是否对应实际存在的平台目录。
  3. 构建过程中是否导入了 Windows Driver Kit 相关的 .props 和 .targets 文件。

如果日志中完全没有 WDK 相关的导入记录,优先修复 VS 的 WDK 组件和项目工具集。如果 WDK 已经导入,但相关属性随后变成了旧路径,就在日志中继续查找最后一次赋值的位置。覆盖通常发生在那里。

完整清理并重新安装

完成上述检查后仍找不到覆盖项,再考虑完整清理。

1. 卸载组件

按以下顺序卸载:

  1. Windows Driver Kit
  2. Windows Software Development Kit
  3. Visual Studio 2022
  4. 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 可能会在重装后继续覆盖新工具链。

备注:内容仅供参考。