本文同步于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'),删除对PlatformTargetVersion的判断逻辑:
删除选中部分

取消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下加载蓝屏

以下任意一个方法均可:

  1. 修改项目的Target OS Version为Windows 7;
  2. 删除C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\km\x64\bufferoverflowfastfailk.lib,复制一份同目录下的BufferOverflowK.lib并重命名为bufferoverflowfastfailk.lib
  3. 关闭栈保护(不推荐):工程属性 > C/C++ > Code Generation > Security Check > Disable。

在默认生成的代码中,security_init_cookie函数不负责初始化security cookie,security cookie的生成由内核模块的加载器完成。而Windows 7的加载器还不支持该功能,所以导致蓝屏。