HITEA 版 (精华区)
发信人: hfl (凤凰·风中轻舞), 信区: HITEA
标 题: VxD世界——虚拟的Windows世界
发信站: 哈工大紫丁香 (2002年03月31日16:17:17 星期天), 站内信件
从事Windows系统编程的读者一定听说过VxD──这个在Windows(注:指Windows 3.1
/95/98,
非Windows NT)的世界里无所不能的超级武器。迄今为止,越来越多的人有了深入了
解Windows的愿望,
这也使得VxD技术愈来愈受到重视。VxD,意即Virtual Something Driver,这里的x就
是指Something。比如
说键盘驱动程序VKD、鼠标驱动程序VMD等。在许多人的脑海中,只有硬件开发者才会
用到VxD,其实不
然,对于软件开发来说,VxD也是无所不能的。在Windows3.1下这点还不明显,而在W
indows95中,随着
线程与局部化概念的引入,想控制系统的全部资源变得愈来愈困难。举个简单的例子
,由于32位的Windows
应用程序拥有独立的4GB线性地址空间,在Windows 3.1下常用的Windows应用程序之间
通信及共享变量的
方法不再完全适用了,想做些“出格”的事,比如说截获别的应用程序的消息,变得
愈发困难了。就在您一
愁莫展的时候,采用VxD技术或许会令您“豁然开朗”──既然操作系统能控制全部资
源,那么与操作系统
享有同样最高权限的VxD(或者干脆说作为操作系统一部分的VxD)也一定能够帮助您
完成“出格行为”。
为什么VxD有如此神通?最根本的原因,是由于VxD运行在系统的Ring 0级,而用SDK(
或现在大家熟知的
VC++、BC++、Borl and C++ Builder、VB、Delphi)开发出的应用程序运行在
Ring 3级。在80x86
保护模式下,运行在Ring 0级的VxD拥有系统最高权限(操作系统也运行在Ring 0级)
。
要想真正掌握VxD技术,您必须:
对80x86的保护模式有清楚的认识;
深入理解Windows的运行机制;
熟悉VxD本身的运行机制。
对于保护模式,目前国内市面上有一些参考书籍,希望您能硬着头皮看几遍。虽说 不
能使人茅塞顿开,却也
对保护模式能有个比较清楚的认识。
让我们先来认识一下Windows本身吧。
虚拟的Windows世界
运行在Windows95下的几种应用程序:DOS应用程序、Win16应用程序、Win32应用程序
。其中DOS 应用程
序大多运行在字符模式,而Win16/Win32 应用程序却是运行在图形模式下的。为了使
这几种运作方式大相
径庭的应用程序能“和平共处”,Windows采用了虚拟机(Virtual machine)的方式
。每个DOS应用程序
运行在一个独立的DOS VM中,使得这个愣头青似的DOS应用程序感到自己控制着所有的
资源,它可以肆意
地在它认为的全屏上涂涂改改,在它以为自己独占的硬盘上读出写入(微软在设计DO
S时怎么也想不到PC机
硬件的发展如此迅速)。而所有的Windows应用程序,不管是16位的,还是32位的,都
运行在同一个System
VM中。这是由于Windows 应用程序守规矩得多,熟悉Windows编程的读者一定对句柄
(Handle)这个概念
有非常深刻的印象。Windows应用程序的一举一动都是通过各种各样的句柄(HWND、H
DC、HANDLE、
HMOUDLE等)来实现的,正是通过句柄这个中介,使得系统有机会在同一个System VM
中协调多个Windows
应用程序。不信吗?好,让我们做个实验(我假定您已经安装了Softice for Win95
),启动Windows95,启动
结束之后,不要运行任何DOS应用程序,按下Control+D激活Softice(在有的Softic
e的缺省安装中,激活
Softice的热键是Alt+D),然后敲入指令:
:vm
VM Handle Status High Addr VM ID Client Regs
C39200E8 00001862 C3800000 00000001 C3449F70
从Softice的输出可以看到这时只有一个VM,它的ID是1。
按Control+D返回Windows桌面,这时,再运行几个Windows应用程序,不管是16位的
,还是32位的。重复
刚才的操作,按下Control+D激活Softice,敲入指令VM。我们看到Softice输出的结
果是一样的。也就是说尽
管有多个Windows应用程序在运行,可是系统中只存在一个VM,这个VM就是System VM
。
按Control+D返回Windows桌面,这时,从“开始选单”中运行“MS-DOS方式”,按
下Control+D激活
Softice,然后敲入指令:
:vm
VM Handle Status High Addr VM ID Client Regs
C8D200E8 00000802 C8C00000 00000002 C0F5FF70
C39200E8 00005A62 C3800000 00000001 C0F06F70
从Softice的输出可以看到这时系统中存在两个VM,其中一个就是我们刚才看到的
System VM(VM ID=1),另外,又多了一个ID=2的VM,这个VM就是DOS VM,
也就是说刚才的那个“MS-DOS方式”就是运行在这个DOS VM中的。
按Control+D返回Windows桌面,从“开始选单”中再运行几个“MS-DOS方式”
,按下Control+D激活Softice,敲入VM指令,你会发现VM增多了,其数量等于所
有的“MS-DOS方式”的数目加1。
现在您信了吧? 所有的DOS应用程序都是运行在各自的DOS VM中,而所有的
Windows 应用程序都运行在同一个System VM中。这是非常重要的概念。
--
. . . . o o o o o
_____ o _______
____==== ]OO|_n_n__][. |Go to|
[________]_|__|________)< | HITEA|
oo oo 'oo OOOO-| oo\\_ ~~~|~~~
+--+--+--+--+--+--+--+--+-$1-+--+--+--+--+
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.253]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.449毫秒