使用Windows 95虚拟设备驱动程序
2010-07-20 20:44:57 来源:WEB开发网VxD标识(ID)
一个VxD提供一个VxD标识,以区别于其它VxD。VMM 动态连接例程使用VxD标识为合适的VxD连接服务调用,如果VxD提供服务或者提供V86模式和保护模式API过程以及其它需要唯一标识的情况,VxD就必须有唯一标识。虽然标准VxD使用预定义VxD 标识(符号定义在VMM.INC文件中),支持新设备和新软件接口的VxD还是必须全部有新标识。为了防止与其他新VxD冲突,Microsoft通过请求和注册标识来保证没有其它厂商使用自己的VxD的标识,Microsoft保留0—01FFH之间的所有VxD 标识自己使用。不提供服务或者API过程,或者不需要唯一标识的VxD应该使用Undefined_Device_ID 符号来定义VxD标识。
初始化顺序
每一个VxD都有一个用于指定VMM应该何时初始化该VxD的初始化顺序值,VMM按照该值从小到大的顺序初始化虚拟机(VM ——译者注)。如果两个或者两个以上的VxD有相同的值,VMM会按照SYSTEM.INI 文件中出现的顺序来初始化,但指定顺序是没有保证的。对于需要调用其它VxD服务或者需要在其它VxD 之前拦截中断的VxD,初始化顺序是很重要的。如果一个VxD需要在标准VxD之前或者之后初始化,它的初始化顺序值应该通过在标准VxD预定义的初始化顺序符号(在VMM.INC文件中定义)上加上或者减去一个小数值来创建。如果一个VxD不需要初始化顺序值,应该使用Undefined_Init_Order 符号代替初始化顺序值。
设备控制过程
每一个VxD都有一个设备控制过程,VMM通过调用此过程给VxD发送VxD系统控制消息。系统控制消息指导VxD完成动作,例如自身初始化或者通知VxD虚拟机的变化(例如创建虚拟机)等。许多VxD通过使用Begin_Control_Dispatch、 Control_Dispatch和End_Control_Dispatch宏来定义设备控制过程,例如:
Begin_Control_Dispatch VSAMPLED
Control_Dispatch Sys_Critical_Init, VSAMPLED_Crit_Init
Control_Dispatch Device_Init, VSAMPLED_Device_Init
Control_Dispatch Sys_Critical_Exit, VSAMPLED_Crit_Exit
End_Control_Dispatch VSAMPLED
上例中,宏创建了一个名字为VSAMPLED_Control的设备控制过程,并生成了检查Sys_Critical_Init、Device_Init和Sys_Critical_Exit 消息的指令。当这些消息发送到该过程时,该过程通过控制相应的过程(例如VSAMPLED_Crit_Init)来处理消息,这些消息处理过程必须在VxD中定义。
系统控制消息
VMM发送系统控制消息给VxD,以通知VxD影响系统和虚拟机的变化。大多数VxD需要跟踪虚拟机的创建和状态,所以无论何时创建、初始化或者终止虚拟机,VMM都会发送消息给VxD。VMM也会在执行焦点移动到一个虚拟机或者从一个虚拟机移走时,以及虚拟外壳设备需要给用户显示一个消息框时发送消息给VxD。
下面是公共消息和VxD应该怎样处理这些消息的方法列表:
Begin_Message_Mode消息:当虚拟外壳设备需要给用户显示一个消息框但不能使用系统虚拟机和Windows函数时VxD收到此消息。虚拟键盘、鼠标和显示设备保存当前状态,允许任何消息模式服务并为消息模式处理初始化相应设备。
Create_VM消息:这是当一个新的虚拟机被创建时VxD收到的第一条消息。VxD应该初始化与虚拟机有关的数据,特别是控制块。
Debug_Query消息:VxD从WDEB386调试器收到此消息。VxD可以显示调试列表和从调试终端读取用户命令。
Destroy_VM消息:这是VxD收到的第三条虚拟机终止消息。Simulate_Int和
Exec_Int服务对获得此消息的虚拟机不再有效。
更多精彩
赞助商链接