Programming 版 (精华区)

发信人: Sun (大灯泡), 信区: Programming
标  题: VxD世界——虚拟的Windows世界 
发信站: 哈工大紫丁香 (Tue Aug 31 12:35:44 1999), 转信

   
  孙喜明 

从事Windows系统编程的读者一定听说过VxD──这个在Windows(注:指
Windows 3.1/95/98,非Windows NT)的世界里无所不能的超级武器。迄今为止,
越来越多的人有了深入了解Windows的愿望,这也使得VxD技术愈来愈受到重视。
VxD,意即Virtual Something Driver,这里的x就是指Something。比如说键盘驱动
程序VKD、鼠标驱动程序VMD等。在许多人的脑海中,只有硬件开发者才会用到
VxD,其实不然,对于软件开发来说,VxD也是无所不能的。在Windows3.1下这点
还不明显,而在Windows95中,随着线程与局部化概念的引入,想控制系统的全部
资源变得愈来愈困难。举个简单的例子,由于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应用程序感到自己控制着所有的资源
,它可以肆意地在它认为的全屏上涂涂改改,在它以为自己独占的硬盘上读出写入
(微软在设计DOS时怎么也想不到PC机硬件的发展如此迅速)。而所有的Windows 
应用程序,不管是16位的,还是32位的,都运行在同一个System VM中。这是由于
Windows 应用程序守规矩得多,熟悉Windows编程的读者一定对句柄(Handle)这
个概念有非常深刻的印象。Windows应用程序的一举一动都是通过各种各样的句柄
(HWND、HDC、HANDLE、HMOUDLE等)来实现的,正是通过句柄这个中介,
使得系统有机会在同一个System VM中协调多个Windows 应用程序。不信吗?好,
让我们做个实验(我假定您已经安装了Softice for Win95),启动Windows95,启
动结束之后,不要运行任何DOS应用程序,按下Control+D激活Softice(在有的
Softice的缺省安装中,激活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中。这是非常重要的概念。


 



 
 
     
     
--
〖小糊涂虫2000灌水机〗

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: sun@hope.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:7.503毫秒