教程学院
图像设计 多媒体类 机械制图 办公软件 操作系统 系统编程 网站编程 网页制作 数据库类 网络路由 网络工程 网络安全 考试认证
firefox火狐浏览器下载
酷网学院
CAD
AutoCad Cam350 ProEngineer GCcam MATLAB Unigraphics SolidWorks CAXA Solid3000 Cimatron EdgeCAM
系统
安全 防火墙 病毒 WinXP Win2003 Vista
数据库
编程
网络
精彩图库
  当前位置: 库库中文网 · 系统编程教程 · 汇编语言 · 汇编语言基础教程

VxD例程:消息框

学院最新推荐文章
教程推荐
『VxD例程:消息框』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2005-9-1 

  在上一节教程里,我们讲了编写一个VxD程序的方法。现在我们要学以致用。在这一节里,我们要编写一个静态VxD,这个静态VxD在一个虚拟机创建或销毁时就会弹出一个消息框。
在这里下载例子。
捕获虚拟机创建和结束事件
当一个虚拟机创建时,VMM发送Create_VM控制消息给所有的VxD程序。当一个虚拟机退出时,它也发送VM_Terminate和VM_Terminate2消息给所有的VxD程序。我们的工作很简单:在设备控制程序里处理Create_VM and VM_Terminate2消息。当我们的VxD程序收到这两个控制消息时,它在屏幕上弹出一个消息框。
当VxD程序收到Create_VM或者 VM_Terminate2消息时,该虚拟机的句柄保存在ebx中。一个虚拟记的句柄可以看作它的唯一的ID。每一个虚拟机都有它自己唯一的ID(虚拟机句柄)。你可以像使用进程ID一样使用虚拟机ID:调用函数时,把它当作参数传送。
更进一步的来看,一个虚拟机句柄实际上是一个指向虚拟机控制块(VMCB)的32位线性地址。
一个虚拟机控制块是一个包括了许多关于该虚拟机的重要属性的结构。它的定义如下:
cb_s STRUC
CB_VM_Status DD ?
CB_High_Linear DD ?
CB_Client_Pointer DD ?
CB_VMID DD ?
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”。这个元素是用来检测虚拟机句柄是否有效的。
显示一个对话框
一个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_IN99v_ORDER

Begin_control_dispatch MESSAGE
Control_Dispatch Create_VM, OnVMCreate
Control_Dispatch VM_Terminate2, OnVMClose
End_control_dispatch MESSAGE

VxD_PAGEABLE_DATA_SEG
MsgTitle db "VxD MessageBox",0
VMCreated db "A VM is created",0
VMDestroyed db "A VM is destroyed",0
VxD_PAGEABLE_DATA_ENDS

VxD_PAGEABLE_CODE_SEG
BeginProc OnVMCreate
mov ecx, OFFSET32 VMCreated
CommonCode:
VMMCall Get_sys_vm_handle
mov eax,MB_OK+MB_ICONEXCLAMATION
mov edi, OFFSET32 MsgTitle
xor esi,esi
xor edx,edx
VxDCall SHELL_Message
ret
EndProc OnVMCreate

BeginProc OnVMClose
mov ecx,OFFSET32 VMDestroyed
jmp CommonCode
EndProc OnVMClose
VxD_PAGEABLE_CODE_ENDS

end

分析:
Begin_control_dispatch MESSAGE
Control_Dispatch Create_VM, OnVMCreate
Control_Dispatch VM_Terminate2, OnVMClose
End_control_dispatch MESSAGE
此VxD程序处理两个控制消息,Create_VM和VM_Terminate2当收到Create_VM 控制消息时,它调用OnVMCreate函数。当收到VM_Terminate2 消息时,它调用OnVMClose 函数。
VxD_PAGEABLE_DATA_SEG
MsgTitle db "VxD MessageBox",0
VMCreated db "A VM is created",0
VMDestroyed db "A VM is destroyed",0
VxD_PAGEABLE_DATA_ENDS
我们把这些数据放在可调页段里面。
BeginProc OnVMCreate
mov ecx, OFFSET32 VMCreated
CommonCode:
VMMCall Get_sys_vm_handle
mov eax,MB_OK+MB_ICONEXCLAMATION
mov edi, OFFSET32 MsgTitle

[1] [2] 下一页  

作者:无 来源:无
】【关闭窗口
·上页:
·下页:
相关文章
     系统编程教程 - 汇编语言基础教程
普通教程怎么样建立汇编工作环境
普通教程汇编语言程序设计
普通教程汇编语言地艺术(组合语言地艺术
普通教程汇编语言地艺术(组合语言地艺术
普通教程汇编语言地艺术(组合语言地艺术
普通教程汇编语言地艺术(组合语言地艺术
普通教程汇编语言地艺术(组合语言地艺术
普通教程汇编语言---程式设计 (5)
普通教程汇编语言---程式设计 (4)
普通教程汇编语言---程式设计 (3)
推荐教程汇编语言---程式设计 (2)
普通教程汇编语言---程式设计 (1)
精彩图片汇集
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部
网站文本地图
版权所有:库库中文 2005-2007 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright © 2005-2008 www.QQGB.com online services. all rights reserved. 蜀ICP备05015578
Template designed by Virus. Optimized for 1024x768 to Firefox,Opera and MS-IE6. Site powered by EQL.
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光