WIN95下虚拟设备驱动程序设计开发
发布时间:2007/8/28 0:00:00 访问次数:842
摘 要: 介绍虚拟设备驱动程序开发的基本知识以及VxDs与WIN32应用程序通讯的几种常用方法,并给出了用VtoolsD开发VxDs的具体实例。
关键词: 虚拟设备 虚拟设备驱动程序(VxDs)DDK VTOOLSD
Windows自面世以来,即以其强大而友好的图形界面占据了操作系统(尤其是微机操作系统)的霸主地位。但是由于Windows采取的保护措施屏蔽了系统的底层操作,对用户而言,已不能象在DOS下一样直接操纵使用系统的硬件资源如内存、I/O端口、中断及DMA等。这在很大程度上保证了操作系统的安全稳定性能,但却给广大硬件及底层软件开发人员带来了困难。当需要直接操纵控制具体的硬件设备时,往往需要编写设备驱动程序。
1 VMM、VNMs和VxD
Win95操作系统支持多线程、多任务应用,正是依靠虚拟机管理器VMM(Virtual Machine Manager)和虚拟设备驱动程序VxDs(Virtual Device Drivers)一起来实现设备虚拟化,从而使多个应用能够同时执行。设备的虚拟化是建立在虚拟机假想的基础上的,假想认为每一个VM都可以对所有的硬件设备(如内存、I/O端口、中断等)进行独占的控制,就如DOS下的应用程序一样。VxDs即为实现此假想而产生。
Windows中有两种虚拟机VMs:DOS VM和System VM。每运行一个DOS程序将产生一个DOS VM,即不同的DOS程序运行在各自的DOS VM中,而所有的Windows应用程序(包括WIN16和WIN32应用)都运行于系统虚拟机中。每个VM有自己的地址空间、I/O端口、中断向量表,VM为应用提供内存保护、虚拟内存和权限检查等,只是在WIN16中应用程序运行在同一地址空间中,而每个WIN312应用程序都拥有自己的地址空间。所有的VM都接受VMM的统一调度管理,虽然VMM本身不是一VM,但却充当着激活VMs和VxDs的主要管理员(例如,VMM要处理在运行VMs时的抢占时间片工作)。VMM是操作系统的核心,VMM提供单线程、抢先多任务处理。它是一个32位保护模式操作系统,它的主要任务是产生、运行、控制和终止虚拟机VMs,它让多个VMs共享CPU的时间以使多应用能同时运行,其实VMM本身即是一些VxDs的集合,VMM不可重入。
VxDs在很大程序上支持Windows 3.X和Windows 9X,可以将它看作是运行在系统特权级上的特殊的DLL,VxDs可直接操纵系统的硬件资源,甚至可以虚拟根本不存在的硬件,Windows利用虚拟设备来管理软件及硬件设备以确保应用程序不互相干扰。大多数虚拟设备用来管理硬件设备,有些虚拟设备也提供软件服务,而不对应于具体的硬件设备。如1999年初猖狂蔓延的CIH病毒,之所以能破坏硬件资源(通过攻击主板的Flash Memory,达到破坏硬件的目的),正是因为它利用了VxD技术,运行在系统Ring 0级。
在Win3.X中VxDs是静态装载的,也就是说,当Windows启动时要装载所有要用的VxDs,它们将在Windows执行生命期间一直处于活动状态,Win9X(以及Windows for workgroups 3.11)在支持静态VxDs的同时允许动态装载卸下VxDs。当一应用程序用CloseHandle()函数存取一VxD时,系统会跟踪每个VxD打开了多少句柄。当应用程序终止时,它要调用函数CloseHandle()释放这个VxD所打开的句柄。当应用程序终止时,它要调用函数CloseHandle()释放这个VxD的句柄,这样即在需要时加载相应的VxD、用完后卸下,提高了系统资源的利用率。当然在进程消亡时,与其相联的句柄会被自动释放。
VxD处理硬件设备时一个经常用到的硬件资源就是硬件中断,VxD处理硬件中断时,虚拟设备很少直接截取中断,而是依赖虚拟可编程中断控制器(VPICD),VPICD实现了物理可编程中断控制器(PPIC)的虚拟化,VPICD发送硬件中断信号给其他虚拟设备,并向虚拟设备提供请求中断、模仿硬件中断等服务。
2 VxD设计开发
2.1 开发工具
开发VxD需要专门的开发工具,目前应用广泛的工具主要有两大类,一类是Microsoft提供的对应于不同版本的Windows的DDK(Device Driver Kit),其中包含了开发VxD所需的各种类库及汇编工具等。由于用DDK开发VxD大多使用汇编语言,所以开发起来相对比较困难。另一类是Vireo Software提供的Vtoolsd,VtoolsD开发包提供了对VxD编程的全线C++类库支持,利用VtoolsD中的Quick VxD工具可以快速生成VxD的代码框架,开发者可以在此基础上根据各自的需要添加自己的代码,使用VtoolsD可以不需要DDK。比较而言,使用VtoolsD要比使用DDK简单、快捷。另外,由于VxD运行在Ring()级,开发VxD
摘 要: 介绍虚拟设备驱动程序开发的基本知识以及VxDs与WIN32应用程序通讯的几种常用方法,并给出了用VtoolsD开发VxDs的具体实例。
关键词: 虚拟设备 虚拟设备驱动程序(VxDs)DDK VTOOLSD
Windows自面世以来,即以其强大而友好的图形界面占据了操作系统(尤其是微机操作系统)的霸主地位。但是由于Windows采取的保护措施屏蔽了系统的底层操作,对用户而言,已不能象在DOS下一样直接操纵使用系统的硬件资源如内存、I/O端口、中断及DMA等。这在很大程度上保证了操作系统的安全稳定性能,但却给广大硬件及底层软件开发人员带来了困难。当需要直接操纵控制具体的硬件设备时,往往需要编写设备驱动程序。
1 VMM、VNMs和VxD
Win95操作系统支持多线程、多任务应用,正是依靠虚拟机管理器VMM(Virtual Machine Manager)和虚拟设备驱动程序VxDs(Virtual Device Drivers)一起来实现设备虚拟化,从而使多个应用能够同时执行。设备的虚拟化是建立在虚拟机假想的基础上的,假想认为每一个VM都可以对所有的硬件设备(如内存、I/O端口、中断等)进行独占的控制,就如DOS下的应用程序一样。VxDs即为实现此假想而产生。
Windows中有两种虚拟机VMs:DOS VM和System VM。每运行一个DOS程序将产生一个DOS VM,即不同的DOS程序运行在各自的DOS VM中,而所有的Windows应用程序(包括WIN16和WIN32应用)都运行于系统虚拟机中。每个VM有自己的地址空间、I/O端口、中断向量表,VM为应用提供内存保护、虚拟内存和权限检查等,只是在WIN16中应用程序运行在同一地址空间中,而每个WIN312应用程序都拥有自己的地址空间。所有的VM都接受VMM的统一调度管理,虽然VMM本身不是一VM,但却充当着激活VMs和VxDs的主要管理员(例如,VMM要处理在运行VMs时的抢占时间片工作)。VMM是操作系统的核心,VMM提供单线程、抢先多任务处理。它是一个32位保护模式操作系统,它的主要任务是产生、运行、控制和终止虚拟机VMs,它让多个VMs共享CPU的时间以使多应用能同时运行,其实VMM本身即是一些VxDs的集合,VMM不可重入。
VxDs在很大程序上支持Windows 3.X和Windows 9X,可以将它看作是运行在系统特权级上的特殊的DLL,VxDs可直接操纵系统的硬件资源,甚至可以虚拟根本不存在的硬件,Windows利用虚拟设备来管理软件及硬件设备以确保应用程序不互相干扰。大多数虚拟设备用来管理硬件设备,有些虚拟设备也提供软件服务,而不对应于具体的硬件设备。如1999年初猖狂蔓延的CIH病毒,之所以能破坏硬件资源(通过攻击主板的Flash Memory,达到破坏硬件的目的),正是因为它利用了VxD技术,运行在系统Ring 0级。
在Win3.X中VxDs是静态装载的,也就是说,当Windows启动时要装载所有要用的VxDs,它们将在Windows执行生命期间一直处于活动状态,Win9X(以及Windows for workgroups 3.11)在支持静态VxDs的同时允许动态装载卸下VxDs。当一应用程序用CloseHandle()函数存取一VxD时,系统会跟踪每个VxD打开了多少句柄。当应用程序终止时,它要调用函数CloseHandle()释放这个VxD所打开的句柄。当应用程序终止时,它要调用函数CloseHandle()释放这个VxD的句柄,这样即在需要时加载相应的VxD、用完后卸下,提高了系统资源的利用率。当然在进程消亡时,与其相联的句柄会被自动释放。
VxD处理硬件设备时一个经常用到的硬件资源就是硬件中断,VxD处理硬件中断时,虚拟设备很少直接截取中断,而是依赖虚拟可编程中断控制器(VPICD),VPICD实现了物理可编程中断控制器(PPIC)的虚拟化,VPICD发送硬件中断信号给其他虚拟设备,并向虚拟设备提供请求中断、模仿硬件中断等服务。
2 VxD设计开发
2.1 开发工具
开发VxD需要专门的开发工具,目前应用广泛的工具主要有两大类,一类是Microsoft提供的对应于不同版本的Windows的DDK(Device Driver Kit),其中包含了开发VxD所需的各种类库及汇编工具等。由于用DDK开发VxD大多使用汇编语言,所以开发起来相对比较困难。另一类是Vireo Software提供的Vtoolsd,VtoolsD开发包提供了对VxD编程的全线C++类库支持,利用VtoolsD中的Quick VxD工具可以快速生成VxD的代码框架,开发者可以在此基础上根据各自的需要添加自己的代码,使用VtoolsD可以不需要DDK。比较而言,使用VtoolsD要比使用DDK简单、快捷。另外,由于VxD运行在Ring()级,开发VxD