Programming 版 (精华区)

发信人: tih (我不敢说), 信区: Programming
标  题: Windows 95虚拟设备驱动程序(VxD)11
发信站: 紫 丁 香 (Thu Sep  9 08:25:53 1999), 转信

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


--

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: deu.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.045毫秒