Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1683180
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类:

2011-10-09 16:57:08

驱动开发与Win32下的程序开发不同,没有一套智能的IDE环境,点点鼠标框架代码IDE就帮你生成好了。Windows下的开发为什么那么容易 上手,Visual studio功不可莫。一帮懒人在MS的“悉心呵护”下产生了,身边很多做Win32应用程序开发的朋友,都不知道ml.exe和link.exe是搞什 么的,只知道F7,F5了。驱动开发就不一样了,没一套现在的IDE和框架代码。和Win32 ASM一样,编译链接比较繁琐。根据网上的一些资料以及参考了一些驱动开发方面的书籍,总结以下几种方式。

备注:以下实现环境为Windows DDK 2600,WinXP, Visual studio 2005,如果你的系统配置与以本人的环境不一致,可能需要实际微调。
一、官方指定编译法。
1.安装DDK。请下载适合您系统的DDK开发包,自行安装到机器上。成功安装后,打开开始菜单如下图:

在”Build Environment”中将会看到几组选项,其中分为64位和32位的编译环境,Checked和Free分别表示调试版和发行版。

2.选择一项进入,比如我选择”Win XP Checked Build Environment”,将目录切换到你的驱动文件夹下。如下图:

3.从DDK安装目录的Src目录中拷贝出MAKEFILE文件到你的驱动文件夹下,此MAKEFILE文件不需要修改。内容如下:

#
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#

!INCLUDE $(NTMAKEENV)\makefile.def

4.在驱动文件夹下建立一个sources文件,内容如下:

TARGETNAME=lesson
TARGETPATH=obj
TARGETTYPE=DRIVER
SOURCES=lesson.c

TARGETNAME:生成的驱动的文件名,比如上面的将生成lesson.sys。
TARGETPATH:生成bin文件的目录
TARGETTYPE:生成的文件类型,比如DRIVER生成.sys,DYNLINK生成.dll
SOURCES:源文件列表
您也可以再指定其他项,比如TARGETLIBS来导入程序需要的库。
5.设置好上面的步骤4以后,在步骤2中输入build即可进行源代码的编译和连接,如果没有错误将会生成你要的bin。

此方法是M$指定的编译方法,比较灵活,你可以在步骤5中build后面加入一些需要的参数。在IDE横行的时代此种方法可能让许多开发人员不太习惯,如 果您不做Linux下的开发,Makefile法已经很难在Windows平台下见到了。个人感觉这种还是比较容易的,因为本人目前的嵌入式开发方式与此 类似,每天都要compile数百遍,次数多了,也就习惯了。

二、集成Visual Studio的BAT法

此编译法是上面一种方式的变通,比较适合对VS开发环境有一点依赖的开发人员,大多数人员应该是从Win32编程转过来的。直接使用命令行编译总感觉怪怪的,哪有直接F7来的惬意呢?此法需要一个脚本,我写了一个简单的,如果您喜欢这种方式,可以在其基础上修改。

? DOS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @ off :: 功能:使用VS2005编译Windows驱动 :: 使用: BuildDriver.bat [DDK Install_Directory] [Project Directory] [Build mode] :: Code by lonkil   "%1" =="" usage "%2" =="" usage "%3" =="" usage %1\bin\setenv.bat usage %1\bin\setenv.bat %1 %3 /d %2 build   :usage BuildDriver.bat [DDK Install_Directory] [Project Directory] [Build mode] BuildDriver.bat D:\WINDDK\2600 f:\driver chk :

上面的简单脚本其实就是第一种编译方式改成BAT的方式,然后集成到VS中去。下载脚本:

   (496 bytes, 429 hits)


设置Visual studio步骤:
1.”文件”->”新建项目”,如下图:

选择上图中的①位置的”常规” ②位置的”生成文件项目”。

2.进入下一步如图:

在”生成命令行”中写上:”BuildDriver.bat D:\WINDDK\2600 $(ProjectDir) chk
其中的BuildDriver.bat就是上面的那段脚本保存的文件。
D:\WINDDK\2600为我DDK安装的路径您需要改成你自己的安装目录。

$(ProjectDir)此宏在VS中您可以保持不变,代表你项目的目录。

chk代表编译模式。chk是debug版,fre表示Release版。你可以在”设置”发布”配置“中使用BuildDriver.bat D:\WINDDK\2600 $(ProjectDir) fre

3.在BuildDriver.bat的同一目录中拷入MAKEFILE和source文件,参见上一种方式的三四两步。

好了,在VS中添加一个.c文件写一个HelloWord程序,F7到目录看看,是不是已经生成好了你的HelloWord.sys了?
三、懒人的DDKWizard法
此方式是本文介绍的几种方法中最方便的一种,只要轻松点击几下鼠标不但驱动的工程在VS中已经生成好了,连驱动的代码基本框架都帮你生成好了。俗称懒人 法,因为DDKWizard的作者Oliver Schneider都说因为自己懒才写的这套脚本,DDKWizard是大大的方便了驱动的开发,再次验证了懒人推动了世界的进步, :)

1.去一个DDKWizard安装包,在本机安装。安装完成后启去VS2005,如下图:



在新建项目中,已经多了一个”DDK Project”了,如果需要DDKWizard为您生成代码模块,选择”Driver“,空项目的话选择”Empty driver“,进入下一步。



选择你开发的平台,驱动工程就建好了,很方便的说。

此种方法虽然易用,但由于作者需要做到通用,自然会在生成的代码中产生一些冗余代码,让一些有”洁癖”人士感到不爽,但删代码总比加代码来的容易, 当然你也可建立空项目。另一方面由于该方法帮程序员做了不少体力活,也隐藏了一些驱动编译的细节,个人认为初学者还是有必要看看下面的介绍的第四种编译方 法。

四、勤快人的Visual Studio配置法
上面介绍的几种方法虽然也用了VS来开发驱动,但主要依托于Makefile,VS的强大之处还是不能体现,比如交叉编辑。当发现在你在代码中有错误时, 不能通过双击Output窗口中的错误行,跳到相应的代码处,这一点让VS的方便性大减。下面这种方式利用VS的ml.exe和link.exe来生成 sys,因为sys也PE文件完全可以使用VS的ml.exe和link.exe进行编译和链接。此方式虽然在Visual studio 2005中也是点击鼠标,不过略显麻烦,但习惯了就好了。

1.新建一个Win32空的工程,如下图:




2.设置DDK的包含文件和lib库,在菜单”工具”->”选项”设置如下图:

在②中选择”包含文件”,在③的位置分别添加:”D:\WINDDK\2600\inc\wxp“、”D:\WINDDK\2600\inc\ddk\wxp“。请根据您DDK安装位置作相应的调整,注意一点就是顺序很重要,请前您刚才设置的两项尽量靠前,下面设置lib库的路径也一样。




3.在①中选择”库文件”,在②位置添加:”D:\WINDDK\2600\lib\wxp\i386“,请根据您DDK安装位置作相应的调整,如下图:

到此包含文件和库文件配置已经结束,下面进行项目的编译选项设置。

4.”项目”->”xxx属性”或Alt+F7,调出项目属性页。选择”C/C++”->”常规”设置如下图:

将”调试信息格式”设置为:”C7兼容(/Z7)
将”警告视为错误”设置为:”是(/WX)“,驱动程序兼容不得半点砂子,否则将是蓝屏。
其他采用默认值。
5.”预处理器定义”选项设置

定义这几个宏:DBG=1;WIN32=100;_X86_=1,如果是低于Visual studio2005的编译器,还需要定义WINVER=0×500.
6.”代码生成”选项设置

将”启用最小重新生成”设置为:”
将”基本运行时检查”设置为:”默认值
将”运行时库”设置为:”多线程(/MT)
7.”高级”选项设置


将”调用约定”设置为:”__stdcall(/GZ)

将”忽略所有默认库”设置为:”是(/NODEFAULTLIB)
8.”链接器”->”常规”:


将”输出文件”设置为:”$(OutDir)\$(ProjectName).sys
将”启用增量链接”设置为:”否(/INCREMENTAL:NO)
9.”输入”选项设置


将”附加依赖项”设置为:”ntoskrnl.lib如果是WDM驱动将是wdm.lib”
将”忽略所有默认库”设置为:”是(/NODEFAULTLIB)
10.”系统”选项设置


将”子系统”设置为:”本机(/SUBSYSTEM:NATIVE)
将”堆栈保留大小”设置为:”400000
将”堆栈提交大小”设置为:”10000
将”驱动程序”设置为:”驱动程序(/DRIVER)“如果是WDM驱动将是WDM (/DRIVER:WDM)

11.”高级”选项设置


将”入口点”设置为:”DriverEntry
将”基址”设置为:”0×10000
将”目标计算机”设置为:”MachineX86 (/MACHINE:X86)
编译和链接选项已经设置完成,可以F7了。但会得到如下错误:

1>D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\basetsd.h(36) : error C2220: 警告被视为错误 – 没有生成“object”文件
1>D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\basetsd.h(36) : warning C4005: “POINTER_64”: 宏重定义
1> D:\WINDDK\2600\inc\wxp\ntdef.h(134) : 参见“POINTER_64”的前一个定义

造成此问题的原因是驱动中的包含文件引入不正确,使用了PlatformSDK的包含文件了,解决办法是在”工具”->”选项”->”包含文件”的最上部添加:”D:\WINDDK\2600\inc\crt“,重新编译OK生成成功。

现在您就可以在VS中像做Win32/MFC程序一样,交叉编译链接了,当然调试是不行的,驱动是运行在Ring0下,需要内核级的调试器,如SoftIce,WinDbg此类工具进行调试。

这几种方式,我比较偏向于第一种,还是很方便的,编辑器可以使用SourceInsight跳转,查看引用,搜索非常的方便,感觉比VS+VA还要方便。作者,转载请注明出处,本文来源。

阅读(1874) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~