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
相关产品推荐
相关产品推荐

