Win1909+vs2019+Windows 10 WDK 2004(10.0.19041.1) + Windows 10 SDK 2004(10.0.19041.1)环境搭建
“Individual components”選項(xiàng)卡里,必須選中“Visual Studio SDK”(注意不是Windows SDK),這樣在安裝WDK的時(shí)候,才會(huì)安裝VS插件(即vs開始菜單中增加Driver菜單項(xiàng),且VS創(chuàng)建工程的時(shí)候,可以選項(xiàng)驅(qū)動(dòng)類型的工程模板)。
創(chuàng)建First.c文件并加入到工程,內(nèi)容如下:
#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. 編譯,出現(xiàn)錯(cuò)誤:
1>------ 已啟動(dòng)生成: 項(xiàng)目: 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: 此項(xiàng)目需要緩解了 Spectre 漏洞的庫(kù)。從 Visual Studio 安裝程序(單個(gè)組件選項(xiàng)卡)為正在使用的任何工具集和體系結(jié)構(gòu)安裝它們。了解詳細(xì)信息: https://aka.ms/Ofhn4c
1>已完成生成項(xiàng)目“MyDriver1.vcxproj”的操作 - 失敗。
========== 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過 0 個(gè) ==========
?
這個(gè)錯(cuò)誤提示要在VS2019安裝程序中,定位到“單個(gè)組件”選項(xiàng)卡,把Spectre組件安裝了,經(jīng)搜索,有大量Spectre選項(xiàng),先把X86/X64的全裝了,大約10幾GB。
重新編譯,也是然并卵。
還是沒有把引起編譯錯(cuò)誤的關(guān)鍵Spectre項(xiàng)安裝上。從上圖可以看到,這些Spectre是針對(duì)不同SDK版本的,有for ATL V141的,有For C++ V14.20的,有“帶有Spectre緩解措施的C++ v14.21 ATL for V142生成工具”的,這里有從v14.21到v14.27。全裝太大,該裝哪個(gè)呢,突然想到可以從工程配置中找一找。在工程宏中,搜索14.2,出來的全是14.27,所以可以確認(rèn),我們需要的是14.27版本:
接著,在vs2019安裝程序中,搜索14.27:
把這些都安裝上,生新編譯,這個(gè)錯(cuò)誤就沒有了。
也可以采用第二種方案,就是設(shè)置工程,讓它不使用Spectre緩解:
如果編譯出現(xiàn)下面的錯(cuò)誤:
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版本即可:
對(duì)于WDK1709,我們指定與之匹配的SDK版本:10.0.16299.0
?
6. 再次編譯,出現(xiàn)如下錯(cuò)誤:
1>------ 已啟動(dòng)生成: 項(xiàng)目: 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>已完成生成項(xiàng)目“MyDriver2.vcxproj”的操作 - 失敗。
========== 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過 0 個(gè) ==========
不管它,先把MyDriver2.inf從工程中移除,
7. 再次編譯,出現(xiàn)如下錯(cuò)誤:
1>------ 已啟動(dòng)生成: 項(xiàng)目: 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: 以下警告被視為錯(cuò)誤
1>D:\myvc\MyDriver2\First.c(3,34): warning C4100: “pDriverObject”: 未引用的形參
1>D:\myvc\MyDriver2\First.c(8,68): warning C4100: “pRegPath”: 未引用的形參
1>已完成生成項(xiàng)目“MyDriver2.vcxproj”的操作 - 失敗。
========== 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過 0 個(gè) ==========
說是兩個(gè)參數(shù)沒有被使用,在驅(qū)動(dòng)開發(fā)中,要求比較嚴(yán)苛,警告默認(rèn)都是當(dāng)錯(cuò)誤來對(duì)待的。最簡(jiǎn)單的方法是,在代碼中引用一下這兩個(gè)變量,例如增加下面兩行,只引用,什么也不干:
pDriverObject;
pRegPath;
這種寫法太Low了,驅(qū)動(dòng)提供了一個(gè)宏,專門用來引用變量:
UNREFERENCED_PARAMETER(pDriverObject);
引用后再次編譯,可編譯通過,生成.sys和.pdb文件。
?
總結(jié):就是WDK版本和SDK版本要一致才行,例如,都是10.0.16299.x版本(后面的x代表的小版本可以不同)。另外,有時(shí)候Clear all工程還是編譯不過,但關(guān)閉vs后清空臨時(shí)文件再編譯就可以了,很是詭異。
總結(jié)
以上是生活随笔為你收集整理的Win1909+vs2019+Windows 10 WDK 2004(10.0.19041.1) + Windows 10 SDK 2004(10.0.19041.1)环境搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 61850协议服务器端开发,IEC618
- 下一篇: 中科微GPS模块使用教程 ATGM332