文件系统驱动编程基本篇之1——我们的筹备
副标题#e#
一、导言
在四个月漫长的交战后,终于在国庆节的本日完成了基本篇系列。本文写作的初志很简朴,就是给安静的池水中插手一点波涛,假如各人在阅读后感觉到一点生气,激起摸索未知的热情,笔者也会感想由衷的喜悦。
本系列文章为业余编程喜好者而写,仅仅作为初学者的一个警惕,真正的英华存在于参考资料*中。常识的积聚将经验从薄到厚,再从厚到薄的重复进程,为了打下安稳的基本,请读者务必在阅读本文的基本上耗费须要的时间完成参考资料。
二、根基架构
为了担保机能,汇编与c成为操纵系统编写的首选语言,Windows家属的前辈都不破例,唯独Vista那复杂的身躯,让人不禁迷惑微软毕竟如何才气诞下比恐龙还大的怪物。与此相反,WinPE作为维护型操纵系统可以被一个32M的U盘所容纳。不管外观上的诸多差别,成果上的强弱区别,我们所体贴的是它们的共性——即操纵系统的内核。与操纵系统密不行分的文件系统,就成为我们研究内核的一条途径。
Windows回收了基于工具模子(object-based model)的设计方法,各成果分别为差异的组件,两幅常见的架构图如下:
我们把进口选定为Win32子系统(Win32 Subsystem),它是我们打仗最多,也最熟悉的一个子系统。硬件抽象层(HAL)及其以下部门今朝不在我们存眷的核心内,我们将精神会合在系统执行层和焦点层,它们详细的成果请参看资料2的第一章。
内核模式下除了屈指可数的几个函数,一切都将是全新的——全新的思想、观念、模子、布局、函数,超过的幅度不亚于从c语言编程迁移到c++语言,用c语言的思维来进修c++一定会发生阻碍。令人欣慰的是,这里没有特色之流的术语,绝大部门内容都切合人的影象纪律。你将很快把握设备工具、IRP、IO仓库等基本布局,同时你还发明以前很难影象的PEB、TEB、_ETHREAD等一系列无具体文档甚至无文档布局都已有迹可寻,假如你足够勤奋,甚至会在一年阁下的时间后就可以阅读天书般的防火墙源码。
让我们先来完成须要的筹备事情吧。
三、调试情况的构建
在用户模式下编程,除了编译器险些可以不需要其他帮助东西。想查察输出?直接ShowMessage即可,内核模式下,假如不但愿摔得筋折骨断后才有所醒悟,你该在入门前就选好几件法宝——留意它既不是闻西同志的西瓜刀,更不是单车链。
Microsoft Visual Studio 200x + Windows IFS Kit and DDK xxx + Compuware DriverStudio 3.x + VAssistX xxx + VMware
假如影象力超强的读者,也可以选择C++Builder、Delphi + 插件的形式,有些站点正在致力于推广这方面的技能,对付新手而言,照旧用原装货为上策。Windows IFS Kit and DDK是收费软件,电驴上有试用版,依照资料6的说明完成安装,留意选上xp和2000部门;Compuware公司已经转业不做DriverStudio,幸好出家前支持了vs2005,安装完成后,按照资料5打上VisualStudio 2005 Integration fix补丁;VAssistX有试用限制,不巧有人发明不修改代码而利用trial-reset_32清Armadillo壳,可以规复试用时间,安详而靠得住。VassistX加强了编译器的语法提示、代码搜索成果,大大提高了千行局限子措施的阅读与书写效率。VMware虚拟机用于淘汰重启的烦恼,提高调试的效率。
颠末一阵繁忙后,一个已经配置好的编译器呈现了:
#p#副标题#e#
VMware虚拟机下的Debugging Tools for Windows(即WinDbg)
读者也可利用VirtualPC虚拟机。在虚拟机上安装双系统(Windows 2000,2003,xp,pe等),可利便删除造成系统启动瓦解的“不良”驱动措施。为了利便,我们把虚拟机上的操纵系统称为长途机。首先我们在当地机上安装WinDbg,运行后举办如下配置:
配置标记文件搜索目次,菜单File-Symbol File Path…-填入SRV*c:\symbols*http://msdl.microsoft.com/download/symbols串,它暗示利用微软的文件标记处事器。假如你的电脑未联网,则只能通过其他方法获取微软站点上的标记文件,回收当地标记目次,调试时往往会呈现一些版本不匹配的问题。标记文件很是重要,假如WinDbg找不到符合的标记文件,将无法理会代码里的数据布局。文件标记处事器上的标记文件用于理会操纵系统文件(dll, exe等),而你的源代码将编译发生驱动措施的标记文件。
菜单File-Open Executable…-随意选择一个可执行文件举办当地调试,WinDbg将搜索是否已经存在必需的标记文件,假如无,则通过互联网毗连文件标记处事器下载须要的标记文件,生存的目次是c:\symbols。之所以举办这一步,是辅佐初学者在毗连长途机呈现长时间的延时时,确定不是因为下载的原因造成的。
#p#分页标题#e#
运行虚拟机,打开长途机系统根目次下的boot.ini文件(大概是埋没文件),为操纵系统复制一新行,并在后添加/debug /debugport=com1 /baudrate=115200,指明毗连的方法(串口毗连)和速率(115200比特率)。如图是安装了两操纵系统的boot.ini文件:
从头运行长途机,启动界面如:
为虚拟机添加虚拟串口:封锁虚拟机,点击设置选项Eidt virtual machine settings,选择定名管道方法设置虚拟串口com1:
测试虚拟串口:运行长途机,选择debug模式进入,此时将比正常启动多出近30秒的黑屏时间,假如你的硬盘马力强劲,你会听到运转的沙沙声^_^,接下来的环境将和正常启动时沟通。在当地机上运行WinDbg,点击菜单File-Kenerl Debug…,首次毗连时按左下图举办设置,确定后WinDbg将开始实验长途毗连。为了加速毗连速度,不妨多按屡次从头同步的快捷键Ctrl-Alt-R,假如上述配置无误,则虚拟串口符号将不断闪动(中下图最右),毗连乐成后,WinDbg呈现雷同信息(右图):
调试器毗连了长途机后,就得到了长途机的节制权,长途机则处于停机状态,此时可以查察内核的环境,假如但愿它继承运行,只需要在调试器的呼吁行窗口输入g呼吁,则调试器偿还节制权,长途机将继承运行。
在http://www.osronline.com/index.cfm下载您中意的东西。
出格值得一提的几个小东西是:Dbgview,Driver Installer、IrpTracker、DriverMonitor和EzDriverInstaller,后两个东西为Driver Studio附带。
操练WinDbg的利用,实验用(二)- 二)的方法单步跟踪一个简朴的可执行措施,进修如何配置断点。
最后一步是个难点,请按照资料3尽力的完成这个事情。
四、驱动措施的编译
sources、makefiles和dirs文件
利用DriverStudio的一个目标是,借用vs强大的IDE编写代码,而挪用DDK的编译器举办编译。早期的vs编译器也支持驱动代码的编译,但跟着DDK的成长,此刻它已经完全离开了vs,两者不再担保编译代码的一致性。为了担保正确性,我们需要利用DDK的编译器来完成编译的事情。
基于效率的原因,我们还需要进修利用sources文件,它支持浩瀚的编译指令,可以实现巨大的编译设置。驱动编程中,makfiles文件是一个无关大局的副角,一般无须窜改,尽量它是必需的。假如源文件很是巨大,漫衍于多个目次,包括了多个工程,则可编写dirs文件。编译器通过dirs文件,找到各目次下的sources文件,逐一完成编译。下面我们将先容sources文件的根基写法,更多指令的具体用法可查阅资料6或Msdn。
sources是一个无后缀名的文本文件,示譬喻下:
TARGETNAME=pnpevent
TARGETPATH=obj
TARGETTYPE=DRIVER
USE_PDB=1
INCLUDES=..\..\..\generic
#TARGETLIBS=..\..\..\generic\obj$(BUILD_ALT_DIR)\$(CPU)\generic.lib \
TARGETLIBS=..\..\..\generic\obj$(BUILD_ALT_DIR)\i386\generic.lib \
SOURCES= DriverEntry.cpp \
stddcls.cpp \
control.cpp \
readwrite.cpp \
driver.rc
#号暗示注释,而*号暗示方针平台范例,编译时会被Build东西替换成相应的串,如替换成“I386”。
TARGETNAME指明驱动措施名,TARGETPATH指明生成的路径(假如没有其他指令,编译器生成的是以obj打头的路径,如objchk_wxp_x86\i386)。TARGETTYPE指明代码范例,可建设普通驱动sys、内核模式的dll、库文件lib、用户模式措施exe、用户模式的dll。TARGETLIBS指明需要引用的外部lib库文件。
INCLUDES指明需要引用的头文件目次,SOURCES指明本次需要编译的文件,文件名后的\暗示下行仍为源文件。
还可以利用C_DEFINES和USER_C_FLAGS来界说宏。对付若干年前的驱动代码,编译器大概会提示无法识别某些废弃的编译指令,视环境手工删除或变动成等价指令即可。
编译DriverStudio的VdwLibs2005.sln工程
#p#分页标题#e#
该工程位于Compuware\DriverStudio\DriverWorks\source目次下,vs2005编译器增强了语法的类型性,不修改源文件是无法完成编译的。为此,请参考资料6,凭据图三、(一)的要领直接挪用DDK举办编译。
阅读资料1第三章的错误处理惩罚小节,编译附带的源代码Chap3\SEHTEST,学会利用DriverMonitor来加载驱动、Dbgview来查察该代码的输出信息。
五、代码书写类型与编译告诫的处理惩罚
书写类型可参考本站的《华为编程类型和典型》,强调一点,驱动编程中利用了浩瀚的宏,为制止宏扩展带来的潜在问题,利用if,while,for等时,其下的子句都须以{}扩之。缩进不类型的代码可通过Alt+F8批改。
if (x)
return y; // 不推荐
if (x)
{ // 尺度名目
return y;
} // 尺度名目
调高编译器的告警级别,使任何告诫都被看成错误而遏制编译,这种严谨的立场有助于淘汰潜在的错误。发起在sources文件里至少设定W3级别:
MSC_WARNING_LEVEL=-W3
六、进修的误区
缺乏须要的计较机科学技能的理论基本,长短专业的编程喜好者碰着的一个最大的问题。在这个问题的处理惩罚上,假如采纳回避的立场,相信很快就将潜力用尽,再也没有上升的空间。有的人编了几年措施,却还在畏惧阅读其他语言书写的代码,是这个问题的一个表示。假如看到了这个问题,并但愿办理它,也需要采纳正确的要领。贪多求全,但愿先把基本理论一口吞下再来实践编程的思想也是错误的,因为理论仅仅是实践的一个抽象,两者一定存在不同,大脑也需要在实践中成立起靠得住的影像,而不是“或许,也许,根基上”这样的一种客气话,这也是本领的浮现。
我们的发起是,按照自身的实际环境,在每一个成长阶段采纳先进修理论再实践,或先实践再进修相应理论的方法,螺旋般的向上,速度固然稍慢,却能为本身积聚下成长的潜力。一个实际的例子是,计较机系的学生在入校后的前两年,计较机的实践程度往往比不上此外院系的学生,一旦他们发明实践上的许多问题可以通过已把握的基本理论来表明之后,两者的前进速度就有了质的不同。好手的一个特点是哪怕只给他透露了一个要害的单词,你所保存的奥秘很大概就被完全破解了,而对付菜鸟而言,纵然把金山搬到门口,也照旧身在福中不知福。
在基本篇中,我们推荐了大量的示例代码,这些代码可以辅佐读者更好的领略基本的理论。
完成了基本篇,您仍然处于文件系统驱动编程的边沿,对它的领略甚至比不上回收了速成大法进修的其他人,您的收获则是奇怪为什么本身先前写了如此多的垃圾代码?您将大大扩宽本身的眼界,看到控件之外的很多更有意义的常识。
独一没步伐辅佐各人的工作,就是外文阅读程度了。我们只能勉励还仅仅把握着1.5国语言的伴侣,人手一册金山词霸,首页google在线翻译,逐日半篇RFC,不出两月,拿下Msdn。虽然假如你能在Msn上交友到外洋的留学生,他们对您的辅佐将会更大。
编程本领以2万行作为分界点,还达不到这个要求的伴侣,请尽力吧。
华老师有句名言,“天才在于勤奋,智慧在于积聚”,能力性的对象当然可以辅佐您提高效率,但始终无法取代基本,假如您想在科技规模真正有所成绩,就请遵循这句话。
七、结语
基本篇将仅仅报告一些与WDM(Windows Driver Model,KMDF相当于WDM的封装类,Vista已自带)驱动编程有所关联的基本常识,限于本领,并不追求系统性和完整性。资料1作为大家级的著作,是笔者推荐的主要进修资料,本文中大部门驱动示例来历于它的配套代码。
留给初学者的一个问题是,毕竟VMware的虚拟串口支持多高的通信速率呢?
本文作为下场之前的热身,参考完成时间为一至两个礼拜。