Patching WDK 22H2 to Support Earlier Projects
本文同步于https://www.52pojie.cn/thread-1674727-1-1.html
VS2022只支持22H2(10.0.22621)及更新版本的WDK,从该版本起,WDK砍掉了很多编译目标支持,也deprecate掉了一些常用函数,详见link。然而旧版本的WDK并不支持新版的VS和MSVC Toolset(其实也可以,但比较麻烦)。
到目前为止,这些限制仅仅是在工具链脚本中进行了一些额外检查,头文件和相关lib本身是支持这些编译目标的。因此,如果想让VS2022能够直接支持旧版本WDK工程而免于再安装一份SDK+WDK,或想在旧系统版本的内核开发中体验MSVC v14.3提供的新特性,可以直接patch WDK的MSBuild脚本来绕过这些限制。
本文仅在10.0.22621版本上测试可用,对于更新的WDK版本,请自行测试可用性
修改前请注意备份
支持32位以及Windows 7至8.1的编译目标
修改C:\Program Files (x86)\Windows Kits\10\build\10.0.22621.0\WindowsDriver.Common.targets:
如果自定义了SDK或WDK的安装路径,则此路径可能会发生变化
搜索'$(DDKPlatform)' == 'x86' or '$(DDKPlatform)' == 'ARM'),删除对Platform和TargetVersion的判断逻辑:
取消ExAllocatePool、ExAllocatePoolWithTag等函数的警告
以ExAllocatePool为例
在C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\km\wdm.h中搜索ExAllocatePool函数定义所在位置,删除__declspec(deprecated(ExAllocatePool))和之后的__drv_preferredFunction(...):
解决默认编译输出在Windows 7下加载蓝屏
以下任意一个方法均可:
- 修改项目的Target OS Version为Windows 7;
- 删除
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\km\x64\bufferoverflowfastfailk.lib,复制一份同目录下的BufferOverflowK.lib并重命名为bufferoverflowfastfailk.lib; - 关闭栈保护(不推荐):工程属性 > C/C++ > Code Generation > Security Check > Disable。
在默认生成的代码中,security_init_cookie函数不负责初始化security cookie,security cookie的生成由内核模块的加载器完成。而Windows 7的加载器还不支持该功能,所以导致蓝屏。