Windows内核驱动开发构建选项
在Windows内核驱动开发(WDK)中,编译器和链接器的选项配置至关重要,它们决定了驱动能否在内核环境中稳定运行。以下以Windows 10(Win10)为例,梳理开发驱动时必须定义的宏、编译选项及链接选项。
1. 编译器定义的关键宏
强制定义宏(在项目属性中设置)
| 宏 | 值 | 含义 | 必要性 |
|---|---|---|---|
_AMD64_ 或 _X86_ |
1 | 指定目标架构 | 必须 |
_KERNEL_MODE |
1 | 编译内核模式代码 | 必须 |
WIN32 或 _WIN32 |
1 | Windows 平台 | 必须 |
_WIN64 |
1 | 64位系统 | 仅 64 位时 |
STD_CALL |
1 | 调用约定 | 通常自动 |
NT_INST |
0 | 内核模式标识 | 必须 |
版本控制宏
c
// 在源文件中定义
#define NTDDI_VERSION NTDDI_WIN10_RS3 // Windows 10 1709
#define _WIN32_WINNT 0x0A00 // Windows 10
#define WINVER 0x0A00 // Windows 10
2. 编译器选项(/编译开关)
| 开关 | 含义 | 示例值 | 说明 |
|---|---|---|---|
/kernel |
内核模式代码 | /kernel |
最关键,启用内核语义检查 |
/GS |
缓冲区安全检查 | /GS |
必须启用 |
/guard:cf |
控制流保护 | /guard:cf |
Windows 8.1+ 需要 |
/Zl |
省略默认库名 | /Zl |
避免链接用户态库 |
/Oi |
生成内部函数 | /Oi |
优化 |
/GF |
字符串池 | /GF |
优化字符串 |
/W4 |
警告级别 | /W4 |
推荐最高警告级别 |
/WX |
视警告为错误 | /WX |
推荐开启 |
/volatile:iso |
volatile语义 | /volatile:iso |
正确内存访问 |
/Zc:wchar_t- |
wchar_t类型 | /Zc:wchar_t- |
兼容旧代码 |
完整示例:
/kernel /GS /guard:cf /Zl /Oi /GF /W4 /WX /volatile:iso /Zc:wchar_t-
3. 链接器选项
| 开关 | 含义 | 示例值 | 说明 |
|---|---|---|---|
/DRIVER |
生成驱动 | /DRIVER |
最关键,创建 .sys 文件 |
/DYNAMICBASE:NO |
禁用ASLR | /DYNAMICBASE:NO |
内核驱动通常需要固定基址 |
/RELEASE |
设置校验和 | /RELEASE |
设置文件头校验和 |
/ENTRY |
入口点 | /ENTRY:DriverEntry |
指定驱动入口函数 |
/SUBSYSTEM:NATIVE |
子系统 | /SUBSYSTEM:NATIVE |
内核驱动子系统 |
/NODEFAULTLIB |
无默认库 | /NODEFAULTLIB |
不链接标准C库 |
/MERGE |
节合并 | /MERGE:.rdata=.data |
优化节大小 |
/INTEGRITYCHECK |
完整性检查 | /INTEGRITYCHECK |
强制签名检查 |
/SAFESEH:NO |
禁用SEH | /SAFESEH:NO |
内核模式无SEH |
库文件:
ntoskrnl.lib
hal.lib