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

📄 csdn_文档中心_vxd.htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 3 页
字号:
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR>
        <TR>
          <TD align=middle bgColor=#003399 height=10><FONT 
            color=#ffffff>标题</FONT></TD>
          <TD><B>&nbsp;&nbsp;&nbsp;&nbsp;VxD</B>&nbsp;&nbsp;&nbsp;&nbsp;jiangtao(转贴) 
          </TD></TR>
        <TR>
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR>
        <TR>
          <TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
          <TD width=500>&nbsp;&nbsp;&nbsp;&nbsp;VxD</TD></TR>
        <TR>
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR>
        <TR>
          <TD align=middle bgColor=#003399 height=10><FONT 
            color=#ffffff>出处</FONT></TD>
          <TD height=10>&nbsp;&nbsp;&nbsp;&nbsp;<A 
            href="http://asm.yeah.net/">http://asm.yeah.net/</A></TD></TR>
        <TR>
          <TD align=middle height=10></TD>
          <TD height=10></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
      <TABLE border=0 width=600>
        <TBODY>
        <TR>
          <TD align=left><BR>
            <TABLE>
              <TBODY>
              <TR>
                <TD bgColor=#000000>
                  <H1><FONT face=Arial,Helvetica><FONT color=#ffff99>VxD 
                  程序设计入门</FONT></FONT></H1>
                  <CENTER></CENTER><FONT face=Arial,Helvetica><FONT size=-1>We 
                  我们在上一节学会了如何编写一个什么事也不做的VxD程序。在这一节里,我们要给它增加处理控制消息的功能。</FONT></FONT> 

                  <H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT 
                  size=+0>VxD的初始化和结束</FONT></FONT></FONT></H3><FONT 
                  face=Arial,Helvetica><FONT 
                  size=-1>VxD程序分为两种:静态的和动态的。每种的加载方法都不同,接受到的初始化和结束的控制消息也不同。</FONT></FONT> 

                  <H3><FONT face=Arial,Helvetica><FONT color=#ffcc33><FONT 
                  size=-1>静态VxD:</FONT></FONT></FONT></H3><FONT 
                  face=Arial,Helvetica><FONT 
                  size=-1>下列情况下,VMM加载一个静态VxD:</FONT></FONT> 
                  <UL>
                    <LI><FONT face=Arial,Helvetica><FONT 
                    size=-1>一个实模式常驻程序通过调用中断2FH,1605H,来调用此VxD。</FONT></FONT> 
                    <LI><FONT face=Arial,Helvetica><FONT 
                    size=-1>此VxD在注册表中的如下位置有定义:</FONT></FONT> </LI></UL>
                  <UL>
                    <UL><B><FONT face=Arial,Helvetica><FONT size=-1><FONT 
                      color=#ffff99>HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\</FONT><FONT 
                      color=#66ff99>key</FONT><FONT 
                      color=#ffff99>\StaticVxD=VxD带路径文件名</FONT></FONT></FONT></B></UL></UL>
                  <UL>
                    <LI><FONT face=Arial,Helvetica><FONT size=-1><FONT 
                    color=#ffffff>此VxD在system.ini中的[386enh]行下有定义:</FONT><B><FONT 
                    color=#ffff99>[386enh]</FONT></B><FONT color=#ffffff> 
                    section:</FONT></FONT></FONT> 
                    <UL><BR><B><FONT face=Arial,Helvetica><FONT 
                      color=#ffff99><FONT 
                      size=-1>device=VxD带路径文件名</FONT></FONT></FONT></B></UL></LI></UL><FONT 
                  face=Arial,Helvetica><FONT color=#ffffff><FONT 
                  size=-1>在开发的时候,我建议你从system.ini载入VxD程序,因为这样如果你的VxD程序有错而导致Windows不能启动的话,你可以在Dos下修改system.ini,而如果你使用的注册表载入的办法,就无法修改了。</FONT></FONT></FONT> 
                  <BR><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
                  size=-1>当VMM加载你的静态VxD程序时,你的VxD程序会按以下顺序接收到三个系统控制消息:</FONT></FONT></FONT> 

                  <UL>
                    <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
                    color=#ffff99>Sys_Critical_Init</FONT></B><FONT 
                    color=#ffffff>&nbsp; 
                    VMM在转入到保护模式后,开放中断前发出这个控制消息。大多数VxD程序到不要用到这个消息,除非:</FONT></FONT></FONT> 

                    <UL>
                      <LI><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
                      size=-1>你的VxD程序要接管一些其他VxD程序或者保护模式程序要用到的中断。既然你处理这个消息的时候这个中断还没有打开,你就可以确定在你接管这个中断的时候此中断不会被调用。</FONT></FONT></FONT> 

                      <LI><FONT face=Arial,Helvetica><FONT size=-1><FONT 
                      color=#ffffff>你的VxD程序为其他的VxD程序提供了一些VxD服务。例如,一些在你的VxD程序后加载的VxD程序在处理</FONT><B><FONT 
                      color=#ffff99>Device_Init</FONT></B><FONT 
                      color=#ffffff>控制消息时需要调用一些你的VxD服务,既然</FONT><B><FONT 
                      color=#ffff99>Sys_Critical_Init </FONT></B><FONT 
                      color=#ffffff>控制消息在</FONT><B><FONT 
                      color=#ffff99>Device_Init</FONT></B><FONT 
                      color=#ffffff>消息之前被发送,所以你应该在</FONT><B><FONT 
                      color=#ffff99>Sys_Critical_Init</FONT></B><FONT 
                      color=#ffffff> 消息发送时初始化你的程序。</FONT></FONT></FONT> 
                    </LI></UL><FONT face=Arial,Helvetica><FONT 
                    color=#ffffff><FONT 
                    size=-1>如果你要对这消息进行处理,你应该尽可能快的做完初始化工作,以免太长的执行时间导致的硬中断丢失。(记住:中断还没打开)</FONT></FONT></FONT> 

                    <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
                    color=#ffff99>Device_Init </FONT></B><FONT 
                    color=#ffffff>VMM在开放中断后发送此信息。大多数VxD程序都在得到这个消息时初始化。因为中断都开放了,所以耗时的操作也可以在这里执行而不必怕会导致硬中断的丢失。你可以在这时进行初始化(如果你需要的话)。</FONT></FONT></FONT> 

                    <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
                    color=#ffff99>Init_Complete</FONT></B><FONT color=#ffffff> 
                    在所有的VxD程序处理完</FONT><B><FONT color=#ffff99>Device_Init 
                    </FONT></B><FONT 
                    color=#ffffff>消息之后,VMM释放初始化段(ICODE和RCODE段类)之前,VMM发出这个控制消息。只有少数几个VxD要处理这个消息。</FONT></FONT></FONT> 
                    </LI></UL><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
                  size=-1>你的VxD程序在成功地初始化后,<B><FONT 
                  color=#ffff99>必须</FONT></B>将返回标志清零,反之,必须在返回之前把返回标志设为出错信息。如果你的VxD不需要初始化,你就不必对这些消息进行处理。</FONT></FONT></FONT> 
                  <BR><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
                  size=-1>当要结束静态VxD的时候,VMM发送如下的控制消息:</FONT></FONT></FONT> 
                  <UL>
                    <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
                    color=#ffff99>System_Exit2</FONT></B><FONT 
                    color=#ffffff>&nbsp; 
                    当你的VxD程序收到这个消息,Windows95正在关闭系统,除了系统虚拟机所有其他虚拟机都已经退出了。尽管如此,CPU仍然处于保护模式下,在系统虚拟机上执行实模式编码也是安全的。在这时Kernel32.dll也已经被卸载了。</FONT></FONT></FONT> 

                    <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
                    color=#ffff99>Sys_Critical_Exit2</FONT></B><FONT 
                    color=#ffffff>&nbsp; 
                    当所有的VxD完成对System_Exit2的响应处理并且中断都被关闭后,你的VxD收到到这个消息。</FONT></FONT></FONT> 
                    </LI></UL><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
                  size=-1>许多VxD程序并不要响应这两个消息,除非你要为系统做转换到实模式的准备。要知道,当Window95关闭时,它进入到实模式。所以如果你的VxD程序对实模式影像做了一些会导致它不稳定的操作,它就需要在这时进行恢复。</FONT></FONT></FONT> 
                  <BR><FONT face=Arial,Helvetica><FONT size=-1><FONT 
                  color=#ffffff>你也许会感到奇怪:为什么这两个消息后面都跟着个“</FONT><B><FONT 
                  color=#ffff99>2</FONT></B><FONT color=#ffffff>" 
                  ”。这是因为:在VMM加载VxD程序的时候,它是按照初始化顺序值小的VxD先加载的顺序加载的,这样VxD程序就可以使用那些在它们之前加载的VxD程序提供的服务。例如,VxD2要用到VxD1中的服务,它就必须把它的初始化顺序值定义的比VxD小。加载的顺序是:</FONT></FONT></FONT> 

                  <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
                    color=#66ff99><FONT size=-1>..... VxD1 ===&gt;&nbsp; VxD2 
                    ===&gt; VxD3 .....</FONT></FONT></FONT></B></BLOCKQUOTE><FONT 
                  face=Arial,Helvetica><FONT color=#ffffff><FONT 
                  size=-1>那么卸载的时候,理所当然的是初始化顺序值大的VxD程序先被卸载,这样他们仍然可以使用比它们后加载的那些VxD程序提供的服务。如上面的例子,次序是:</FONT></FONT></FONT> 

                  <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
                    color=#66ff99><FONT size=-1>.... VxD3 ===&gt; VxD2 ===&gt; 
                    VxD1.....</FONT></FONT></FONT></B></BLOCKQUOTE><FONT 
                  face=Arial,Helvetica><FONT size=-1><FONT 
                  color=#ffffff>在上边的例子中,如果VxD2在初始化时调用了VxD1中的某些服务,那么卸载时它可能也要再次用到一些VxD1中的服务。</FONT><B><FONT 
                  color=#ffff99>System_Exit2</FONT></B><FONT 
                  color=#ffffff>和</FONT><B><FONT 
                  color=#ffff99>Sys_Critical_Exit2</FONT></B><FONT 
                  color=#ffffff>是</FONT><B><FONT 
                  color=#66ffff>反初始化顺序</FONT></B><FONT 
                  color=#ffffff>发送的。这表示,当VxD2接受到这些消息时,VxD1还没有被卸载,它仍可以调用VxD1的服务,而</FONT><B><FONT 
                  color=#ffff99>System_Exit</FONT></B><FONT 
                  color=#ffffff>和</FONT><B><FONT 
                  color=#ffff99>Sys_Critical_Exit</FONT></B><FONT 
                  color=#ffffff>消息不是按照反初始化顺序发送的。这意味着,你不能肯定你是否仍能调用在你之前加载的VxD提供的VxD服务。新一代的VxD程序不应该使用这些消息。</FONT></FONT></FONT> 
                  <BR><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
                  size=-1>还有两种退出消息: </FONT></FONT></FONT>
                  <UL>
                    <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
                    color=#ffff99>Device_Reboot_Notify2</FONT></B><FONT 
                    color=#ffffff>&nbsp; 
                    告诉VxD程序VMM正在准备重新启动系统。这时候中断还是开放的。</FONT></FONT></FONT> 
                    <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
                    color=#ffff99>Crit_Reboot_Notify2</FONT></B><FONT 
                    color=#ffffff>&nbsp; 
                    告诉VxD程序VMM正在准备重新启动系统。这时候中断已经被关闭了。</FONT></FONT></FONT> 
                  </LI></UL><FONT face=Arial,Helvetica><FONT size=-1><FONT 
                  color=#ffffff>到这里,你可以猜到还有</FONT><B><FONT 
                  color=#ffff99>Device_Reboot_Notify</FONT></B><FONT 
                  color=#ffffff>和</FONT><B><FONT 
                  color=#ffff99>Crit_Reboot_Notify </FONT></B><FONT 
                  color=#ffffff>消息,但它们并不是像“2”版本的消息一样按反初始化顺序发送的。</FONT></FONT></FONT> 

                  <H3><FONT face=Arial,Helvetica><FONT color=#ffcc33><FONT 
                  size=-1>动态VxD:</FONT></FONT></FONT></H3><FONT 
                  face=Arial,Helvetica><FONT color=#ffffff><FONT 
                  size=-1>动态VxD在Windows9x里可以动态的被加载和卸载。这个特点在Window3.x下是没有的。动态VxD程序的主要作用是用来支持某些动态的硬件设备的重装,比如:即插即用设备。尽管如此,你可以从你的Win32程序中加载/卸载它,也可以把它看作是你的程序的一个到ring-0的扩展。</FONT></FONT></FONT> 
                  <BR><FONT face=Arial,Helvetica><FONT size=-1><FONT 
                  color=#ffffff>上一节我们提到的例子是一个静态的VxD,你可以把它转换成一个动态的VxD,只要在.def文件中</FONT><B><FONT 
                  color=#ffff99>VxD</FONT></B><FONT 
                  color=#ffffff>标记的后面加上关键字</FONT><B><FONT 
                  color=#ffff99>DYNAMIC</FONT></B><FONT 
                  color=#ffffff>。</FONT></FONT></FONT>
                  <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
                    color=#ffff99><FONT size=-1>VxD&nbsp;&nbsp; 
                    FIRSTVxD&nbsp;&nbsp; 
                  DYNAMIC</FONT></FONT></FONT></B></BLOCKQUOTE><FONT 
                  face=Arial,Helvetica><FONT color=#ffffff><FONT 

⌨️ 快捷键说明

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