Windows内核编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 下载开发编译环境

1.1.1 编译环境介绍

在若干年前,驱动程序的编写和编译是两道独立的工序,开发者可以在Visual Studio或者其他代码编辑工具上编写驱动代码,然后通过WDK(Windows Driver Kit)来编译驱动。WDK是微软公司专为驱动开发者提供的一套开发包,里面包含了驱动开发所需要的头文件、链接库文件,以及内核驱动的编译程序。

WDK有不同的版本,一般来说,WDK的版本会跟随操作系统的版本而变化,不同版本的WDK对应着不同版本的Windows操作系统。如WDK 7600版本,其中7600表示操作系统的Build号;但有些WDK版本没有Build号,如WDK8.0版本,其中8表示Windows 8;再例如WDK10版本,10表示Windows 10,由于微软的更新策略,Windows 10作为最后一个Windows大版本,后面不会再出现类似Windows 11之类的版本,所以对于Windows 10版本的WDK,后面还会跟随着系统的版本号,如WDK 10 1709,其中10表示Windows 10,1709表示Windows 10的版本。

读者可能已经被上面的版本号绕晕了,不用担心,笔者下面为读者梳理清楚微软的版本号。上面提及的版本号无非有三类,比如Windows 10 1709 16299这个版本的系统,其中10表示操作系统的代号,类似Windows XP中的XP,Windows 7中的7;1709是系统的一个版本号,用于标识系统的具体版本,最后的16299是build号,读者可以将build号简单地理解成操作系统被编译构建时的一个号码,这个号码随着系统被编译构建的次数递增。

这里读者可能会有一个疑问,这么多的WDK版本,简直太混乱了,究竟应该下载哪一个版本呢?一般来说,每个版本的操作系统,都会对应一个版本的WDK,如果读者只是为某一个具体版本的操作系统开发驱动,如Windows 10,那可以选择对应的WDK 10;但如果读者开发的驱动需要运行在Windows XP至Windows 10系列的系统上,则需要使用低版本的WDK,如WDK 7600,因为WDK 7600可以支持Windows XP系统,并且低版本WDK编译出来的驱动,可以在高版本的操作系统上运行。看到这里,读者可能会问,既然WDK 7600编译出来的驱动,可以运行在Windows XP至Windows 10系统上,那只需要使用WDK 7600就可以了,为什么还需要使用新版WDK呢?这是因为不同版本的系统,内核提供的API(Application Programming Interface)有差异,在一般情况下,新版本的操作系统会比老版本的操作系统新增一些内核API,而使用新版本WDK,在编程过程中可以直接方便地使用这些新增的API,此外,新版本WDK在一些安全校验方面,也比老版本有所增强。总之,读者在开发驱动前,务必考虑清楚驱动所需要支持的操作系统范围,选择合适的WDK版本。对于笔者而言,如果需要考虑支持Windows XP系统,则考虑使用WDK 7600,否则要使用其他更高版本WDK。

WDK包含了一系列驱动开发所需要的头文件、链接库以及编译工具,然而,从WDK 8.0版本开始,WDK中不再提供单独的编译工具,开发者需要使用Visual Studio的MSBuild.exe来进行编译。也就是说,如果开发者需要使用WDK8.0或者更高版本的WDK,必须“配合”Visual Studio来一起工作。所谓“配合”,实际上是指WDK作为一个工具扩展的形式,集成到Visual Studio中,这是微软的一种进步,WDK集成到Visual Studio后,开发者可以在Visual Studio上编写内核驱动代码、直接编译并调试内核驱动代码,非常简单方便。

请读者务必搞清楚,只有在使用WDK8.0或者更高版本WDK的情况下,才需要配合Visual Studio来开发驱动,如果使用8.0之前的WDK版本,由于这些版本WDK自带了编译工具,读者可以使用WDK自带的编译工具对驱动代码进行编译而无须使用Visual Studio。

考虑到目前依然有不少公司与开发者在使用8.0以下的WDK版本,所以下面章节会介绍驱动的两种编译方法。

1.1.2 下载Visual Studio与WDK

以笔者的电脑为例,在编写本书时,使用的WDK版本为WDK 10(1709),对应的操作系统是Windows 10(1709)版本,其中10表示操作系统代号,1079对应操作系统的版本。笔者准备了一台64位Windows 10的开发机,系统版本信息如图1-1所示。

图1-1 系统版本信息

根据系统版本信息,从微软官方网站下载相应的Visual Studio软件以及WDK,在编写本书期间,Visual Studio与WDK下载地址为https://docs.microsoft.com/en-us/windows-hardware/drivers/ download-the-wdk,但这个地址会随着时间变化而更新,读者务必要以微软官网的最新信息为准。另外,不同版本的Visual Studio对操作系统版本的要求不同,具体要求以微软官方网站公布的为准。

下面介绍Visual Studio的安装步骤,首先在上述网址中下载Visual Studio 2017在线安装工具并运行,如图1-2所示。

图1-2 Visual Studio 2017的安装

请读者勾选“使用C++的桌面开发”选项,该选项为驱动开发的必选项目,其他选项请读者根据需要自由勾选。在完成勾选后,点击右下角的“安装”按钮,安装过程为在线安装,安装速度取决于当前的网络情况。

经过漫长的等待后,Visual Studio终于安装完毕,接下来需要下载安装WDK,由于后面章节需要介绍两种驱动程序的编译方法,所以笔者的电脑上同时下载了WDK 7600版本,以及WDK 10(1709)两个版本,WDK的安装过程非常简单,读者直接按照提示进行即可,WDK 10(1709)的安装界面如图1-3所示。

图1-3 WDK 10(1709)的安装界面

注意,如果在一台没有安装Visual Studio的电脑上安装WDK8或更高版本的WDK,在安装前会有如图1-4所示的提示。

图1-4 WDK安装提示

这个提示的意思是说,该版本的WDK没有包含编译工具,安装后不能进行驱动代码编译,需要配合Visual Studio。如果读者已经安装了Visual Studio,则不会有以上提示。

安装完WDK 10(1709)后,会弹出一个提示框,询问是否安装WDK Visual Studio扩展,按照提示点击“安装”即可,如图1-5所示。

图1-5 安装WDK扩展

上面步骤完成后,打开Visual Studio,检查驱动插件是否安装成功。如图1-6所示,如果Visual Studio上面的菜单中出现“Driver”菜单,则说明WDK已经成功集成到了Visual Studio中。

图1-6 Visual Studio开发界面