利用Windows虚拟设备驱动措施(VxD)之2
当前位置:以往代写 > C/C++ 教程 >利用Windows虚拟设备驱动措施(VxD)之2
2019-06-13

利用Windows虚拟设备驱动措施(VxD)之2

利用Windows虚拟设备驱动措施(VxD)之2

副标题#e#

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


#p#副标题#e#

2、声明处事

VxD利用Begin_Service_Table和End_Service_Table宏声明处事。宏标志包括处事名和可选的包括处事的段名的列表的开始和竣事。声明必需建

立在举办VxD界说的文件中(也就是说在包括Declare_Virtual_Device宏的文件中),并且必需先举办设备指定标记的界说。下面的实例给出了

一个实例VxD——VSAMPLED的处事表声明:

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段中。

#p#分页标题#e#

处事声明的顺序是很重要的。VxD中第一个被声明的处事必需是Get_Version处事(该处事排除进位符号并在AX寄存器中返回VxD版本号),任何插手VxD的新处事必需界说在处事表的末端(可能界说在处事表中显式保存的空间中)。由于VMM依靠处事在处事表中的顺序正确链接

处事,在处事表中间插入一个新处事需要VxD利用的所有VxD处事被重建。

为了利便,处事表声明应该放在一个包括文件中,使得其它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

#p#副标题#e#

十二、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

#p#分页标题#e#

LIBRARY语句必需指定一个与在已知设备描写块(DDB)中沟通的VxD名字,EXPORT语句必需指定一个DDB的名字,在任何环境下,DDB引出序号都是1。

    关键字:

在线提交作业