用VC6.0集成环境快速开发VxD

2016-02-19 16:41 6 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐用VC6.0集成环境快速开发VxD,无聊中的都看过来。

【 tulaoshi.com - 编程语言 】

  VxD (Virtual Device Driver), 即虚拟设备驱动程序, 是运行在处理器Ring0特权级别的驱动程序,可以执行任何处理器指令,访问机器中的任何数据寄存器。VxD被用作Windows 9x系统和物理设备之间的接口,扩展了WINDOWS 系统的核心服务,能够访问和控制实际的硬件环境。

  随着WIN 2000和新一代的设备驱动程序WDM(Windows Driver Model)推出,预计VxD将慢慢过时,而现实情况却是:随便打开一种网络计数器的统计窗口就会发现,Windows 98 系统仍然占据了90%以上的市场份额。怎么才能掌握一种省时高效开发VXD的方法,就成为程序员们迫切需要解决的问题。

  回顾传统的方法,用微软的DDK来编写VXD,是一项非常烦琐漫长的过程:

  1 编辑代码居然没有图形界面,还是在DOS的命令行中用EDIT,EDIT不支持多窗口,查看、替换代码都很不方便。

  2 编译只能用VC5.0,而不能用的VC6.0。在WIN 98 DDK 帮助中, System Requirements 部分,微软清楚地提醒大家:Note that Visual C++ 6.0 is not supported for any of the samples.

  3 对静态VxD,每次改写代码,都需要在system.ini 文 件 中,对节[386Enh] 加 一 行:device= VxD文件名, 每次改写,都要重新启动计算机,每次都要经过漫长的等待过程,简直让人无法忍受。

  如何解决上述3个问题,笔者仅就工作中取得的经验,谈谈用VC6.0集成环境快速开发VxD的方法,希望能给大家带来一些帮助。

  在开发护花使者反黄软件时,笔者采用了VtoolsD 3.0来编写文件保护VxD模块。

  VtoolsD 3.0 是Compuware 公司开发的软件包,包含几个实用工具:

  1. QuickVxD:创建VxD的C和C++语言框架,它不仅支持VC5.0和VC6.0 ,而且支持Borland C++ 5.x。和VC的AppWizard 类似,QuickVxD相当于一个代码生成器,不同的是AppWizard用MFC类库来生成程序框架,而QUICKVXD利用自定义的一系列宏和类来生成程序框架。

  2. Debug Monitor:动态装卸并显示VxD的调试信息,不仅能装载动态VxD,而且还可以装载静态VxD, 装载后调试完毕,无论是动态还是静态的VxD,都可以随时卸载。这是一个足以让微软为之汗颜的强大功能,成功地避免了编写静态VxD每次都要重新启动的麻烦,给编程者带来极大的方便。

  3.VxdVer.exe:DOS 命令行工具,可以设置VxD的版本信息。这个小工具也很重要,因为用VC6.0无法设置VxD版本信息,只能通过VxdVer来手工设置。

  下面,详细介绍一下用VC6.0集成环境快速开发VxD的具体步骤:

  首先用QuickVxd生成VxD的框架程序,点击:开始菜单/Numega VtoolsD/QuickVxD,打开QuickVxD,选取Device Parameters ,设置Device Name =MY;选取OutPut Files, 然后按下Generate Now按钮,就生成了VxD的框架源程序,它包括3个文件:后缀为.h的头文件;后缀为.c或cpp的代码文件;后缀为.mak的工程文件。然后,我们把这3个文件:MY.h、 MY.cpp和My.mak 复制到E:my目录下。传统的在命令行中生成VxD的方法如下:

  点击:开始菜单/Development Kits/Windows 98 DDK/Checked(Free) Build Environment,

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  设置编译环境,在DOS的命令行中,找到MY .mak文件,设置E:my为当前目录,输入指令:nmake,即可生成后缀为.VxD的文件。

  然后,我们再把VxD的框架程序和VC6.0的开发环境集成在一起:

  1.把VxD的工程文件集成进入VC6.0的编译器:

  在VC6.0中新建工作空间文件,打开VC6.0,选择File/New,选择Project tab,点击Makefile, 在Project Name中输入my, 在Location中输入E:my, (注意:在新建Makefile时,project name 的名字要和 Location的目录名保持一致,在本例中同为my。) 然后点击ok,在OutPut中,把原来的my.exe换成my.vxd,点击Finish.

  这时,VC6.0就自动生成了项目文件my.dsp和工作空间文件my.dsw。然后,就可以用VC6.0的编译器来生成VxD了,方法如下:点击VC6.0的菜单Build/Build my.vxd。

  2.把Vxd的源文件集成进入VC6.0的编辑器:

  在VC6.0的WorkSpace窗口,选择FileView页面,右键点击Source Files,在快捷菜单中,选择Add Files to Folder,添加源文件MY.cpp;如法炮制,添加头文件MY.h。

  这时,我们就能通过VC6.0 的WorkSpace窗口来观察VxD类了,点击Class View页面,可以看到my.vxd的3个类:MyDevice, MyThread, MyVm。至此,我们编辑VxD代码时,再也不需要用命令行的EDIT.COM。

  要想在编辑器中工作得更方便,我们还需要设置浏览信息,才能用F12来查看类的定义和参考。方法如下:

  1) 选择VC6.0的菜单:Project/Settings

  2) 设置 Build Command Line: nmake /f "my.mak" BROWSE=1;

  3) 设置 Browse info File Name: MY;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  4) 点击ok,然后选择VC6.0的菜单File/Open,打开MY.bsc;

  这时,用右键点击VC6.0的源代码窗口,快捷菜单中就会出现 Goto Definition of和Goto Reference of 这2个选项。然后,我们就可以用VC6.0中非常熟悉的界面来编辑VxD的源代码了,是不是很方便吧?

  3. 把Debug Monitor添加到VC6.0的工具菜单里:

  在调试VxD源代码时,常用dprintf()或dout来输出调试信息,Debug Monitor可以动态装卸并显示VxD的调试信息,我们可以把这个调试工具也集成在VC6.0中。点击VC6.0的菜单Tools/Customize,选择Tools项,输入新建菜单的名称VxD Monitor 或任意别的名称,设置Command: C:Program FilesNuMegaVtoolsDBinmonitor.exe,即可以把Debug Monitor添加到VC6.0的工具菜单里。 当我们调试VxD时,可以点击刚才新建的VxD Monitor菜单,运行Debug Monitor。选择Debug Monitor的菜单File/Open Driver来装载要调试的VxD;选择菜单File/Start Drive 来运行VxD, 运行后,在Debug Monitor的窗口中,就能看到调试信息了。这个功能相当于VC6.0的TRACE()。调试完毕,退出Debug Monitor时,一定要注意先点击菜单File/Stop Driver,停止运行VxD,不然,再次进入Debug Monitor时,必定造成系统崩溃。

  4. 设置VxD的版本信息。

  在软件升级时,文件的版本信息起着至关重要的作用。用VC6.0无法设置VxD版本信息,只能通过VxdVer来手工设置。(希望国内一个很著名的软件作者,看了此方法后,也把自己的SthVxd.vxd加上版本信息。)

  最初,作者试图通过VC6.0来添加版本信息,但无论是修改VxD的头文件,还是设置VC6.0的Resource Files ,均告无效。看过VtoolsD的帮助文件,对VxD Ver的用法的介绍也是含糊不清,居然也不举个例子说明,苦了VxD的初学者。

  作者经过在网上查找资料,并不断摸索,终于找到了设置VxD的方法:

  如果要生成的VxD是MY.vxd,就用EDIT新建一个同名的MY.vrc, 以护花使者文件防删模块antidel.vxd为例, MY.vrc的内容如下:

  CompanyName = "http://iflower.363.net"

  FileDescription = "antidel file"

  FileVersion = "Version 1.01"

  InternalName = "ANTIDEL"

  LegalCopyright = "mafeitao@371.net"

  OriginalFilename = "antidel.vxd"

  ProductName = "antidel"

  ProductVersion = "Version 1.01"

  Translation = 0x409, 0x4E4

  存盘退出,在命令行执行:VxdVer.exe my.vcr my.res, 然后,在用VC6.0重新编译一边MY.vxd,VxD的版本信息就设置成功了。

  以前,我一直觉得编写VxD是一项很难的工作,其实,掌握了方法并不难。希望本文能为大家编写VxD带来帮助。有兴趣的朋友可以光临我的网页:http://iflower.363.net/,欢迎大家来信探讨:mafeitao@sina.com

来源:http://www.tulaoshi.com/n/20160219/1612787.html

延伸阅读
集成开发环境的元素 Basic 的工作环境常常是指集成开发环境或 IDE,这是因为它在一个公共环境里集成了许多不同的功能,例如,设计、编辑、编译和调试。在大多传统开发工具中,每个功能都是以一个独立的程序运行,并都有自己的界面。 本节,将讨论以下主题: 1.启动(Visual Basic IDEvbconStartingVisualBasicIDE)启动和运...
标准C++规定new一个对象时如果分配内存失败就应抛出一个std::bad_alloc异常,如果不希望抛出异常而仅仅传回一个NULL指针,可以用new的无异常版本:new(nothrow)。 VC6.0在new头文件中声明了这两种operator new操作符: void *__cdecl operator new(size_t) _THROW1(std::bad_alloc); void *__cdecl operator new(size_t, const std::no...
最近做开发碰到了长字符串匹配、搜索的问题,最先想到的是使用正则表达式,简单、高效。 但是我用的开发工具是VC6.0,不支持正则表达式。 上网baidu一下,发现支持正则的库还真不少,大概有以下几种:boost,GNU,VC7带的ATL中的和微软发布的greta。 网上的朋友对boost评价不错,决定就使用是它了! 1、接下来的就是下载boost库,网上很好...
在学习vc6.0技术内幕过程中遇到要添加用户自定义消息的过程.我觉得书上写的比较散,于是就自己总结了这个基本过程,以为日后备查. 首先弄清楚两点:(1)谁要发送这个消息(2)谁要接受这个消息。 用一个简单的例子来说明。对象A向B(也可以就是A到A)发送消息。 1  发送消息 首先在A的头文件中定义这个消息: #define   WM_...
标签: Web开发
关于本次Dreamweaver CS3新功能描述中,在如今Web2.0盛行、AJAX流行的时代背景下,Adobe公司的轻量级的AJAX框架Spry,尤其是当Spry集成到Dreamweaver cs3时,这无疑是最令人兴奋的。 排除与用户交互有关的Spry XML数据交互和Spry相关窗口组件不谈,最先让用户上手的就是Spry所带来的Ajax视觉效果了。在Dreamweaver cs3单击相关按钮就可以轻松...

经验教程

430

收藏

22
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部