使用Windows 95虚拟设备驱动程序
2010-07-20 20:44:57 来源:WEB开发网VxD段
VxD可以包含下面5个段的一些组合:
1、VxD_CODE段:保护模式代码段(必须)。该段包含VxD系统控制过程、回调过程、服务和API过程。该段用宏VxD_CODE_SEG和VxD_CODE_ENDS定义开始和结束,也可命名为_LTEXT。
2、VxD_DATA段:保护模式数据段(必须)。该段包括设备描述表、 服务表和部分VxD全局数据。该段用宏VxD_DATA_SEG和VxD_DATA_ENDS定义开始和结束,也可命名为_LDATA。
3、VxD_ICODE段:保护模式初始化代码段(可选)。该段一般包括只在VxD初始化过程中使用的过程和服务,VMM在Init_Complete 消息发生后丢弃此段。该段用宏VxD_ICODE_SEG和VxD_ICODE_ENDS定义开始和结束,也可命名为_ITEXT。
4、VxD_IDATA段:保护模式初始化数据段(可选)。该段一般包括初始化过程和服务使用的数据,VMM在Init_Complete消息发生后丢弃此段。 该段用宏VxD_IDATA_SEG和VxD_IDATA_ENDS定义开始和结束,也可命名为_IDATA。
5、VxD_REAL_INIT段:实模式初始化段(可选)。该段包含实模式初始化过程和数据,VMM在加载VxD其它部分之前调用此过程,过程返回后丢弃此段,该段用宏VxD_REAL_INIT_SEG和VxD_REAL_INIT_ENDS定义开始和结束,也可命名为_RTEXT。除实模式初始化段以外,所有代码和数据段均为32位平坦内存模式的保护模式段,这就是说定义在保护模式段中的过程和数据均为32位的偏移量。当VMM装载VxD时,按照VxD在内存中的实际位置修正所有的偏移量。因此,在保护模式段中使用普通OFFSET指令处应该使用OFFSET32宏,OFFSET32宏定义的偏移量为连接器确定了正确的偏移量修正信息。
VxD不能改变CS、DS、ES和SS段寄存器,VxD能够使用FS和GS段寄存器。
保护模式指令
VxD的源程序文件必须以.386p命令开始,以通知汇编器允许保护模式指令。虽然VxD工作在0特权级,但也不应该用保护模式指令去修改CPU 的运行,例如修改全局描述符(选择子——译者注)或中断描述符以及修改任务状态段或寄存器,这样做可能会对Windows运行有不利影响。唯一的例外情况是当该VxD为虚拟数学协处理器设备驱程序(VMCPD),允许修改CR0寄存器中的80387位。
包含(Include)文件
包含文件定义了VxD 需要的宏、结构、符号和服务表,用于声明段和过程以及使用VMM和其它VxD服务。下面列出每个包含文件包含的公共服务定义、宏和符号定义:
1、VMM.INC:包含所有的VMM服务以及所需的宏和符号,例如Declare_Virtual_Device和VMMCall。
2、DEBUG.INC:包含在调试终端上输出信息和执行各种数据检查的宏。这些宏的功能由定义了调试符号的VxD在汇编时该文件生成的代码实现。
3、VPICD.INC:包含为虚拟可编程中断控制器设备(VPICD )定义的所有服务、宏和符号。VPICD处理所有的中断,所以许多VxD需要VPICD服务。
4、SHELL.INC:包含虚拟外壳设备提供的公共服务的定义。虚拟外壳设备提供对例如MessageBox这样的Windows函数的调用,可以让VxD显示对话框。
VxD声明
每一个VxD 都要声明一个名称、一个版本号、一个初始化顺序和一个设备控制过程,许多虚拟设备驱动程序还声明一个设备标识和一些API过程。 VxD一般使用Declare_Virtual_Device宏来实现这些声明,例如:
Declare_Virtual_Device VSAMPLED, 4, 0, VSAMPLED_Control, \
VSAMPLED_Device_ID, VSAMPLED_Init_Order, \
VSAMPLED_V86_API_Handler, \
VSAMPLED_PM_API_Handler
本例声明了一个VxD实例——VSAMPLED V4.0 ,在对应的源文件必须定义名字为VSAMPLED_Control的设备控制过程。符号VSAMPLED_Device_ID和VSAMPLED_Init_Order说明非标准VxD的标识和初始化顺序,该VxD支持V86模式和保护模式API过程。VMM用宏定义的信息来初始化VxD并发送系统控制消息给VxD,并且允许MS-DOS 应用程序、设备驱动程序和TSR调用VxD。为了使VMM 存取这些信息,相应的宏建立一个设备描述块(DDB)并将其保存在保护模式数据段中(DDB的格式与VxD_Desc_Block结构相同),宏为DDB建立了一个必须在VxD连接时被显式引出的标号。在上例中,DDB 的名称是VSAMPLED_DDB。
更多精彩
赞助商链接