1.3 编译第一个驱动

1.3.1 通过Visual Studio编译

如果读者已经按照前面章节的介绍,把WDK集成到了Visual Studio中,则编译驱动是一件很简单的事情。

在编译前,首先在Visual Studio的工具栏选择好所需编译的平台以及版本。平台分x86、x64以及ARM,版本可以分为Debug版本以及Release版本。如果驱动需要运行在32位Windows操作系统上,请选择x86平台;如果驱动需要运行在64位Windows操作系统上,请选择x64平台。提醒一下,64位的Windows操作系统不能运行32位的驱动程序,这有别于应用层(用户态),对于应用层的EXE来说,64位的Windows操作系统可以运行32位的EXE程序。如果读者开发的驱动需要同时工作在32位和64位Windows下,请分别选择x86与x64进行编译。至于Debug版本与Release版本,这个非常好理解,Debug版本驱动包含了较为丰富的调试信息且没有对代码进行优化,Release版本驱动对代码空间和执行效率进行了优化。如果驱动当前处于调试阶段,请选择Debug版本,当需要发布驱动时,请选择Release版本。

由于笔者在下一章需要为读者介绍驱动的运行与调试,运行环境为64位Windows 10系统,所以笔者选择了x64 Debug版进行编译,如图1-10所示。

图1-10 编译版本选择

在FirstDriver工程中,按下F7键,或者在Visual Studio的菜单中选择“生成(B)”→“生成解决方案(B)”,Visual Studio开始编译,编译成功后,读者可以在工程的文件夹目录中找到一个x64的文件夹,在x64目录下找到Debug文件夹,该文件夹下的FirstDriver.sys文件就是编译好的驱动文件,对应的还有FirstDriver.pdb文件,FirstDriver.pdb文件包含了驱动相应的调试信息,如结构体定义、函数名等,在驱动调试中非常重要。该文件夹下还有其他文件,如FirstDriver.cer以及FirstDriver.inf,读者可以暂时忽略。

1.3.2 通过WDK直接编译

如果读者安装的是老版本的WDK(如WDK 7600),需要通过WDK自带的编译程序来进行编译。在编译前,还需要准备一个Sources文件,Sources文件实际上是一个文本文件,文件名字为Sources,该文件主要描述了需要编译的C文件列表,以及需要链接的LIB库等信息,针对本例,Sources文件的内容编写如下:

TARGETNAME表示编译出来的目标名字;TARGETTYPE表示编译出来的二进制类型是DRIVER,而不是LIB或其他;SOURCES后面是需要编译的C文件,本例中只有一个First.c,如果有多个C文件需要编译,可以写成;

请读者自行创建一个Sources文件,并把Sources文件放到与First.c文件同层的文件夹下。

根据MSDN的描述,还需要准备一个MAKEFILE文件,MAKEFILE文件的内容是固定的。但经过笔者测试,使用7600版的WDK,可以不提供MAKEFILE。

由于笔者计划在64位Windows 10下运行与调试驱动,所以需要在开始菜单中找到Windows Driver Kit→选择Windows 7的x64 Checked Build Environment。在WDK编译工具的命令行中,使用cd命令进入First.c文件所在的目录,然后在命令行中输入“build”命令开始编译。注意,输入的build命令不带引号。

意外的是,在编译过程中会报以下错误:

这是因为老版本的WDK不支持__FUNCTIONW__标识。这里给读者一个建议,如果编写的驱动代码需要支持不同版本的WDK编译,请不要使用新版本WDK独有的特性。针对上面的问题,请读者修改代码,去掉__FUNCTIONW__以及配套的%ws,或者简单地把DbgPrint注释掉,当然,更好的做法是根据不同WDK版本进行条件编译。修改后重新编译。成功生成驱动文件,如图1-11所示。

成功编译后,在First.c的文件夹内会生成一个objchk_win7_amd64文件夹,这个文件夹的命名包含了驱动编译的版本信息,其中chk表示Debug版本,Win7表示使用的是Windows 7版本WDK编译环境,amd64表示64位驱动程序,在objchk_win7_amd64\amd64\文件夹下,生成了FirstDriver.sys文件以及FirstDriver.pdb文件。

本章首先介绍了内核编程环境,其中包括WDK版本的选择、驱动开发环境的安装及部署,读者可以根据这些步骤来部署内核开发环境;接下来介绍了内核编程的入口函数,剖析了一个最精简的内核代码,让读者对内核开发的框架有一个最基本的认识;本章最后介绍了两种编译内核代码的方法,读者可以根据自身需要进行选择。

图1-11 WDK工具编译驱动

通过本章的学习,读者应该具备以下能力:

(1)选择合适的WDK版本进行开发。

(2)Visual Studio与WDK的安装与集成。

(3)编写一个最精简的内核程序并编译成功。

以上三点为基本功,请读者熟练掌握,下一章将为读者介绍驱动的运行与调试