UMDF的第一个win10驱动:驱动程序开发环境完善(一)

安装好相关软件后,就可以照着microsoft网站提供的内容进行第一次“尝试”:
https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/writing-your-first-driver
这里面三个例子,第一个是是UMDF,后两个是KMDF。跑完这3个例子,可以看到UMDF和KMDF调试过程略微有些不同。
UMDF的第一个win10驱动:驱动程序开发环境完善(一)

UMDF的例子操作流程,完全按照上面网页中“Write a Universal Windows driver (UMDF 2) based on a template”(https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/writing-a-umdf-driver-based-on-a-template)的链接提示一步步操作。
操作过程中遇到了各种各样的问题,也尝试了多种解决方法。有些问题最后是解决了,但是依然感觉是稀里糊涂解决的,这主要是因为对windows、VS相关内容不熟悉。通过这几个例子,把win10驱动开发的测试环境搭起来了,所以把这三个例子的操作当做是驱动程序开发的完善环节。

问题1 :使用VS2017新建项目时,无法找到WDF模板

用VS开发驱动程序,首先就是要建一个VS工程。无论UMDF,还是KMDF,VS都已经预置了模板。
按照教程的流程,遇到的第一个问题就是在新建项目时,找不到WDF模板:
UMDF的第一个win10驱动:驱动程序开发环境完善(一)
为什么会出来这个问题,有点不太清楚。安装VS2017和WDK时,是按照先安装VS2017,再安装WDK的顺序安装的。现在想起来,估计是虽然WDK是在VS之后安装,但是安装VS时,可能没有选择“使用C++的桌面开发”组件。
出这个问题后,查了些资料,有些帖子说的是VS2017不支持WDK,这种说法显然不对。
这个问题可以按如下步骤去尝试解决:

  1. 使用WDK.vsix尝试修复WDK和VS的关联:
    进入WDK的安装目录下的Vsix目录,
    比如可能是C:\Program Files (x86)\Windows Kits\10\Vsix,里面会有WDK.vsix文件:
    UMDF的第一个win10驱动:驱动程序开发环境完善(一)
    双击这个文件,会自动执行修复过程。等文件执行结束,再次从VS中进行“新建项目”的操作。
  2. 如果执行完WDK.vsix,,新建项目时还是找不到驱动相关的WDF模板,则可能是安装VS时选择的“组件”不正确。
    进行驱动开发,需要安装“使用C++的桌面开发”组件,这在安装VS2017时,网页资料提到的是:When you install Visual Studio, select the Desktop development with C++ workload. 即下面这个组件右侧打勾:
    UMDF的第一个win10驱动:驱动程序开发环境完善(一)
    检查VS2017已经安装的组件:

在VS的“新建项目”窗口下,点击“打开Visual Studio安装程序”(下图中①的位置),然后在打开的窗口中,检查“工作负载”中“使用C++的桌面开发”是否被选中(下图中②的位置)。
UMDF的第一个win10驱动:驱动程序开发环境完善(一)
如果上图中②指示的“使用C++的桌面开发”,没有选择,重新选择。
当这个页面选择的组件发生变动(增加或者删除以前已经安装的组件)时,窗口右下角的“关闭”窗口会变成“修改”。并且同时提示需要多少硬盘空间。点击“修改”就可以开始进行VS组件的重新安装。
UMDF的第一个win10驱动:驱动程序开发环境完善(一)
我在实际操作中这样操作后,可以在新建项目时找到WDF模板。也能新建好项目,但是在编译过程中,会出现找不到device.tmh文件的问题,并且怎么都无法解决。
回想原因,可能是之前安装VS2017时,不是针对驱动开发而安装的。最先安装的是windows通用桌面组件等。
所以最后是把VS2017卸载了,然后重新安装,并且先是只选择了“使用C++的桌面开发”组件。(这样操作后,第一个例子才完全操作成功的)
安装VS2017后,再安装WDK。可以发现,在安装WDK的最后阶段,会自动运行WDK.vsix。

安装正确后,可以看到新建项目时,有如下的关于驱动开发的模板:
UMDF的第一个win10驱动:驱动程序开发环境完善(一)

问题2 :“生成解决方案”时报告错误“无法打开源文件 “device.tmh””

“生成解决方案”,就是产生驱动程序文件。这里先说明,推荐使用英文的参考资料。
先看如果使用中文页面的资料:
https://msdn.microsoft.com/zh-cn/library/hh439659(v=vs.85).aspx?f=255&MSPPError=-2147217396
其中第8步,介绍的是:
UMDF的第一个win10驱动:驱动程序开发环境完善(一)
我安装的VS2017(刚开始不小心装成了中文版本,最好也装英文版本的),中文菜单列表中,没有“构建”这个菜单,而是叫“生成”:
UMDF的第一个win10驱动:驱动程序开发环境完善(一)
所以最先开始就只能尝试着按照以前对“编译”的理解,选择了“生成”。
在英文版本软件中,这里分别是 Build --> Build Solution。所以估计中文页面的资料,“翻译”时是没有参照汉化的软件界面,“想当然”进行的。这也难怪,比如我之前做FPGA设计,有个compile的过程,所以用“编译”用习惯了,我就习惯使用编译这个词来表示Build的过程。

回到正题:
在Build过程中,报告如下错误信息:
UMDF的第一个win10驱动:驱动程序开发环境完善(一)

这个错误弄了很久。因为之前跟人了解过一点VS的东西,所以第一直觉就是VS的“环境变量”设置不对,造成找不到编译需要的文件。
后来无论如何都解决不了这个问题,初步了解(结合后面的体会),.tmh是临时文件,是新建工程时,Build自动产生的一个文件。Build时找不到这个文件,多半是软件安装出了问题。

所以如果你遇到这个问题,直接卸载VS,重新安装全部需要的软件是最好的选择