windows驱动开发的一点体会

初步开始开发驱动,而且都是自己一步一步自己走过来的,难免磕磕碰碰,走了不少弯路,做的是一个windows过滤驱动,过滤驱动应该算是驱动开发里最好开发的,只是对经过的IRP进行一个处理(具体什么处理,看你自己的需求)。

 

开发环境: Windows XP, 开发包: Windows DDK 2600。这里重点介绍一下调试环境,安装虚拟机,使用虚拟机作为目标PC(主要是蓝屏电脑就会重启),把IP设置成跟主PC的网段一致,这样做的好处是可以方便主PC跟目标PC共享文件,同时WinDbg也可以打开虚拟机上的调试文件;下载WinDbg软件,免费调试软件,主要用于内核级的调试,具体使用可以参考WinDbg使用手册,可以进行单步跟踪,功能十分强大;下载DbgView软件,这个软件同样是免费的,可以查看调试输出信息(由DbgPrint或KdPrint函数打印),使用也非常方便,具体参考微软官方网站,驱动程序的调试信息将打印在DbgView上,这样便于定位程序的错误(主要还是逻辑错误);如果驱动程序发生错误,可能引起蓝屏,这时可以通过下面介绍的方法进行错误的定位,系统崩溃之前,操作系统会将当前的调用堆栈记录成一个dump文件,不过首先要确定计算机是否让操作系统存储了Dump信息,方法如下:右键单击"我的电脑", 选择"属性",弹出"系统属性"对话框,在对话框中,单击"高级"选项卡,然后单击"设置"按钮(第三个设置按钮),弹出一个对话框,在弹出的对话框中选中所有的复选框,OK了,这样dump文件将存放在C:/WINDOWS/Minidump目录下,等待虚拟机重启之后,使用WinDbg打开这个目录下刚刚崩溃产生的dump文件可以知道错误发生在什么地方,这时需要先设置好Image File Path,WinDbg--File--Image File Path,将sys文件的目录写上去,这个.sys文件应该是驱动程序目录下的.sys文件,这点要注意,关于符号表路径设置,这里就不啰嗦了,接着打开dump文件后可以看到command窗口,选择View--Call Stack,看到函数调用栈,这种函数调用关系式系统崩溃前的一个快照,因此可以分析出调用中的那句话导致了系统崩溃。如果不蓝屏,使用DbgView进行错误定位,如果是系统提供的内核函数调用出错,可以检查返回值(通过DbgPrint或KdPrint函数打印),查看ntstatus.h文件,找到对应错误码,从而确定了错误的根源。

 

在写驱动程序的时候,尽量不使用应用层的RTL(运行时库)函数,全部使用DDK提供的RTL函数,这主要是因为驱动程序运行在RING 0级,而应用程序运行在RING 3级;尽量少使用全局变量(不过我还是用了^_^),主要是因为全局变量可能导致函数的不可重入性,解决的办法就是将你要使用的全局变量以设备扩展的形式存储,并加以适当的同步保护措施(例如使用自旋锁SpinLock)。

 

你可能感兴趣的:(windows,虚拟机,command,File,Path,DDK)