Welcome

首页 / 软件开发 / C++ / 使用Windows虚拟设备驱动程序(VxD)之2

使用Windows虚拟设备驱动程序(VxD)之22009-12-11八、VxD初始化

VMM初始化一个VxD时做下列工作:

1、装载实模式初始化段并调用实模式初始化过程。该过程可以完成阻止装载VxD,阻止启动Windows,指定设备实例数据和在内存中选择页面给

设备专用的工作。

2、装载VxD其它段到32位平坦内存模式的保护模式内存,并丢弃实模式初始化段。

3、发送Sys_Critical_Init消息到设备控制过程。禁止硬件中断,所以VxD应该尽可能地用较少的时间完成自身初始化。

4、发送Device_Init消息到设备控制过程。允许硬件中断,所以必须准备让VxD管理来自设备的中断。

5、发送Init_Complete消息到设备控制过程。

6、丢弃初始化代码和数据段,释放其它被使用的内存。VxD不能在处理完Init_Complete消息以后试图存取这些段中的过程和数据。

在初始化过程中的任何时刻,VxD都可以设置进位标志返回到VMM以阻止装载VxD。部分VMM服务,例如初始化信息服务只在初始化过程中有效。

九、实模式初始化

任何静态设备驱动程序都可以提供实模式初始化过程以在Windows切换到保护模式之前执行初始化任务。VMM装载VxD时调用该过程,该过程检查

有关的Windows环境,包括注册表和初始化文件中的有关设置以判断是否应该装载该VxD。该过程也可以给Windows返回信息以为每个虚拟机的实

例指定物理内存页保留给设备专用和数据项地址。要获得关于实模式初始化的更多信息,请参阅相关资料。

十、VxD服务

VxD可以提供服务功能(函数或过程——译者注)给VMM和其它VxD使用。这些服务让其它VxD可以直接访问该VxD的特征,允许测试和修改该VxD的功能和能力。

VxD不能和Windows DLL一样引出函数,代之的是VMM通过INT 20H提供到VxD服务的动态链接,该中断处理过程使用服务编号判断支持服务的

VxD,该中断处理过程也使用服务编号查询在VxD服务表中的服务地址。

下面的内容讲述怎样在VxD中定义服务,声明VxD服务表以及从一个VxD向另一个VxD中引入服务。

1、定义服务

VxD使用BeginProc和EndProc宏以及Service和Async_Service选项定义服务。宏标记服务过程代码的开始和结束,选项标识该过程是一个服务。

下面的实例给出了VSAMPLED_Get_Version服务的定义:

BeginProc VSAMPLED_Get_Version, Service

mov ax, 030Ah

clc

ret

EndProc VSAMPLED_Get_Version

Async_Service选项标识该服务可以被异步调用,也就是说在处理中断的过程中调用。异步服务必须是可重入的,而且不能调用VMM和不是异步服

务的VxD服务。

VMM和标准VxD对服务使用两种调用约定:基于寄存器的调用约定和基于32位C语言的调用约定。这两种调用约定有不同的服务名格式,参数传递

和返回值方法以及寄存器保护。

对于基于寄存器的服务,服务名不应该以下划线(_)开头,所有的参数通过寄存器传递,结果也通过寄存器返回,服务保护所有不显式用于返回

值的寄存器。

对于基于C语言的服务,服务名必须以下划线(_)开头,所有的参数通过堆栈中的32位值传递,结果(如果存在)通过EAX寄存器(32位值)

或者EAX和EDX寄存器(64位值)返回,服务保护EBX、ES、FS和GS寄存器以及ESI和EDI寄存器,只有标志寄存器和EAX、EBX、EDX寄存器被修改。