以一个简单的实例介绍DriverStudio的使用方法,通过此实例还能大致了解windows驱动的原理。通常学习编程的第一个实例都是Hello什么,比如我们在学C语言时的第一个例子通常是Hello World,在DriverStudio里也提供了一个Hello WDM的实例,我们就通过这个实例了解DriverStudio的大致结构。 在这里我们不自己创建这个例子,DriverStudio已经为我们提供了这样一个实例(在下一节中将看到怎么用DriverStudio的Driver Wizards向导建立驱动程序框架),这个实例位于“Compuware\DriverStudio\DriverWorks\Examples\wdm\hellowdm”,我们在VC6环境下通过菜单“File”->“Open Workspace”来打开它,看看一个最简的驱动程序是什么样的。 1、编译 选择菜单“Project”->“Set Active Project”->“HelloWdm”,如下图所示: 选择菜单“Project”->“Settings”,弹出“Project Settings”对话框,切换到“Link”页,看看“Project Options”下方文本框中有没有ntstrsafe.lib,有的话则将其删除,如下图所示: 编译,编译方法同开发环境配置一节中介绍的编译库文件的方法一样,选择菜单“Build”->“Batch Build”,弹出编译对话框,编译需要的驱动程序版(其中Checked为调试版本,Free为发行版本: 2、安装驱动程序 安装驱程序前先打开DriverStudio提供的一个实用工具DriverMonitor,从开始菜单程序组的“Compuware DriverStudio”->“Test”下可以找到,我们主要用此工具来监测驱动程序发出的Debug信息,它还有另外的一个作用,就是用它来加裁/卸载驱动程序(这个功能我没有试验成功,可能是因为WinXP不属于NT4内核的缘故),其详细信息可以查看帮助文件。DriverMonitor的Debug监测功能适用于以下条件:1)Windows NT/2K/XP系统内核模式下只限于DbgPrint发出的调试信息;2)Windows 9x系统下只限于Out_Debug_String发出的调试信息;3)Windows 9x/NT/2K/XP系统用户模式下只限于OutputDebugString发出的调试信息。 将安装信息文件C:\Program Files\Compuware\DriverStudio\DriverWorks\Examples\wdm\hellowdm\sys\HelloWdm.inf复制到C:\Program Files\Compuware\DriverStudio\DriverWorks\Examples\wdm\hellowdm\sys\objchk\i386目录。打开控制面板里的“添加硬件”启动“添加硬件向导”,如下图所示: 点击“下一步”,如果您的系统里有已经连接上的设备没有安装驱动程序,将会提示找到新硬件,如下图所示,此时可以点“取消”按钮,当然您也可以点“下一步”将这个硬件的驱动安装好,不过安装完后需要重新运行添加硬件向导来安装我的第一个驱动程序实例。 在下面的对话框中选择“是,我已经连接了此硬件(Y)”选项,然后点“下一步” 在下面的对话框中,选择“添加新的硬件设备” 在下面的对话框中选择“安装我手动从列表选择的硬件(高级)” 在下面的对话框中选择“显示所有设备”,然后点击“下一步” 在下面的对话框中选择“从磁盘安装” “厂商文件复制来源”选择:C:\Program Files\Compuware\DriverStudio\DriverWorks\Examples\wdm\hellowdm\sys\objchk\i386\HelloWdm.inf,然后点确定 在后面的对话框中一路点“下一步”,最后完成驱动程序的安装。 我们打开设备管理器,发现HelloWdm驱动程序已经安装上了,如下图所示:
3、测试驱动程序 切换到DriverMonitor,我们可以找到“Message text”列中有以“HelloWdm:”开始的字符串,这是驱动程序发出的调试信息,如下图所示: 下面我们用HelloWdm实例中自带的测试程序进行测试。切换到VC6,选择菜单“Project”->“Set Active Project”->“Hello App”,如下图所示: 编译测试程序:选择菜单“DriverStudio”->“Build with BUILD.EXE”进行编译(如果编译不成功,确认是否配置好“DDK Build Settings” 运行测试程序:按Ctrl+F5,将弹出基于命令行模式的测试程序,如下图所示: 切换到DriverMonitor,我们发现驱动程序又发出了三条调试信息,如下图所示: 大家可以分析这个驱动程序的结构,不过您如果不是专业驱动开发人员的话,建议不要探索的过深,因为Windows设备驱动程序太过于庞大和复杂了,我自已也只是略懂一点点皮毛^_^。 4、小试身手 一般Hello World类程序都会输出一个“Hello World”字符串,但Hello Wdm却没有,下面我们来修改一下这个驱动程序,让它变更生动一点,也输出一个“Hello Wdm”字符串。我们来实现这样一个功能:向设备写入字符串“Hello Wdm!!!”,然后设备再将收到的字符串“显示”出来。Windows系统中一般通过调用WriteFile来向设备写入数据,通过“基础知识”一节,我们知道调用WriteFile时最终会转化为对驱动程序IRP_MJ_WRITE功能代码所对应的 Dispatch例程的调用,下面我们来增加驱动程序IRP_MJ_WRITE功能代码所对应的 Dispatch例程。 通过查看DriverWorks的帮助文档,得知实现IRP_MJ_WRITE的功能函数原型为KDevice::Write,我们来继承它。 1)在HelloDev.h中找到以下内容:
在后面加入:
2)还要在function.h中加入
3)在HelloDev.c中实例化Write功能函数,加入的内容如下:
4)选择菜单“Build”->“Batch Build”编译驱动程序,然后重新安装编译好的驱动程序。 5)在HelloApp.cpp中定位到main函数,找到下面语句
在前面加入以下这段代码:
6)选择菜单“Build”->“Batch Build”,编译驱动程序,然后重新安装驱动程序。 7) 选择菜单“DriverStudio”->“Build with BUILD.EXE”进行编译(编译前确认是否配置好“DDK Build Settings”),然后执行编译后的测试程序,我们可以看到运行后的结果,如下图所示:
测试程序的运行结果 DriverMonitor监测到调试信息
|