浅谈VxD驱动开发

本文深入探讨了VxD驱动在Windows 3.x和9x系统中的作用,它能直接访问硬件,为应用程序提供接口。VxD通过虚拟机管理器(VMM)在多应用程序环境中创建独立的虚拟机,确保程序间硬件资源的隔离。文章还介绍了使用VtoolsD开发VxD驱动的基本流程,包括设置设备参数、API、控制消息和服务,以及如何在Visual C++中生成和设置VxD驱动程序。最后,简述了VxD驱动的安装过程,强调了inf文件在PnP设备安装中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、VxD和VM

 

        VxD 是用于 Windows/386 (包括 Windows 3.x Windows 9x )上的驱动模型。 VxD 的全称是指 Virtual xxx Device ,在 Windows 9.x 下其扩展名为 .vxd ,这里的 xxx 是指代某种类型的硬件设备。 VxD 可以直接访问硬件设备,为应用程序提供访问硬件设备的接口(包括访问内存空间,读写 IO 端口,中断处理等)。

    

    

        Windows 9.x 中运行这多种应用程序(超级程序, DOS 应用程序, WIN16 应用程序, WIN32 应用程序),如下表所示,在 Windows 9.x 中由 VMM Virtual Machine Management )负责管理的 VM Virtual Machine ,虚拟机)系统为每一个应用程序创建了一个独立执行的环境,仿真了应用程序需要访问的硬件资源,使应用程序总认为自己使系统中唯一运行的程序。这样子就可以为不同的应用程序创建不同的虚拟机环境,实现不同程序在一个平台上的运行。 WIN16 WIN32 运行在同一个虚拟机下面,每一个 DOS 应用程序运行在独立的 VM 内。 VM 的初衷是为了运行 DOS 应用程序, DOS 操作系统是单任务的,所以 DOS 应用程序相当“霸道”,总是认为自己是惟一运行着的应用程序。

 

程序类型

工作模式

特权级

位数

内存模式

虚拟机

寻址空间

段限

管理程序

保护

Ring 0

32

平坦

VM 之外

4GB

4GB

WIN32

保护

Ring3

32

平坦

系统 VM

4GB

4GB

WIN16

保护

Ring3

16

分段

系统 VM

16MB

64KB

DOS

虚拟 86

Ring3

16

分段

独立 VM

1MB

64KB

   

 

       VM 需要虚拟的硬件资源主要有内存地址空间、 IO 地址空间、中断处理,和相关寄存器,这些虚拟设备就由刚才 VxD 提供,然后 VxD 再对硬件操作,从而实现应用程序对硬件的操作。 Windows 使用了不同的方法来虚拟这些部分。虚拟机访问 I/O 端口主要由 IOPL IOPM 来控制,内存操作主要由页面异常机制来实现,中断 / 异常通过改变处理器运行等级实现,从一个 VM 切换到另一个 VM ,虚拟寄存器的值先保留,然后再装入新的 VM 的虚拟寄存器值。

 

        VxD 对应用程序不仅可以虚拟某一个设备,还可以不虚拟任何设备,只充当设备驱动程序,或者并不和任何设备打交道,只为其它的 VxD 或应用程序提供任务接口。 VxD 可以访问任何硬件,可以自由地检查操作系统的任何数据结构,可以访问内存的任何地址,还可以捕获应用程序的软件中断以及对 I/O 和内存的访问,甚至可以拦截硬件中断。

 

    每一个 VxD 都有一个 DDB Data Descriptor Block ,设备描述块)作为 VxD 的唯一标识。 VMM VxD 的调用就是通过 DDB 中的 VxD 入口函数实现。从系统层面上来讲, VxD 的加载有两种方式:动态和静态。动态加载是指某一个应用程序有需要时才加载;静态是指在系统初始化的时候加载,卸载时则要等到系统结束运行。

    

2、使用 VtoolsD 开发 VxD 驱动

 

 

此部分仅仅是讨论开发的大致流程,里面的不涉及具体代码的实现和编程语言细节。

 

(1)、 需要安装的工具有 VC++ WinXPddk DriverStudio

 

(2) 、开始,程序, Compuware VtoolsD QuickVxD ,进入 VxD 框架生成向导设置。如下图所示:

 

Device Parameters 中设置一个设备名。 API 中设置提供的接口。 Control Messages 中设置控制消息,根据设备驱动的类型选择对应的控制消息。 VxD Service 是供给其它 VxD 的服务函数,一般不作设置。在 Classes 中设置 VxD 的类型,有设备类,虚拟机类和线程类。最后在 Output Files 中设置输出文件的目录,然后在指定目录中产生 .cpp .h .mak 三个文件。

 

(3) 、进入 Visual C++ 集成开发环境。 Files Open workspace ,打开刚才创建的 .mak 文件。同时选择保存为 .dsw 时,选择保存即可。

 

(4) 、把另外两个文件 .cpp .h 添加到工程上。同时 Project Setting 进入工程设置菜单,把输出文件名改为 .vxd 即可。

 

(5) 、根据设备驱动的具体要求,添加内容到 .cpp 文件当中。最后 F7 生成 VxD 驱动程序。

 

3、VxD驱动的安装

    对于即插即用( PnP )设备, VxD 设备驱动程序的安装需要设备信息文件( inf 文件)的支持。 inf 文件为 Windows 的设备安装模块提供设备的描述信息以及一个“安装脚本”。脚本内容包括安装盘上的驱动程序的名称、安装程序需要拷贝的目标路径、需要创建或者修改的注册表项。基本的安装脚本包括以下内容

(1)、确认设备

(2)、复制驱动程序到系统

(3)、 请求系统分配资源

(4)、在注册表中添加 DevLoader 项目

关于 inf 文件更详细的介绍可以 参考这里

 

    编写好 inf 文件后,与刚才的 vxd 文件放在同一目录,然后就可以使用 Windows 添加硬件向导来安装驱动程序了。

Windows95是一个运行在最高级特权,第0层级别的多线程操作系统。所有的应用程序都运行在最低级特权,第3层级别上。这样就限制了 应用程序对系统的操作。它们不能使用cpu特权指令,不能直接访问I/O端口,等等。你对gdi32,kernal32和user32这三个大的系统组件一 定很熟悉。你肯定会认为这样重要的代码段一定是在第0层级别下运行的。但是实际上,它们和其他的应用程序一样,是在第三层级别下运行的。这就是说它们并不比Windows计算器,或者扫雷游戏有更多的权限。系统的控制实权掌握在虚拟级管理器(VMM) 和虚拟设备驱动程序(VxD)手中。 这一切都是由dos引起的。在Window 3.x的时代,在市场上有很多成功的dos软件。Windows 3.x必须同时运行普通的Windows程序和dos程序,否则,它就会失去市场。 这个局面是很难处理的,因为dos程序和Windows程序有本质的不同。dos程序认为它们拥有系统的一切:键盘,cpu,内存,硬盘等等。dos程序不知道怎样和其他程序合作,而Windows程序(从那时候起)是可靠的多任务合作系统。也就是每个Windows程序都必须通过GetMessage或PeekMessage来和其他程序进行交流。 解决办法就是,在一个8086虚拟机上运行所有的dos程序,而在另一个叫做系统虚拟机虚拟机上运行其他所有的Windows程序。Windows负责把cpu运算时间轮流的分给每个虚拟机。这样,在Windows 3.x里。Windows程序之间用的是合作多任务,而虚拟机之间用的是优先级多任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值