VxD例程:消息框
|
源代码网整理以下 在上一节教程里,我们讲了编写一个VxD程序的方法。现在我们要学以致用。在这一节里,我们要编写一个静态VxD,这个静态VxD在一个虚拟机创建或销毁时就会弹出一个消息框。 源代码网推荐CB_Signature DD ? 源代码网推荐cb_s ENDS 源代码网推荐 源代码网推荐CB_VM_Status 包含了反映虚拟机状态的一些标志位。 源代码网推荐CB_High_Linear 是一个指向在系统共享区(约3GB)的虚拟机镜像的一个线性地址。这个概念需要解释一下。在Window95下,一个VxD不能直接访问到V86区域,代替地,VMM把每个虚拟机的V86区域都映射到系统共享区。当一个VxD程序要访问或修改虚拟机中的V86区时,它就在虚拟机的高线性区域进行操作。例如,如果显存的地址是0B8000H,而你的VxD程序要访问这个区域。它就要把CB_High_Linear中的值上0B8000H,然后访问那个区域。你在高线性镜像区域所作的修改都会被保存到虚拟机中去,因为这两个区域共享一个页面目录入口。使用高线性镜像在它多数情况下非常有效,因为你甚至可以修改一个不是当前虚拟机的虚拟机。 源代码网推荐CB_Client_Pointer 包含了客户寄存器结构的地址。一个客户寄存器结构包含了在一个虚拟机中被中断的V86或保护模式程序的所有寄存器的值。如果你的VxD程序要读取/改动V86或PM程序的状态,它可以改动客户寄存器结构里的值,当VMM返回执行该程序时,这些改动会被保存到程序里去。 源代码网推荐CB_VMID 虚拟机的身份验证数字。当VMM创建一个虚拟机时,就给该虚拟机分配一个数字。系统虚拟机的VMID是1。 源代码网推荐CB_Signature 包含字串“VMcb”。这个元素是用来检测虚拟机句柄是否有效的。 软件开发网 www.mscto.com 源代码网推荐显示一个对话框 源代码网推荐一个VxD程序可以通过Virtual Shell Device服务来同用户通讯。在这个例子里我们要用到其中的一个:SHELL_Message. 源代码网推荐SHEll_Message是一个寄存器法的服务函数,通过寄存器来传送参数: 源代码网推荐ebx 显示这个消息的虚拟机的句柄。 源代码网推荐eax 消息框的标志位。你可以在shell.inc中查查它们的详细信息,它们都是以MB_开头的。 源代码网推荐ecx 要显示的消息的32位线性地址。 源代码网推荐edi 消息框的标题的32位线性地址。 源代码网推荐esi 如果你要知道用户对你的消息框作的反应操作,就在这里填写返回函数的32位线性地址。如果你不想知道,就用NULL。 源代码网推荐edx 用来传送你的返回函数所需要的参数(如果你在esi中填了这个函数的地址)。 源代码网推荐返回后,如果调用成功,返回标志被清零,否则,返回标志被置位。 源代码网推荐例子: 源代码网推荐.386p 源代码网推荐include VMM.inc 源代码网推荐include shell.inc 源代码网推荐DECLARE_VIRTUAL_DEVICE MESSAGE,1,0, MESSAGE_Control, UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER 源代码网整理以下Begin_control_dispatch MESSAGE 源代码网推荐 源代码网供稿. |
