使用Windows虚拟设备驱动程序(VxD)之2

2016-02-19 15:04 2 1 收藏

下面请跟着图老师小编一起来了解下使用Windows虚拟设备驱动程序(VxD)之2,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

【 tulaoshi.com - 编程语言 】

  八、VxD初始化 

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

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

  设备专用的工作。 

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

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

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  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寄存器被修改。 

  2、声明服务 

  VxD使用Begin_Service_Table和End_Service_Table宏声明服务。宏标记包含服务名和可选的包含服务的段名的列表的开始和结束。声明必须建 

  立在进行VxD定义的文件中(也就是说在包含Declare_Virtual_Device宏的文件中),而且必须先进行设备指定符号的定义。下面的实例给出了 

  一个实例VxDVSAMPLED的服务表声明: 

  Create_VSAMPLED_Service_Table equ 1 

  Begin_Service_Table VSAMPLED 

  VSAMPELD_Service VSAMPLED_Get_Version, Local 

  VSAMPLED_Service VSAMPLED_Service_1 

  VSAMPLED_Service VSAMPLED_Service_2, VxD_ICODE 

  End_Service_Table VSAMPLED 

  上例中,Create_VSAMPLED_Service_Table符号在紧接服务表声明之前定义,指定Begin_Service_Table宏为VSAMPLED创建服务表。声明开始以 

  后,VSAMPLED_Service宏定义实际服务,这个宏是Begin_Service_Table宏创建的,只在服务表声明中有效。每个服务名必须与服务定义名,也就 

  是BeginProc宏给出的名字完全符合。 

  当声明服务时,如果一个服务定义在包含服务表声明的文件中,必须在服务名后使用LOCAL选项,也就是说如果不使用LOCAL选项,服务表自动声 

  明一个服务是外部服务。上例中,VSAMPLED_Get_Version服务定义在包含服务表声明的文件中。 

  与之相似,如果一个服务不是定义在VxD_CODE段中,必须在服务名后注明段名。上例中,VSAMPLED_Service_2服务定义在VxD_ICODE段中。 

  服务声明的顺序是很重要的。VxD中第一个被声明的服务必须是Get_Version服务(该服务清除进位标志并在AX寄存器中返回VxD版本 

  号),任何加入VxD的新服务必须定义在服务表的末尾(或者定义在服务表中显式保留的空间中)。由于VMM依靠服务在服务表中的顺序正确链接 

  服务,在服务表中间插入一个新服务需要VxD使用的所有VxD服务被重建。 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  为了方便,服务表声明应该放在一个包含文件中,使得其它VxD可以通过包含该文件引入服务而不需要重新声明。 

  3、引入服务 

  一个VxD可以通过包含另一个VxD的服务表声明引入另一个VxD的服务,在这种情况下,设备指定符号的定义不能先于该服务表声明(参见上一节 

  的讲述)。例如:VSAMPLED.INC文件包含VSAMPLED服务的服务表声明,一个包含该文件的VxD可以调用这些服务。VxD使用VMMcall宏调用VMM服 

  务,使用VxDcall宏调用VxD服务。 

  由于计算机配置不同,一个VxD可能会在Windows启动时装载失败,这说明使用其它VxD提供的服务的VxD必须检验其它VxD服务在调用它们之前 

  是否有效。为了检验服务,调用服务的VxD必须尝试调用提供服务的VxD的Get_Version功能,如果VxD没有装载,VMM会设置进位标志并在AX寄 

  存器中返回0。 

  十一、VxD API过程 

  一个VxD提供V86模式和保护模式API过程以允许在一个虚拟机中运行的应用程序和其它软件访问该VxD的特征。如果要使这些可选的过程有效, 

  VxD必须将它们定义为Declare_Virtual_Device宏的参数,如果没有定义,VMM认为该VxD没有API过程。 

  在一个虚拟机中运行的应用程序或者其它软件通过设置BX寄存器为VxD标识并调用获取设备入口地址功能(INT 2FH 1684H功能)获取特定的虚 

  拟机的API过程的入口地址,VMM返回该地址使得应用程序可以间接调用该API过程。 

  当一个应用程序调用该入口地址时,VMM保存该应用程序的寄存器并调用VxD相应的API过程,保存当前虚拟机的句柄到BX寄存器中并保存 

  Client_Reg_Struc结构地址到EBP寄存器中。API过程必须检测客户寄存器的值(使用Client_Reg_Struc结构)以判断运行的API调用。 

  按照常规,大多数API过程使用AH寄存器指定主功能号,使用AL寄存器指定次功能号,其它客户寄存器用于附加参数。API过程通过修改客户寄 

  存器返回值,API过程可以修改EAX、EBX、ECX、EDX、ESI和EDI寄存器。

  下面的实例给出了一个实例API过程VSAMPLED_API_Get_Version: 

  BeginProc VSAMPLED_API_Get_Version 

  movzx eax, [ebp.Client_AX] ;取功能号 

  or eax, eax 

  jnz Undefined 

  Get_Version: 

  mov [ebp.Client_AX], 030AH ;在客户寄存器AX中返回值 

  and [ebp.Client_Flags], NOT CF_Mask ;清除进位标志 

  ret 

  Undefined: 

  or [ebp.Client_Flags], CF_Mask ;设置进位标志 

  ret 

  EndProc VSAMPLED_API_Get_Version 

  十二、VxD INT 2FH功能 

  VxD可以通过为INT 2FH中断安装回调过程提供INT 2FH功能。INT 2FH功能允许在一个虚拟机中运行的应用程序和其它软件在VxD不提供API过 

  程的情况下访问VxD,例如,标准虚拟显示设备支持与Windows显示驱动程序通信的INT 2FH功能集合。 

  Windows安装自己的INT 2FH中断处理程序支持各种功能,以允许MS-DOS 设备驱动程序和TSR在Windows启动或者虚拟机运行过程中执行特定动 

  作。要获得有关这些功能的更多信息,请参阅有关资料。 

  十三、建立一个VxD 

  应该通过进行下列步骤来建立一个VxD: 

  1、创建VxD源文件并用32位平坦模式汇编器MASM.EXE(MASM 6.11以上译者注)汇编源文件。 

  2、创建模块定义文件(DEF文件)并用32位平坦模式连接器LINK.EXE连接目标文件。按照常规,结果可执行文件应该有与VxD相同的文件名,文 

  件扩展名为VXD。 

  3、用MAPSYM.EXE为可执行文件创建调试信息。 

  VxD并不与Windows动态链接库兼容,基于Windows的应用程序并不能直接装载和使用VxD,然而,基于Win32的应用程序可以通过使用CreateFile 

  和DeviceIoControl函数装载动态装载的VxD和与之相互作用。VxD模块定义文件有以下格式: 

  LIBRARY VSAMPLED 

  DESCRIPTION 'VSAMPLED Device (Version 4.0)' 

  EXETYPE DEV386 

  SEGMENTS 

  _LTEXT PRELOAD NONDISCARDABLE 

  _LDATA PRELOAD NONDISCARDABLE 

  _ITEXT CLASS 'ICODE' DISCARDABLE 

  _IDATA CLASS 'ICODE' DISCARDABLE 

  _TEXT CLASS 'PCODE' NONDISCARDABLE 

  _DATA CLASS 'PCODE' NONDISCARDABLE 

  EXPORTS 

  VSAMPLED_DDB @1 

  LIBRARY语句必须指定一个与在已知设备描述块(DDB)中相同的VxD名字,EXPORT语句必须指定一个DDB的名字,在任何情况下,DDB引出序号都是1。 

来源:https://www.tulaoshi.com/n/20160219/1608765.html

延伸阅读
标签: PHP
四、中断处理程序 Linux中的中断处理程序很有特色,它的一个中断处理程序分为两个部分:上半部(tophalf)和下半部(bottom half)。之所以会有上半部和下半部之分,完全是考虑到中断处理的效率。 上半部的功能是"登记中断"。当一个中断发生时,他就把设备驱动程序中中断例程的下半部挂到该设备的下半部执行队列...
Windows 7内置了多少种驱动程序?   在Windows7中包含了一个覆盖范围很广的身边驱动程序库。在该操作系统的基本安装中,这些驱动程序都会保存在驱动程序存储区中,它们位于%SystemRoot%System32DriverStoreFileRepository目录下。另外,在 DriverStore文件夹中还保存了对应本地化后的驱动程序信息的子文件夹,对于在系统上配置的每个...
Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得linux的设备操作犹如文件一般。在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,如open()、close()、read()、write() 等。 Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以字符的...
    引 言     编写 Linux 设备驱动程序无疑是一项复杂的工作。本文将集中介绍非标准硬件的设备驱动程序编写,探讨硬件应用编程接口,并借用 Cirrus Logic EP9312 片上系统嵌入式平台添加设备驱动程序这一案例来进行分析。     如果有些编程内容未能在本文中涉及,那么读者亦可以查阅相似的...
标签: 电脑入门
关于Windows8这个新系统,由于全新的风格,全新的操作模式,所以很多用户对系统内的操作还很陌生,一旦遇到一点小问题就开始措手不及,下面就教大家来处理Windows8系统下比较常见的问题之硬件驱动程序的找寻。 首先,确保已开启自动更新: 1. 按下 Windows 键 + W 并键入Windows Update。然后点按或单击Windows Update将其打开。 2. 在左...

经验教程

797

收藏

81
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部