以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  象编写应用程序一样使用VC6编写驱动程序  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=60982)


--  作者:卷积内核
--  发布时间:4/7/2008 8:52:00 AM

--  象编写应用程序一样使用VC6编写驱动程序
设计初衷
我对VC6 较熟悉,尤其喜欢他的Go To Definition的右键功能,我可以随时找到我程序
中用到的函数,结构体等详细信息,可以知道他在哪个头文件中。但我以前写的一篇用
makefile 来创建的工程虽然可以在VC6 下编译驱动,但是在编程时想查找一下某个函数或
结构,总要借助于DDK的帮助文档来查看,实在不方便!
带着一点试试的想法,居然我在VC6 下也可以象做应用程序一样的开发驱动。总之,
这是利用了VC6 的IDE环境,用了VC6下的一些工具(BSCMAKE.EXE),又利用了DDK
下的编译工具,MAKE 程序来实现的。就是按下VC6下的编译命令,我需要调用的编译器,
连接器应该是DDK 下的,而其他工具我还是用VC6 自带的。这样,我居然成功了。下面
将方法分享给大家,有不正确的地方还请指教。
准备工作
首先,如果你使用的是WINXPDDK,那么安装之后(默认安装在c 盘),找到
C:\WINDDK\2600\bin\x86。
然后,如果你安装了VC6,那么到C:\Program Files\Microsoft Visual Studio\VC98 下,你
会看到一个bin 文件夹,我们将这个文件夹先改名为binVC6。然后我们创建一个新的bin
文件夹。将C:\WINDDK\2600\bin\x86文件夹下的所有文件拷贝到C:\Program Files\Microsoft
Visual Studio\VC98\bin 目录下。注意:这个bin 目录是我们新建的,原来VC6 自带的BIN
文件夹我们已经改成了BINVC6。
将C:\Program Files\Microsoft Visual Studio\VC98\BINVC6 下的文件复制,然后粘贴到
C:\Program Files\Microsoft Visual Studio\VC98\bin 目录下,注意:系统提示是否覆盖时,请
选择不覆盖!这样VC6 编译的时候会使用DDK所带的ML,CL,LINK等程序编译驱动。
这样准备工作我们就已经作好了。至于这样的改动能不能再编译应用程序,我试了一下
不行,也没仔细查哪个文件的原因,有兴趣可以弄弄,有结果告诉我,所以目前如果要编译
应用程序,只要将BINVC6 改回来就行了。
配置VC6编译链接选项
首先我们在VC6 下新建一个工程,至于什么工程都无所谓,这里我选择一个WIN32
Dynamic-Link Libray。
--  作者:卷积内核
--  发布时间:4/7/2008 8:53:00 AM

--  
为工程起一个名字,选择OK进入下面的界面。
选择“An empty DLL project”,选择Finish。
好了工程建立完成,那么就要改写一下工程的设置选项了。打开Project Settings(ALT + F7),
看下面的介绍一步一步进行吧。
在Preprocessor Definitions 中将WIN32,_DEBUG,_WINDOWS,_MBCS ,
USRDLL,XXX_EXPORTS删除。
说明:WIN32 表示是一个WIN32 应用程序。_WINDOWS表示是一个WINDOWS应用程序。
_MBCS 表示使用多字节字符集。_DEBUG 是WIN32 调试定义。USRDLL 表示是一个动态
WIN32 连接库程序。
以上在Project Options中相对应的设置为:/D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D
"_MBCS" /D "_USRDLL" /D "UCEZ_EXPORTS"
在Preprocessor Definitions中添加:DBG,_X86_,_WIN32_WINNT=0x500
说明:DBG 为驱动程序标准调试符号定义,当定义时为CHECKED,没有定义时为FREE。
_X86_将生成INTEL平台的驱动程序。_WIN32_WINNT=0x500 为WINDOWS2000 版本。
--  作者:卷积内核
--  发布时间:4/7/2008 8:54:00 AM

--  
将Debug info 改为Program Database。否则编译时会出现警告LINK : warning LNK4075:
ignoring '/EDITANDCONTINUE' due to '/DRIVER' specification
将Calling convention: __cdecl 改为__stdcall,即在Project Options中添加/Gz设置。
将Use run-time library:Debug Multithreaded改为Debug Single-threaded。即将Project Options中的/MTd改为/Mld。
将Enable exception handling选项去掉,不使用异常处理。即去掉Project Options中的/GX 选
项。
在Additional include directories 中加入我们所包含的头文件的路径:
C:\WINDDK\2600\inc\wxp,C:\WINDDK\2600\inc\ddk\wdm\wxp,C:\WINDDK\2600\inc\ddk\wxp
最后,我们在Project Options中还会看到一个/GZ选项,我们去掉此选项,并加入/Gs –GF
选项。

--  作者:卷积内核
--  发布时间:4/7/2008 8:55:00 AM

--  
将Output file name:中的ucez.dll改为ucez.sys。
Object/library modules中加入:int64.lib ntoskrnl.lib hal.lib 这几个常用的开发驱动的库文件,
若需要引用其他的库,将他们加到后面。
选择Ignore all default libraries。
不选择Link incrementally,否则编译时会出现一个警告:LINK : warning LNK4075: ignoring
'/INCREMENTAL' due to '/RELEASE' specification
在Additional library path中加入你引入库文件的路径。
在Base address 中加入0x10000 作为驱动程序的基地址。在Entry-point symbol 中加入
DriverEntry 作为驱动程序的入口点。即在Project Options 中加入:/base:"0x10000"
/entry:"DriverEntry"
另外对于驱动的环境配置还需在Project Options 中加入:-driver -subsystem:NATIVE,4.00
/driver:wdm /subsystem:NATIVE 也行。
--  作者:卷积内核
--  发布时间:4/7/2008 8:55:00 AM

--  
不选择Link incrementally,选择Use program database。
将Project Options 中的/dll去掉。

最后注意的是:如果你的源程序为.cpp文件,那么包含文件时,用extern “C” { }圈起来,否
则编译会产生连接错误。
好了,加入你的驱动文件,进行编译吧。



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
7,175.781ms