一个网友写的用VC6.0集成环境快速开发VxD

VC6.0集成环境快速开发VxD                                                     作者/马飞涛VxD (Virtual Device Driver), 即虚拟设备驱动程序, 是运行在处理器Ring0特权级别的驱动程序,可以执行任何处理器指令,访问机器中的任何数据寄存器。VxD被用作Windows 9x系统和物理设备之间的接口,扩展了WINDOWS 系统的核心服务,能够访问 阅读详情

一个网友写的用VC6.0集成环境快速开发VxD

用VC6.0集成环境快速开发VxD            
    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,

设置编译环境,在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;

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   Files/NuMega/VtoolsD/Bin/monitor.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的版本信息就设置成功了。

顺序表(Sequential List)详解:从数组到 C 语言实现 顺序表是用连续存储单元依次存储数据元素的线性结构,数组则是其最常见的实现方式,两者本质相同、仅视角不同——数组关注物理存储,顺序表关注逻辑关系。顺序表支持随机访问 $O(1)$,但插入删除需移动元素,效率为 $O(n)$。本文用 C 语言静态数组完整实现了顺序表的初始化、增删改查操作,帮助初学者在不涉及指针的前提下理解其核心原理,为后续学习动态顺序表打下基础。 阅读详情

相关推荐

windows 驱动实例分析系列: HidHide驱动分析-HidHideCLI 篇(三)

`HID.cpp` 模块实现了完整的设备枚举与信息采集,这些功能与 GUI 版本共享相同的核心逻辑,但在输出格式上存在差异——CLI 版本输出 JSON,而 GUI 版本填充树形控件。

王马的博客 130

苍穹外卖【day10| 订单状态定时处理】

本文设计并实现订单状态自动流转机制,通过定时任务处理超时订单:15分钟未付款自动取消,派送超60分钟则标记为完成,避免状态卡死。采用MyBatis动态SQL精准更新字段,减少数据库压力。定时任务与WebSocket互补——前者兜底,后者实时通知,保障系统可靠性与用户体验。

2503_94545876的博客 64

【回溯】【中等】全排列/子集/电话号码的字母组合/组合总和/括号生成/单词搜索/分割回文串

【待更新】

2301_81831660的博客 51

cmake教程

单/多个源文件、不同目录下的源文件、组织架构(源文件/头文件/对象文件/elf文件/库文件)、库的编译控制与链接(.so/.a)、编译选项、控制选项(生成部分文件/编译部分代码)

Wangshijie1015的博客 60

Qt的常用类QList--序列数据管理

因此可以采用下标来进行索引进行快速的访问。而QVector是Qt对所有数组的封装,它元素的存储位置彼此相邻,也就是说它是以数组的形式进行存储的,它的插入删除操作常常伴随着内存的移动,所以效率上并没有QList高。QlinkList我们可以把它当成一个链表,它以非连续的内存块进行保存数据,所以它不能使用下标进行访问,它更适合于数据的插入操作。通过list.at()函数和下标,它的区别就是通过下标的时候,QList会对它的数据进行一次拷贝,也就是内存的一次复制,所以我们通过下标这种方式效率不高。

qq_42831443的博客 117

75 条文章索引被一条 add 清成 1 条,退出码还是 0:tri-article 的 index.py 我读了 205 行

以一次真实清库事故切入,逐段复现 tri-article 索引脚本的三处静默失败并给出可运行加固代码(严格加载抛错、原子 os.replace、长度差预筛的软去重)。附带 dedup 省略 --slug 时判定退化为「slug 长度 ≤2」、search 只搜 title、真实 75 条索引中 6 条在 domain 维度不可达、save_index 零调用等实测结论,并用 65/75 的哈希自证说明历史失配来自改标题未回

三声三视的博客 159

33 链表排序

给你链表的头结点head,请将其按排列并返回。[1,2,3,4]head = [][]你可以在O(n log n)时间复杂度和常数级空间复杂度下,对链表进行排序吗?

weixin_52079669的博客 212

systemd-mount命令详解

是 systemd 提供的一个命令行工具,用于动态创建和启动.mount或.automount单元。它的核心设计理念与传统的mount(8)命令不同:它不是立即执行挂载系统调用,而是将挂载操作排入 systemd 的服务管理器作业队列,从而能够自动处理父挂载点依赖、文件系统检查等前置条件,并支持按需自动挂载。

zhaominyong的专栏 242

Mybatis的多表操作问题

Q1 :一对一表关系之中哪个属性封装到<ResultMap>中?哪一个封装到<association>当中?Q2:一对多表关系之中哪个属性封装到<ResultMap>中?哪一个封装到<collection>当中?A:主要看谁包含谁,例如:一个用户 (User) 持有一张身份证 (IdCard)所以把OrderList封装进collection中。一个用户名下的所有订单。

m0_57532232的博客 225

conda虚拟环境打包离线迁移

自带的配套命令,用于将打包时记录的源主机绝对路径替换为目标机的实际路径。若命令能正常输出 Python 版本及已安装的包列表,说明环境迁移成功。导出的是当前环境的完整依赖清单,适合团队协作或换机迁移;,否则环境中的脚本、可执行文件可能因路径错误而无法正常运行。解压完成后,进入目标机的虚拟环境目录并激活环境,然后运行。虚拟环境里面建议都安装(解压时目标机的虚拟环境也有。,并解压虚拟环境打包文件。的场景,两者可互补使用。将打包文件复制到目标机。

qq_44842374的博客 162

Java 对象拷贝,怎样避免空值覆盖和数据误改?

先定 null 的含义,再定引用是否要独立。跳过 null 可以保留新对象默认值;要修改副本里的集合,就显式复制需要独立的那一层。不要把“创建新对象”当成“完成深拷贝”。如果这篇文章对您有用,欢迎关注。后续会继续拆解 Java 后端的实用代码,讲清法、原理和使用时要注意的细节。

MetaLite的博客 104

Python笔记:dir() 和 help() 完整用法(适配Python二级 + IDLE实操)

本文系统讲解Python中dir()和help()函数的用法,适用于二级考试与IDLE实操。dir()用于查看对象的属性和方法名(如dir(str)),返回名称列表;help()则提供详细文档,如help(str.split),指导如何使用。二者配合使用:先用dir()找方法名,再用help()查用法。注意:dir()不支持关键字,help()括号内勿加(),且在IDLE中需逐行输入。口诀:“dir看目录,help看说明;dir找名字,help读详情”。

lxttzlove的博客 187

线程02-并发串行-互斥锁-Semaphore-Event

线程02-并发串行-互斥锁-Semaphore-Event

weixin_44073050的博客 197

Android 控件 - ListAdapter

Android 控件 - ListAdapter

weixin_52173250的博客 501

Chat2Excel 文件服务模块剩余功能开发

本文实现文件管理核心功能:通过分页查询、下载、预览、信息获取、一键复原及删除等接口,支持多条件筛选与权限校验。基于MyBatis-Plus与OSS,结合JWT鉴权与数据库映射表,完成文件元数据管理、Excel内容解析与数据回滚。服务层采用面向接口编程,保障扩展性与稳定性,实现高效、安全的文件全生命周期管理。

tryxr的博客 243
上一篇: 堆和栈的区别(转载)
下一篇: Debug的使用
hpcason
博客等级 码龄21年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值