Windows内核驱动开发时是否要设置版本控制宏
不是必须的,但在专业开发中强烈推荐设置,否则会带来很多问题。
1. 如果不设置会怎样?
默认情况下,编译器会使用最低版本的 Windows API 定义(通常是 Windows 2000 或 XP 级别)。这会导致:
c
// 如果没有定义 NTDDI_VERSION
#include <wdm.h>
// 你可能无法使用新版本 API
NTSTATUS MyFunction() {
// Windows 10 新增的函数
NTSTATUS status = SomeWindows10Api(); // ❌ 编译错误:未声明的标识符
// 或者结构体字段不全
PDEVICE_OBJECT device;
device->SomeNewField = 1; // ❌ 编译错误:没有此成员
}
2. 什么时候必须设置?
| 场景 | 是否必须 | 原因 |
|---|---|---|
| 使用新版本 Windows 的 API | 必须 | 否则找不到函数声明 |
| 使用新版 SDK 新增的结构体字段 | 必须 | 否则结构体定义不完整 |
| 使用版本相关的功能(如 DMF、WDF 2.0) | 必须 | 需要对应版本的头文件 |
| 开发通用驱动(兼容多版本) | 可选但建议 | 用条件编译适配不同版本 |
| 开发内部专用驱动 | 可选 | 如果只用基本 API 可不设 |
3. 正确的设置方法
3.1 在 targetver.h 中统一设置(推荐)
c
// targetver.h
#pragma once
// 目标 Windows 10 1909
#define NTDDI_VERSION NTDDI_WIN10_19H1
#define _WIN32_WINNT 0x0A00
#define WINVER 0x0A00
3.2 在项目属性中设置
- VS -> 项目属性 -> C/C++ -> 预处理器 -> 预处理器定义
- 添加:
NTDDI_VERSION=NTDDI_WIN10_19H1;_WIN32_WINNT=0x0A00;WINVER=0x0A00
3.3 在源文件开头设置
c
// Driver.h
#include <ntddk.h>
// 必须在包含 wdm.h/ntddk.h 之前定义
#define NTDDI_VERSION NTDDI_WIN10_RS3
#define _WIN32_WINNT 0x0A00
#define WINVER 0x0A00
#include <wdm.h>
// 现在可以使用 Windows 10 RS3 的所有 API
4. 各版本宏的值
| Windows 版本 | NTDDI_VERSION | _WIN32_WINNT | WINVER |
|---|---|---|---|
| Windows 10 2004 | NTDDI_WIN10_VB |
0x0A00 | 0x0A00 |
| Windows 10 1909 | NTDDI_WIN10_19H1 |
0x0A00 | 0x0A00 |
| Windows 10 1903 | NTDDI_WIN10_19H1 |
0x0A00 | 0x0A00 |
| Windows 10 1809 | NTDDI_WIN10_RS5 |
0x0A00 | 0x0A00 |
| Windows 10 1803 | NTDDI_WIN10_RS4 |
0x0A00 | 0x0A00 |
| Windows 10 1709 | NTDDI_WIN10_RS3 |
0x0A00 | 0x0A00 |
| Windows 10 1703 | NTDDI_WIN10_RS2 |
0x0A00 | 0x0A00 |
| Windows 10 1607 | NTDDI_WIN10_RS1 |
0x0A00 | 0x0A00 |
| Windows 10 1511 | NTDDI_WIN10_TH2 |
0x0A00 | 0x0A00 |
| Windows 10 1507 | NTDDI_WIN10 |
0x0A00 | 0x0A00 |
| Windows 8.1 | NTDDI_WINBLUE |
0x0603 | 0x0603 |
| Windows 8 | NTDDI_WIN8 |
0x0602 | 0x0602 |
| Windows 7 | NTDDI_WIN7 |
0x0601 | 0x0601 |