没有合适的资源?快使用搜索试试~ 我知道了~
Windows 95下的虚拟设备驱动程序.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 174 浏览量
2022-07-06
18:03:41
上传
评论
收藏 42KB DOCX 举报
温馨提示
试读
36页
Windows 95下的虚拟设备驱动程序
资源推荐
资源详情
资源评论
Windows 95 下的虚拟设备驱动程序
虚拟设备驱动程序(VxDs)在很大程度上支持了 Windows 3.x 和 Windows 95。
通
常,我们从 两个级别的意义上来认识 VxDs:从低级意义上来说,它们直接存取系
统
的硬件;而从高级意义 上来看,它们在最高优先级别上运行。
在 Windows 95 中,VxDs 显得更加重要,Microsoft 正是靠 VxDs 扩展了操作系
统内
核的处理 能力。Win 95 中的 VxDs 可以处理涉及从文件系统到声卡以至网络系统
的
各种事务。
可能您还未认识到:尽管 VxDs 本身是 32 位的,但它却诞生于 16 位的非线程、
非
抢占性的操 作系统。而现在人们期待甚至要求 VxDs 能运作于具有线程化、可抢
占
性的操作系统,简单的 变形是不能解决此问题的。
虚拟机假想
一台虚拟机(VM)只不过是人们的一个假想。而特别的,这个假想认为一个给
定
的进程可 对一台计算机的所有硬件设备进行独占性的存取,这些设备包括了内
存
、I/O 口、中断和其它 进程想要占用的部件。VxDs 就是为了此假想产生的。
Windows 3.1 中有两种虚拟机(VMs):DOS 壳和 Windows VM 本身(后者称为"系
统
虚拟机"— ——所有的 Windows 应用程序运行于其中)。而虚拟机管理器(VMM),
尽
管它本身不是一 VM,但 却充当着激活 VMs 和 VxDs 的主要管理员。例如,VMM 要处
理在
运行 VMs 时的抢占时间片工作。
另外,任何用来虚拟管理 I/O 设备的 VxD 都必须在 VMM 中登记。因此,如果
一 VxD
要占用一些 特殊的 I/O 端口,就必须请求 VMM 挂起这个端口。这样,无论何时当
一
Windows 应用程序试图对 此口进行存取操作时,VMM 将把这个存取请求传给特定
的
VxD。
在 Win 95 中这样的情况基本相同,但做得更好。仍然是 DOS 壳作为一 VM,所
有的
Windows 进 程作为一 VM。但这些进程包含了一些比 Windows 3.x 中的 Win32s 程
序具
有更强能力的 Win32 应 用程序。
这就产生了一些 VxD 设计者必须清楚的新问题。例如,Win 95 中的 Win 32 应
用
程序可以是 多线程化的,一个 VxD 不再只知道是哪一个 VM 请求服务,有时一个
VxD 还
必须知道是哪一特定 V M 中的哪一个线程需要服务。
顺便提一下,也许一些读者和我最初一样认为每一个 Win 32 应用程序在 Win
95
中就是它 自己的 VM,而事实上是,尽管它们有自己的地址空间,每一个 Win32 应
用程
序却只是系统 VM 的一 个成员。
更重要的是,Win95 中的一个成功的 VxD 应该是既可与新的 32 位 Windows 应
用程
序协作,也 可与过去的 16 位 Win-dows 应用程序协作运行。这就使得 VxDs 有些
不同
起来。
过去的方法
尽管 VxDs 可以通过挂起 I/O 口和执行中断等其它高优先级事件来虚拟硬件
设备
,但这只是 它为应用程序做的一部分事务。VxDs 还可以提供可调用的 APIs,使得
一
个应用程序可以直接 申请 VxD 服务。
在 Windows 3.x 里,我们可以通过中断 2FH 来得到一个 VxD 的 API(限于篇幅,
这里
不再多言 )。这种机制在 Win 95 中可以通过 16 位应用程序来有效地使用。实际
上
,Win 95 有一点变化: 将 BX 寄存器设为零,并在 ES:DI 寄存器对中存放一指针而
不是
从 BX 寄存器中调用设备号。这个 指针指向 VxD 的名字,它是一个八位长的大写
字符
串。和以前相同的是,在程序执行 INT 2FH 指 令后,VxD 的 API 地址返回在 ES:DI
中。
糟糕的是,INT 2FH 技术并不适用于 Win32 应用程序。实际上,Win32 应用程
序不
能执行软 件中断。
对我们来说,这是否意味着 Win32 应用程序和 VxDs 处于不可跨越的裂缝中?
答案
是否定的 ,我们仍可用 VxD 代表 32 位应用程序来虚拟 I/O 端口,只是在 VxD 将
API 地址
提交给 Win 32 程序时 有些麻烦。但这也不要紧,VxD 既提供了 16 位 API 又提供
了 32
位 API,这使得在 Win 95 环境下 16 位 Windows 应用程序与 Win 32 应用程序一样
重要
。
新的 VxD
无论何时,当一个 VxD 必须处理的事件发生时,就有一条控制消息传送给 VxD。
这些消息来 自 VMM 或其它的 VxDs,VxD 处理它们就像 Windows 程序处理 Windows
事件
一样。通常,这些消息告 诉 VxD:"一应用程序正试图存取你管理的 I/O 口,有消息
来
……注意"。
Win 95 添加了一条新消息 W32-DEVICEIOCON-TROL,这条消息是在一个 Win
32 应
用程序调 用 DeviceIo-Control()函数时发给 VxD 的。这就是一 Win32 应用程序
可直
接调用 VxD 的机制。
对 Win32 应用程序来说,它必须首先调用 CreateFile()函数得到一特定 VxD
的句
柄。通常 这函数是用于创建打开磁盘文件的,但如果程序在调用它时,给文件名
前
加上前缀\\.\,系统 就会识别出此文件名是对应于一 VxD 名。(当然在 C/C++中,
字
符串中的反斜杠字符必须加更多 的反斜杠前缀,因此\\.\就成了\\\\.\\.)
函数 CreateFile()返回一句柄,这里是一个 VxD 的句柄。应用程序可用这个
句
柄调用函数 DeviceIoControl()来发消息给 VxD。(调用函数 DeviceIoControl()
实
际上调用了一个中间 V xD:VWIN32,它再调用代表应用程序的 VxD)
函数 DeviceIoControl()提供了通知 VxD 执行何功能的参数,同时提供用于
在应
用程序和 VxD 间传送数据的输入输出缓冲区指针。
动态 VxDs
使用函数 DeviceIoControl()与 VxD 通讯还有另外一个好处。在 Win 3.1 中
VxDs
是静态装 载的,也就是说,当 Win-dows 启动时要装载所有要用的 VxDs,它们将在
Windows 执行生命期间一 直处于活动状态。
Win 95(以及 Windows for workgroups 3.11)却允许动态装载卸下 VxDs。当
一
应用程序 用 CreateFile()函数存取一 VxD 时,系统会跟踪每个 VxD 打开了多少句
柄
。当应用程序终止时 ,它要调用函数 CloseHandle()释放这个 VxD 打开了多少句
柄
。当应用程序终止时,它要调用函 数 CloseHandle()释放这个 VxD 的句柄,这就减
少
了系统打开的句柄数。(有一点很重要,当一 进程消亡时,与其相联的句柄会被自
动调用)
只要一 VxD 的句柄数减到零,系统会给这个 VxD 发送一条控制消息
SYS-DYNAMIC-DEVICE-E XIT,告诉它:"你即将被卸下,……请消除一切"。VxD 在处
理完这条消息后,系统就卸下它。
一点补充说明
当然,VxD 设计者还没有做到尽善尽美,他们还必须设置另外的事件处理程
序来
处理 W32- DEVICEIOCONTROL 消息。尽管为了利用 VxD 的 API 而单独创建一条途
径似
乎有些令人难受,但随 着 Win 32 程序数量的增多,我们会发现这条路并不难走。
实
际上,我们并不需要做太多的事。 VxD 在俘获由 VMM 发来的消息时已有一个控制
-分
发事件处理程序例程。只要我们写出处理 W3 2-DEVICEIOCONTROL 消息的事件代
码,
剩下的只是在将事件代码与事件处理程序例程相匹配的 跳表中增加一个入口而
已
。
一句话,有了 DeviceIoControl()调用机制,VxD 将在 Win 32 应用程序中起到
重要作用。
剩余35页未读,继续阅读
资源评论
老帽爬新坡
- 粉丝: 81
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功