Win1909+vs2019+Windows 10 WDK 2004(10.0.19041.1) + Windows 10 SDK 2004(10.0.19041.1)环境搭建

  1. 安装vs2019,安装的时候,Workloads选项卡必须选中“Desktop developmet with c++”,这个是驱动开发必须的。 

“Individual components”选项卡里,必须选中“Visual Studio SDK”(注意不是Windows SDK),这样在安装WDK的时候,才会安装VS插件(即vs开始菜单中增加Driver菜单项,且VS创建工程的时候,可以选项驱动类型的工程模板)。

  1. 安装Windows 10 SDK 2004(10.0.19041.1),否则在安装Windows 10 WDK 2004(10.0.19041.1)的时候,会提示SDK不兼容。
  2. 安装Windows 10 WDK 2004(10.0.19041.1)
  3. 新建Empty WDM Driver工程

创建First.c文件并加入到工程,内容如下:

#include <ntddk.h>

 

void DriverUnload(PDRIVER_OBJECT pDriverObject)

{

}

 

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)

{

       if (NULL != pDriverObject)

       {

              pDriverObject->DriverUnload = DriverUnload;

       }

 

       return STATUS_SUCCESS;

}

5. 编译,出现错误:

1>------ 已启动生成: 项目: MyDriver1, 配置: Debug x64 ------

1>Building 'MyDriver1' with toolset 'WindowsKernelModeDriver10.0' and the 'Desktop' target platform.

1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(458,5): error MSB8040: 此项目需要缓解了 Spectre 漏洞的库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。了解详细信息: https://aka.ms/Ofhn4c

1>已完成生成项目“MyDriver1.vcxproj”的操作 - 失败。

========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

 

这个错误提示要在VS2019安装程序中,定位到“单个组件”选项卡,把Spectre组件安装了,经搜索,有大量Spectre选项,先把X86/X64的全装了,大约10几GB。

重新编译,也是然并卵。

还是没有把引起编译错误的关键Spectre项安装上。从上图可以看到,这些Spectre是针对不同SDK版本的,有for ATL V141的,有For C++ V14.20的,有“带有Spectre缓解措施的C++ v14.21 ATL for V142生成工具”的,这里有从v14.21到v14.27。全装太大,该装哪个呢,突然想到可以从工程配置中找一找。在工程宏中,搜索14.2,出来的全是14.27,所以可以确认,我们需要的是14.27版本:

接着,在vs2019安装程序中,搜索14.27:

把这些都安装上,生新编译,这个错误就没有了。

也可以采用第二种方案,就是设置工程,让它不使用Spectre缓解:

如果编译出现下面的错误:

1>------ Build started: Project: FirstDriver, Configuration: Debug x64 ------

1>Building 'FirstDriver' with toolset 'WindowsKernelModeDriver10.0' and the 'Desktop' target platform.

1>C:\Program Files (x86)\Windows Kits\10\build\WindowsDriver.common.targets(460,5): error MSB6004: The specified task executable location "\stampinf.exe" is invalid.

1>Done building project "FirstDriver.vcxproj" -- FAILED.

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

表示SDK的版本与WDK的版本不一致,我们只需要在vs工程中,重新指定SDK版本即可:

对于WDK1709,我们指定与之匹配的SDK版本:10.0.16299.0

 

6. 再次编译,出现如下错误:

1>------ 已启动生成: 项目: MyDriver2, 配置: Debug x64 ------

1>Building 'MyDriver2' with toolset 'WindowsKernelModeDriver10.0' and the 'Desktop' target platform.

1>Stamping x64\Debug\MyDriver2.inf

1>Stamping [Version] section with DriverVer=09/24/2020,17.53.38.653

1>D:\myvc\MyDriver2\MyDriver2.inf : error 1297: Device driver does not install on any devices, use primitive driver if this is intended.

1>已完成生成项目“MyDriver2.vcxproj”的操作 - 失败。

========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

不管它,先把MyDriver2.inf从工程中移除,

7. 再次编译,出现如下错误:

1>------ 已启动生成: 项目: MyDriver2, 配置: Debug x64 ------

1>Building 'MyDriver2' with toolset 'WindowsKernelModeDriver10.0' and the 'Desktop' target platform.

1>First.c

1>D:\myvc\MyDriver2\First.c(3,34): error C2220: 以下警告被视为错误

1>D:\myvc\MyDriver2\First.c(3,34): warning C4100: “pDriverObject”: 未引用的形参

1>D:\myvc\MyDriver2\First.c(8,68): warning C4100: “pRegPath”: 未引用的形参

1>已完成生成项目“MyDriver2.vcxproj”的操作 - 失败。

========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

说是两个参数没有被使用,在驱动开发中,要求比较严苛,警告默认都是当错误来对待的。最简单的方法是,在代码中引用一下这两个变量,例如增加下面两行,只引用,什么也不干:

pDriverObject;

pRegPath;

这种写法太Low了,驱动提供了一个宏,专门用来引用变量:

UNREFERENCED_PARAMETER(pDriverObject);

引用后再次编译,可编译通过,生成.sys和.pdb文件。

 

总结:就是WDK版本和SDK版本要一致才行,例如,都是10.0.16299.x版本(后面的x代表的小版本可以不同)。另外,有时候Clear all工程还是编译不过,但关闭vs后清空临时文件再编译就可以了,很是诡异。