You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows驱动能否检测构建所用Windows Kit?编译器能否识别WDK版本?

如何让驱动打印构建所用的Windows Kit版本

核心思路

Windows Kit(WDK)在构建驱动时会通过预定义宏注入版本信息,这些宏的值直接对应构建时使用的WDK版本,和运行时系统环境无关——正好解决你需要区分研发构建与黄金构建机版本的需求,不需要依赖RtlGetVersion这类仅能查询运行时系统版本的接口。


方法1:直接使用WDK内置版本宏(推荐)

从Windows 10 1809对应的WDK版本开始,官方提供了直接的版本宏:WDK_VERSION_MAJOR、WDK_VERSION_MINOR、WDK_VERSION_BUILD,可以直接在代码中打印这些值:

#include <ntddk.h>

NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
{
    UNREFERENCED_PARAMETER(DriverObject);
    UNREFERENCED_PARAMETER(RegistryPath);

    // 输出WDK的主版本、次版本、构建号
    KdPrint(("[Build Info] WDK Version: %u.%u.%u\n", 
             WDK_VERSION_MAJOR, WDK_VERSION_MINOR, WDK_VERSION_BUILD));
    
    // 同时输出目标系统版本对应的宏(可辅助验证构建配置)
    KdPrint(("[Build Info] Target OS: _WIN32_WINNT=0x%X, NTDDI_VERSION=0x%X\n", 
             _WIN32_WINNT, NTDDI_VERSION));

    return STATUS_SUCCESS;
}

这些宏由WDK工具链在编译阶段自动定义,完全反映当前构建使用的Windows Kit版本,不会受运行时系统影响。


方法2:通过目标系统宏反向推导(兼容旧版WDK)

如果团队中有人使用较旧的WDK(无WDK_VERSION_*宏),可以通过NTDDI_VERSION宏反向推导WDK版本——因为每个WDK版本对应固定的目标系统版本宏值。示例代码:

#include <ntddk.h>

static PCSTR GetWDKVersionLabel()
{
    switch (NTDDI_VERSION)
    {
        case NTDDI_WIN11:                  return "Windows 11 WDK (10.0.22621+)";
        case NTDDI_WIN10_21H2:             return "Windows 10 21H2 WDK (10.0.22000)";
        case NTDDI_WIN10_20H2:             return "Windows 10 20H2 WDK (10.0.19041)";
        case NTDDI_WIN10_1909:             return "Windows 10 1909 WDK (10.0.18362)";
        case NTDDI_WIN10_RS5:              return "Windows 10 RS5 WDK (10.0.17763)";
        default:                           return "Unknown WDK Version";
    }
}

NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
{
    UNREFERENCED_PARAMETER(DriverObject);
    UNREFERENCED_PARAMETER(RegistryPath);

    KdPrint(("[Build Info] WDK Version: %s\n", GetWDKVersionLabel()));
    return STATUS_SUCCESS;
}

注意事项

  • KdPrint仅在调试构建(定义了_DEBUG宏)时会输出内容;如果需要在Release构建中也打印,可替换为DbgPrint,但需注意Release构建的调试输出可能需要额外配置Windbg的捕获规则。
  • 确保所有开发者的VS项目配置中,正确关联了官方WDK,而非自定义或不完整的SDK配置——否则宏值可能无法正确生成。
  • 这种构建时注入的信息完全可靠,不会出现运行时环境干扰的问题,能准确验证研发阶段的构建是否与黄金构建机一致。

内容的提问来源于stack exchange,提问作者Joe C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:12:35