以文本方式查看主题 - 中文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 |