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 添加硬件向导来安装驱动程序了。