⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdn_文档中心_vxd例程:消息框(vxd教程5).htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 3 页
字号:
            <BR><FONT face=Arial,Helvetica><FONT size=-1>在<A 
            href="http://freeshell.org/~michael/files/VxDmessage.zip">这里</A>下载例子。</FONT></FONT> 

            <H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT 
            size=+0>捕获虚拟机创建和结束事件</FONT></FONT></FONT></H3><FONT 
            face=Arial,Helvetica><FONT size=-1>当一个虚拟机创建时,VMM发送<B><FONT 
            color=#ffff99>Create_VM</FONT></B>控制消息给所有的VxD程序。当一个虚拟机退出时,它也发送<B><FONT 
            color=#ffff99>VM_Terminate</FONT></B>和<B><FONT 
            color=#ffff99>VM_Terminate2</FONT></B>消息给所有的VxD程序。我们的工作很简单:在设备控制程序里处理<B><FONT 
            color=#ffff99>Create_VM</FONT></B> and <B><FONT 
            color=#ffff99>VM_Terminate2</FONT></B>消息。当我们的VxD程序收到这两个控制消息时,它在屏幕上弹出一个消息框。</FONT></FONT> 
            <BR><FONT face=Arial,Helvetica><FONT size=-1>当VxD程序收到<B><FONT 
            color=#ffff99>Create_VM</FONT></B>或者<B><FONT color=#ffff99> 
            VM_Terminate2</FONT></B>消息时,该虚拟机的句柄保存在ebx中。一个虚拟记的句柄可以看作它的唯一的ID。每一个虚拟机都有它自己唯一的ID(虚拟机句柄)。你可以像使用进程ID一样使用虚拟机ID:调用函数时,把它当作参数传送。</FONT></FONT> 
            <BR><FONT face=Arial,Helvetica><FONT 
            size=-1>更进一步的来看,一个虚拟机句柄实际上是一个指向<B><FONT 
            color=#ffff99>虚拟机控制块(VMCB)</FONT></B>的32位线性地址。</FONT></FONT> 
            <BR><FONT face=Arial,Helvetica><FONT 
            size=-1>一个虚拟机控制块是一个包括了许多关于该虚拟机的重要属性的结构。它的定义如下:</FONT></FONT> 
            <UL><B><TT>cb_s <FONT color=#ffcc33>STRUC</FONT></TT></B> 
              <BR><B><TT><FONT 
              color=#ffff99>CB_VM_Status&nbsp;</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
              DD ?</TT></B> <BR><B><TT><FONT 
              color=#ffff99>CB_High_Linear</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
              DD ?</TT></B> <BR><B><TT><FONT 
              color=#ffff99>CB_Client_Pointer</FONT>&nbsp;&nbsp; DD ?</TT></B> 
              <BR><B><TT><FONT 
              color=#ffff99>CB_VMID&nbsp;&nbsp;</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
              DD ?</TT></B> <BR><B><TT><FONT 
              color=#ffff99>CB_Signature&nbsp;</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
              DD ?</TT></B> <BR><B><TT>cb_s <FONT 
              color=#ffcc33>ENDS</FONT></TT></B> <BR>&nbsp; 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><FONT 
              color=#66ff99><B>CB_VM_Status</B>&nbsp;</FONT> 
              包含了反映虚拟机状态的一些标志位。</FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#66ff99>CB_High_Linear&nbsp;</FONT></B>是一个指向在系统共享区(约3GB)的虚拟机镜像的一个线性地址。这个概念需要解释一下。在Window95下,一个VxD不能直接访问到V86区域,代替地,VMM把每个虚拟机的V86区域都映射到系统共享区。当一个VxD程序要访问或修改虚拟机中的V86区时,它就在虚拟机的高线性区域进行操作。例如,如果显存的地址是0B8000H,而你的VxD程序要访问这个区域。它就要把CB_High_Linear中的值上0B8000H,然后访问那个区域。你在高线性镜像区域所作的修改都会被保存到虚拟机中去,因为这两个区域共享一个页面目录入口。使用高线性镜像在它多数情况下非常有效,因为你甚至可以修改一个不是当前虚拟机的虚拟机。</FONT></FONT> 

              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#66ff99>CB_Client_Pointer</FONT></B> 包含了<B><FONT 
              color=#ffff99>客户寄存器结构</FONT></B>的地址。一个客户寄存器结构包含了在一个虚拟机中被中断的V86或保护模式程序的所有寄存器的值。如果你的VxD程序要读取/改动V86或PM程序的状态,它可以改动客户寄存器结构里的值,当VMM返回执行该程序时,这些改动会被保存到程序里去。</FONT></FONT> 

              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#66ff99>CB_VMID</FONT></B>&nbsp; 
              虚拟机的身份验证数字。当VMM创建一个虚拟机时,就给该虚拟机分配一个数字。系统虚拟机的VMID是1。</FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#66ff99>CB_Signature</FONT></B> 
              包含字串“VMcb”。这个元素是用来检测虚拟机句柄是否有效的。</FONT></FONT> </LI></UL>
            <H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT 
            size=+0>显示一个对话框</FONT></FONT></FONT></H3><FONT 
            face=Arial,Helvetica><FONT size=-1>一个VxD程序可以通过<B><FONT 
            color=#ffff99>Virtual Shell 
            Device</FONT></B>服务来同用户通讯。在这个例子里我们要用到其中的一个:<B><FONT 
            color=#ffff99>SHELL_Message</FONT></B>.</FONT></FONT> <BR><FONT 
            face=Arial,Helvetica><FONT 
            size=-1>SHEll_Message是一个寄存器法的服务函数,通过寄存器来传送参数:</FONT></FONT> 
            <UL>
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffcc33>ebx</FONT></B>&nbsp; 显示这个消息的虚拟机的句柄。</FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffcc33>eax&nbsp;</FONT></B> 
              消息框的标志位。你可以在shell.inc中查查它们的详细信息,它们都是以MB_开头的。</FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffcc33>ecx</FONT></B>&nbsp; 要显示的消息的32位线性地址。</FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffcc33>edi&nbsp;</FONT></B> 消息框的标题的32位线性地址。</FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffcc33>esi&nbsp;</FONT></B> 
              如果你要知道用户对你的消息框作的反应操作,就在这里填写返回函数的32位线性地址。如果你不想知道,就用NULL。</FONT></FONT> 

              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffcc33>edx</FONT></B>&nbsp; 
              用来传送你的返回函数所需要的参数(如果你在esi中填了这个函数的地址)。</FONT></FONT> </LI></UL><FONT 
            face=Arial,Helvetica><FONT size=-1>返回后,如果调用成功,返回标志被清零,否则,返回标志被置位。 
            </FONT></FONT>
            <H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT 
            size=+0>例子:</FONT></FONT></FONT></H3>
            <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
              color=#cccccc><FONT size=-1>.386p</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>include VMM.inc</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT size=-1>include 
              shell.inc</FONT></FONT></FONT></B> 
              <P><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>DECLARE_VIRTUAL_DEVICE MESSAGE,1,0, MESSAGE_Control, 
              UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER</FONT></FONT></FONT></B> 

              <P><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>Begin_control_dispatch MESSAGE</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#ffff99><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; Control_Dispatch Create_VM, 
              OnVMCreate</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#ffff99><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; Control_Dispatch VM_Terminate2, 
              OnVMClose</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>End_control_dispatch MESSAGE</FONT></FONT></FONT></B> 
              <P><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>VxD_PAGEABLE_DATA_SEG</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; MsgTitle db "VxD 
              MessageBox",0</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; VMCreated db "A VM is 
              created",0</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; VMDestroyed db "A VM is 
              destroyed",0</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>VxD_PAGEABLE_DATA_ENDS</FONT></FONT></FONT></B> 
              <P><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>VxD_PAGEABLE_CODE_SEG</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>BeginProc OnVMCreate</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; mov ecx, OFFSET32 
              VMCreated</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>CommonCode:</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; VMMCall 
              Get_sys_vm_handle</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; mov 
              eax,MB_OK+MB_ICONEXCLAMATION</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; mov edi, OFFSET32 
              MsgTitle</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; xor esi,esi</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; xor edx,edx</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; VxDCall 
              SHELL_Message</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; ret</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>EndProc OnVMCreate</FONT></FONT></FONT></B> 
              <P><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>BeginProc OnVMClose</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; mov ecx,OFFSET32 
              VMDestroyed</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; jmp CommonCode</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>EndProc OnVMClose</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>VxD_PAGEABLE_CODE_ENDS</FONT></FONT></FONT></B> 
              <P><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>end</FONT></FONT></FONT></B></P></BLOCKQUOTE>
            <H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT 
            size=+0>分析:</FONT></FONT></FONT></H3>
            <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
              color=#cccccc><FONT size=-1>Begin_control_dispatch 
              MESSAGE</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#ffff99><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; Control_Dispatch Create_VM, 
              OnVMCreate</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#ffff99><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; Control_Dispatch VM_Terminate2, 
              OnVMClose</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>End_control_dispatch 
            MESSAGE</FONT></FONT></FONT></B></BLOCKQUOTE><FONT 
            face=Arial,Helvetica><FONT size=-1><FONT 
            color=#cccccc>此VxD程序处理两个控制消息,</FONT><B><FONT 
            color=#ffff99>Create_VM</FONT></B><FONT 
            color=#cccccc>和</FONT><B><FONT 
            color=#ffff99>VM_Terminate2</FONT></B><FONT 
            color=#cccccc>当收到</FONT><B><FONT color=#ffff99>Create_VM 
            </FONT></B><FONT color=#cccccc>控制消息时,它调用</FONT><B><FONT 
            color=#ffff99>OnVMCreate</FONT></B><FONT 
            color=#cccccc>函数。当收到</FONT><B><FONT color=#ffff99>VM_Terminate2 
            </FONT></B><FONT color=#cccccc>消息时,它调用</FONT><B><FONT 
            color=#ffff99>OnVMClose</FONT></B><FONT color=#cccccc> 
            函数。</FONT></FONT></FONT> 
            <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
              color=#ffff99><FONT 
              size=-1>VxD_PAGEABLE_DATA_SEG</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; MsgTitle db "VxD 
              MessageBox",0</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; VMCreated db "A VM is 
              created",0</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; VMDestroyed db "A VM is 
              destroyed",0</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#ffff99><FONT 
              size=-1>VxD_PAGEABLE_DATA_ENDS</FONT></FONT></FONT></B></BLOCKQUOTE><FONT 
            face=Arial,Helvetica><FONT color=#cccccc><FONT 
            size=-1>我们把这些数据放在可调页段里面。</FONT></FONT></FONT> 
            <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT size=-1><FONT 
              color=#ffcc33>BeginProc</FONT><FONT color=#cccccc> 
              OnVMCreate</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT size=-1><FONT 
              color=#cccccc>&nbsp;&nbsp;&nbsp; mov ecx, </FONT><FONT 
              color=#ffcc33>OFFSET32</FONT><FONT color=#cccccc> 
              VMCreated</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>CommonCode:</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT size=-1><FONT 
              color=#ffcc33>&nbsp;&nbsp;&nbsp; VMMCall </FONT><FONT 
              color=#cccccc>Get_sys_vm_handle</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#cccccc><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; mov 
              eax,MB_OK+MB_ICONEXCLAMATION</FONT></FONT></FONT></B> <BR><B><FONT 
              face=Arial,Helvetica><FONT size=-1><FONT 
              color=#cccccc>&nbsp;&nbsp;&nbsp; mov edi, </FONT><FONT 
              color=#ffcc33>OFFSET32 </FONT><FONT 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -