WDM(Win32 Driver Model),即Win32驱动程序模型,是Microsoft力推的全新驱动程序模式,旨在通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性。
目前,用于WDM驱动程序开发的主要工具是Microsoft公司提供的DDK(Driver Development Kit),其中包含许多内核态函数及数据结构的定义;包含很多非常有用的调试、测试及构造工具,还提供了许多驱动程序实例和丰富的帮助文档。此外,开发人员通常都会在Visual Studio集成开发环境中创建、编辑设备驱动程序项目。
在Visual Studio中创建了程序的工程之后、必须经过编译、链接才能构成程序可执行文件。但由于Visual Studio不能用于内核程序的构造,所以常常需要退出编辑环境,使用DDK中提供的专用工具Build来构造设备驱动程序。
为了提高驱动程序的开发效率,简化驱动程序的构造过程,我们可以通过改变设置,从Visual Studio直接构造WDM驱动程序。
本文将以一个简单的Windows设备驱动程序WdmTest为例,介绍其创建和构造过程。
1 系统设置
1.1 DDK安装
编写WDM设备驱动程序之前需要安装Microsoft的驱动程序开发工具包DDK。
安装DDK后,在DDK程序组下有Check和Free两个编译环境,Check环境用于编译带调试信息的驱动程序,Free则是编译正式发布版本的环境。
1.2 环境变量设置
DDK安装成功后,需要为其设置环境变量。
首先,设置一个叫做DDKROOT的环境变量,它指向Windows2000 DDK或Windows98 DDK的基目录。
然后,设置一个叫做WDMDIR的环境变量,它指向驱动程序的基目录。
在Windows98平台下,把这些环境变量添加到AUTOEXEC.BAT文件中;在Windows2000平台下,在控制面板“系统”程序的“高级”标签中的“环境变量”中设置环境变量。
2 WDM驱动程序组成
一个最基本的设备驱动程序应该包含2部分:驱动程序源文件和驱动程序构造文件。
表1列出了WdmTest使用的所有源文件,表2列出了WdmTest使用的所有构造件。
----表1 WdmTest源文件----
Init.cpp 进入和卸载代码
Dispatch.cpp 主要的IRP分发例程
Pnp.cpp 即插即用和代码
Power.cpp 电源管理代码
WdmTest.rc 版本资源
WdmTest.h 驱动程序头文件
GUIDs.h GUID定义
Ioctl.h IOCTL定义
resource.h 资源编辑器头文件
----------------------------------------
-----WdmTest构造文件-----
SOURCES build指定
makefile 标准makefile
MakeDrvier Makefile项目批处理文件
----------------------------------------
3. 驱动程序的构造
DDK Build命令行实用程序是构造驱动程序的主要工具,使用正确的编译器和连接器设置,通过调用nmake实用程序来构造驱动程序。Build把构造进展的详细信息和错误结果显示到标准输出。Build本身其实相当简单,编译的大部分工作实际上由Build传递给nmake来进行。
由于Build使用的编译和连接工具与Visual Studio相同,可以从Visual Studio中激活Build,因此可以设置VC++,从Visual Studio直接构造WDM驱动程序。这将使驱动程序的编辑与构造在相同的环境中进行,从而使其开发更加方便。
采用的方法是使用一个Makefile项目,它激活Build命令行实用程序构造驱动程序。所有必要的构造文件必须正确设置,包括SOURCES文件、MakeDrvier.bat、makefile文件。
3.1 SOURCES文件
Build在当前目录中查找一个叫做SOURCES的nmake宏文件,了解驱动程序构造的详细信息。WdmTest项目的SOURCES文件如下:
TARGETNAME=WdmTest
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=SYS
INCLUDES=$(BASEDIR)/inc;
SOURCES= Init.cpp /
Dispatch.cpp /
Pnp.cpp /
Power.cpp /
WdmTest.rc
TARGETNAME表示程序的目标名为WdmTest.sys;TARGETTYPE和DRIVERTYPE表示程序是一个WDM驱动程序,TARGETPATH表示程序在SYS子目录中构造;INCLUDES表示DDK inc目录被添加到头文件的搜索列表中;SOURCES宏指定要编译的文件列表。
3.2 makefile文件
makefile文件激活DDK inc目录中的标准构造文件makefile.def。WdmTest项目的makefile文件如下:
!INCLUDE $(NTMAKEENV)/makefile.def
3.3 MakeDrvier.bat文件
MakeDrvier.bat是一个批处理文件,它将调用DDK的setenv命令。setenv.bat文件存在于DDK的bin目录中,用于设置构造过程中的环境变量,同时调用bin目录中的其他批处理文件。
MakeDrvier.bat至少要传递4个参数:DDK基目录(%1)、源驱动器(%2)、源目录(%3)和构造类型(%4)(“free”或“checked”),任何其他的参数(%5……)直接传递给Build。
MakeDrvier.bat首先检查setenv.bat是否存在,然后调用etenv命令为build目标正确设置环境变量,改变目录为源驱动器和源目录,并最后调用build。
MakeDrvier命令文件的屏幕输出出现在Visual Studio Output窗口中。
WdmTest项目的MakeDrvier.bat文件如下:
@echo off
if not exist %1/bin/setenv.bat goto warning
call %1/bin/setenv %1 %4
%2
cd %3
build -b -w %5 %6 %7 %8 %9
echo OK MakeDriver
goto exit
:warning %1
echo Warning %1/bin/setenv.bat not exist
goto exit
:exit
3.4 Makefile构造环境
当创建新的Makefile项目时,Visual Studio缺省提供2个build配置:“Win32 Debug”和“Win32 Release”。为了和DDK配置对应,一般习惯通过“编译-配置”菜单删除这两个配置,并增加2个新的配置:“Win32 Checked”和“Win32 Free”。
对于“Win32 Free”配置,按表3所示设置项目的设定;对于Win32 Checked”配置,在创建命令行中将“free”改为“checked”。
-----表3 Win32 Free配置设置-----
创建命令行 MakeDriver %DDKROOT% C: %WDMDIR%/WdmTest/sys free
重建全部选项 -nmake /a
输出文件名 WdmTest.sys
创建命令行运行MakeDrvier批处理文件,使用DDKROOT和WDMDIR两个环境变量 。
----------------------------------------
3.5 驱动程序的构造与编译
驱动程序编辑完成后,在Visual C++中直接运行“编译”菜单中的“构造 WdmTest”即可进行编译构造驱动程序。
若有错误,则双击错误提示项即可迅速回到源代码中修改。若无错误,则产生驱动程序Wdm Test.sys存放在自由或检查构造目录中。
4 结束语
综上所述,介绍了在Visual Studio中,通过建立Makefile项目,激活“DDK Build”命令行实用程序构造WDM驱动程序的方法。这种方法使我们可以通过改变VC++的设置,从Visual Studio直接构造WDM驱动程序,从而提高驱动程序的开发效率,简化驱动程序的构造过程