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

📄 csdn_文档中心_虚拟设备驱动程序结构(vxd教程3).htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 4 页
字号:
          <TD align=middle height=10></TD>
          <TD height=10></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
      <TABLE border=0 width=600>
        <TBODY>
        <TR>
          <TD align=left><BR>
            <H1><FONT face=Arial,Helvetica><FONT 
            color=#ffff99>虚拟设备驱动程序结构</FONT></FONT></H1>
            <CENTER></CENTER>
            <DIV align=center>由 Ryo 翻译,发表于 <A 
            href="http://asm.yeah.net/">http://asm.yeah.net/</A>,英文版本来自 [<A 
            href="http://win32asm.cjb.net/">Iczelion's Win32 Assembly 
            Homepage</A>] </DIV><BR><FONT face=Arial,Helvetica><FONT 
            size=-1>现在大家对vmm和vxd有了一定的了解,接下来我们来看一看如何编写vxd代码。首先,你必须具备<B><FONT 
            color=#66ff99>Windows 95/98 Device Driver Development 
            Kit</FONT></B>。Window95 ddk只有MSDN 订户才能拿到,但Windows98 
            ddk却可以免费从Microsoft公司取得。尽管Windows 98 
            ddk是面向WDM的,但你还是可以用它来开发VxD程序。你可以从&nbsp;<A 
            href="http://www.microsoft.com/hwdev/ddk/install98ddk.htm?">http://www.microsoft.com/hwdev/ddk/install98ddk.htm?</A>下载Window98 
            ddk。</FONT></FONT> <BR><FONT face=Arial,Helvetica><FONT 
            size=-1>你可以下载整个软件包(大约30M),也可以只下载你感兴趣的部分。如果你没有下载整个软件包,那么别忘了下载<B><FONT 
            color=#ffff99>other.exe</FONT></B></FONT></FONT> <BR><FONT 
            face=Arial,Helvetica><FONT color=#ffffff><FONT size=-1>里面的Window95 
            ddk documentation。Windows98 ddk 
            包含了6.11d版的MASM。你需要把它升级为最新版。如果你不知道到哪里去下载最新的版本,可以去我的<A 
            href="http://win32asm.cjb.net/">主页</A>上查一查。</FONT></FONT></FONT> 
            <BR><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1>Window9x DDK包含了一些Masm32包所不具有的重要库文件。</FONT></FONT></FONT> 
            <BR><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1>你可以在<A 
            href="http://freeshell.org/~michael/files/firstvxd.zip">这里</A>下载这一章的例子。</FONT></FONT></FONT> 

            <H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT 
            size=+0>LE文件格式</FONT></FONT></FONT></H3><FONT 
            face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1>VxD采用线性可执行文件格式(LE)。这种文件格式是为OS/2 
            2.0版设计的。它同时包含16位和32位代码,这点也是VxD程序的需要。回想VxD在Windows3.x的时代,在那时,从Dos启动Windows,Windows在把机器转到保护模式之前需要在实模式下做一些初始化。实模式的16位代码必须和32位代码一起放在可执行文件中。所以LE文件格式理所当然的选择。幸运的,Windows 
            NT驱动程序不必在实模式下初始化,所以它们不必使用LE文件格式。它们用的是PE文件格式。</FONT></FONT></FONT><FONT 
            face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1></FONT></FONT></FONT> 
            <P><FONT face=Arial,Helvetica><FONT size=-1><FONT 
            color=#ffffff>在LE文件中,代码和数据被存放在几类运行属性不同的</FONT><B><FONT 
            color=#ffff99>段</FONT></B><FONT 
            color=#ffffff>中。以下是一些可用的</FONT><B><FONT 
            color=#ffff99>段类</FONT></B><FONT 
            color=#ffffff>。</FONT></FONT></FONT> 
            <UL>
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffff99>LCODE</FONT></B><FONT 
              color=#ffffff>&nbsp;页面锁定的代码和数据段 
              这种段被锁定在内存里。换句话说,这段永远不会被放到硬盘上去,所以你一定要谨慎的使用这种段类以免浪费宝贵的内存。那些每时每刻都必须放在内存中的代码和数据应该放在这个段里。尤其是那些硬件中断处理程序。</FONT></FONT></FONT> 

              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffff99>PCODE</FONT></B><FONT color=#ffffff> 可调页代码段 
              VMM可以对这种段实行调页处理,在这种段里的代码不必时刻放在内存里,当VMM需要物理内存的时候,它就会把这段放到硬盘上去。</FONT></FONT></FONT> 

              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffff99>PDATA</FONT></B><FONT color=#ffffff> 
              可调页数据段</FONT></FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffff99>ICODE</FONT></B><FONT color=#ffffff> 仅用于的初始化段 
              这种段里的代码仅仅用来进行VxD的初始化。当初始化完成后,VMM就把这段从内存中释放。</FONT></FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffff99>DBOCODE</FONT></B><FONT color=#ffffff> 仅用于调试的代码数据段 
              当你要调试VxD程序时,就要用到这种段里的代码和数据,例如,它包含要调试的消息的处理代码。</FONT></FONT></FONT> 

              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffff99>SCODE</FONT></B><FONT color=#ffffff> 静态代码和数据段 
              这种段时刻存在于内存中,即使VxD已经卸载,这种段对某些动态的VxD程序很有用,这些VxD程序需要在某一Windows进程里不停的加载/卸载而又要纪录上次的环境和状态。</FONT></FONT></FONT> 

              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffff99>RCODE</FONT></B><FONT color=#ffffff> 实模式初始化代码数据段 
              这种段包含实模式初始化需要的16位代码和数据。 </FONT></FONT></FONT>
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffff99>16ICODE</FONT></B><FONT color=#ffffff> 16ICODE 
              USE16保护模式初始化数据段 
              这是一个16位的段,它包含VxD要从保护模式拷贝到V86模式的代码。例如,如果你要把一些V86的代码拷贝到一个虚拟机上时,你想拷贝的代码就要放在这里。如果你把它放在其他的段里,编译程序就会产生错误的代码,例如,它会产生32位代码而不是16位代码。</FONT></FONT></FONT> 

              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#ffff99>MCODE</FONT></B><FONT color=#ffffff> 锁定的消息字串 
              这种段包含了由VMM消息宏帮助编译的消息字串,这有助于你构造你的驱程的国际版本。</FONT></FONT></FONT> 
            </LI></UL><FONT face=Arial,Helvetica><FONT size=-1><FONT 
            color=#ffffff>这并不意味着你的VxD程序必须包含以上</FONT><B><FONT 
            color=#ffff99>所有</FONT></B><FONT 
            color=#ffffff>的段,你可以选择你的VxD程序需要的段。例如,如果你的VxD程序不进行实模式初始化,那么就不必包含</FONT><B><FONT 
            color=#ffff99>RCODE</FONT></B><FONT 
            color=#ffffff>段。</FONT></FONT></FONT> <BR><FONT 
            face=Arial,Helvetica><FONT size=-1><FONT 
            color=#ffffff>大多数时候,你要用到</FONT><B><FONT 
            color=#ffff99>LCODE</FONT></B><FONT color=#ffffff>, </FONT><B><FONT 
            color=#ffff99>PCODE</FONT></B><FONT color=#ffffff>和</FONT><B><FONT 
            color=#ffff99>PDATA</FONT></B><FONT 
            color=#ffffff>段。作为一个VxD程序编写者,为你的代码和数据选择合适的段取决于你自己的判断。总的来说,你应该尽可能多的使用</FONT><B><FONT 
            color=#ffff99>PCODE</FONT></B><FONT color=#ffffff>和</FONT><B><FONT 
            color=#ffff99>PDATA</FONT></B><FONT 
            color=#ffffff>因为这样VMM就可以在需要的时候把段调入调出内存。另外,硬件中断程序及其所用到的服务必须放在 
            </FONT><B><FONT color=#ffff99>LCODE</FONT></B><FONT 
            color=#ffffff>段里。</FONT></FONT></FONT> <BR><FONT 
            face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1>你不能直接地使用这些段类,你要用这些段类来定义段,这些段的定义被存放在模块定义文件(.def)中。下面是一个标准的模块定义文件:</FONT></FONT></FONT> 

            <BLOCKQUOTE><TT><FONT color=#ffff99><FONT size=-1>VXD 
              FIRSTVXD</FONT></FONT></TT> <BR><TT><FONT color=#ffff99><FONT 
              size=-1>SEGMENTS</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _LPTEXT&nbsp;&nbsp;&nbsp;&nbsp; CLASS 'LCODE'&nbsp;&nbsp;&nbsp; 
              PRELOAD NONDISCARDABLE</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _LTEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'LCODE'&nbsp;&nbsp;&nbsp; PRELOAD 
              NONDISCARDABLE</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _LDATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'LCODE'&nbsp;&nbsp;&nbsp; PRELOAD 
              NONDISCARDABLE</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _TEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'LCODE'&nbsp;&nbsp;&nbsp; PRELOAD 
              NONDISCARDABLE</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'LCODE'&nbsp;&nbsp;&nbsp; PRELOAD 
              NONDISCARDABLE</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              CONST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'LCODE'&nbsp;&nbsp;&nbsp; PRELOAD 
              NONDISCARDABLE</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _TLS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'LCODE'&nbsp;&nbsp;&nbsp; PRELOAD 
              NONDISCARDABLE</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _BSS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'LCODE'&nbsp;&nbsp;&nbsp; PRELOAD 
              NONDISCARDABLE</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _LMGTABLE&nbsp;&nbsp; CLASS 'MCODE'&nbsp;&nbsp;&nbsp; PRELOAD 
              NONDISCARDABLE IOPL</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _LMSGDATA&nbsp;&nbsp; CLASS 'MCODE'&nbsp;&nbsp;&nbsp; PRELOAD 
              NONDISCARDABLE IOPL</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; _IMSGTABLE&nbsp; 
              CLASS 'MCODE'&nbsp;&nbsp;&nbsp; PRELOAD DISCARDABLE 
              IOPL</FONT></FONT></TT> <BR><TT><FONT color=#ffff99><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; _IMSGDATA&nbsp;&nbsp; CLASS 
              'MCODE'&nbsp;&nbsp;&nbsp; PRELOAD DISCARDABLE 
              IOPL</FONT></FONT></TT> <BR><TT><FONT color=#ffff99><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; _ITEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
              CLASS 'ICODE'&nbsp;&nbsp;&nbsp; DISCARDABLE</FONT></FONT></TT> 
              <BR><TT><FONT color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _IDATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'ICODE'&nbsp;&nbsp;&nbsp; DISCARDABLE</FONT></FONT></TT> 
              <BR><TT><FONT color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _PTEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'PCODE'&nbsp;&nbsp;&nbsp; NONDISCARDABLE</FONT></FONT></TT> 
              <BR><TT><FONT color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _PMSGTABLE&nbsp; CLASS 'MCODE'&nbsp;&nbsp;&nbsp; NONDISCARDABLE 
              IOPL</FONT></FONT></TT> <BR><TT><FONT color=#ffff99><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; _PMSGDATA&nbsp;&nbsp; CLASS 
              'MCODE'&nbsp;&nbsp;&nbsp; NONDISCARDABLE IOPL</FONT></FONT></TT> 
              <BR><TT><FONT color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _PDATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'PDATA'&nbsp;&nbsp;&nbsp; NONDISCARDABLE SHARED</FONT></FONT></TT> 
              <BR><TT><FONT color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _STEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'SCODE'&nbsp;&nbsp;&nbsp; RESIDENT</FONT></FONT></TT> 
              <BR><TT><FONT color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _SDATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'SCODE'&nbsp;&nbsp;&nbsp; RESIDENT</FONT></FONT></TT> 
              <BR><TT><FONT color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _DBOSTART&nbsp;&nbsp; CLASS 'DBOCODE'&nbsp; PRELOAD NONDISCARDABLE 
              CONFORMING</FONT></FONT></TT> <BR><TT><FONT color=#ffff99><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; _DBOCODE&nbsp;&nbsp;&nbsp; CLASS 
              'DBOCODE'&nbsp; PRELOAD NONDISCARDABLE 
              CONFORMING</FONT></FONT></TT> <BR><TT><FONT color=#ffff99><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; _DBODATA&nbsp;&nbsp;&nbsp; CLASS 
              'DBOCODE'&nbsp; PRELOAD NONDISCARDABLE 
              CONFORMING</FONT></FONT></TT> <BR><TT><FONT color=#ffff99><FONT 
              size=-1>&nbsp;&nbsp;&nbsp; _16ICODE&nbsp;&nbsp;&nbsp; CLASS 
              '16ICODE'&nbsp; PRELOAD DISCARDABLE</FONT></FONT></TT> 
              <BR><TT><FONT color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; 
              _RCODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASS 
              'RCODE'</FONT></FONT></TT> <BR><TT><FONT color=#ffff99><FONT 
              size=-1>EXPORTS</FONT></FONT></TT> <BR><TT><FONT 
              color=#ffff99><FONT size=-1>&nbsp;&nbsp;&nbsp; FIRSTVXD_DDB&nbsp; 
              @1</FONT></FONT></TT></BLOCKQUOTE><FONT face=Arial,Helvetica><FONT 
            size=-1><FONT color=#ffffff>第一个声明定义了VxD的名称,一个VxD的名称</FONT><B><FONT 
            color=#ffff99>必须</FONT></B><FONT 
            color=#ffffff>是全部大写的,我曾经试过用小写,结果VxD除了把自己载入内存外什么也不干。</FONT></FONT></FONT> 
            <BR><FONT face=Arial,Helvetica><FONT size=-1><FONT 
            color=#ffffff>接下来是段的定义,段的定义包括三个部分:段的名称,段类和要求的段的运行属性。你可以看到很多段都基于相同的段类,例如,</FONT><B><FONT 
            color=#ffff99>_LPTEXT</FONT></B><FONT color=#ffffff>, 
            </FONT><B><FONT color=#ffff99>_LTEXT</FONT></B><FONT color=#ffffff>, 
            </FONT><B><FONT color=#ffff99>_LDATA</FONT></B><FONT 
            color=#ffffff>都是基于</FONT><B><FONT 
            color=#ffff99>LCODE</FONT></B><FONT 
            color=#ffffff>段类而且属性也完全一样。这样定义段有利于使代码更容易理解。如:</FONT><B><FONT 
            color=#ffff99>LCODE</FONT></B><FONT 
            color=#ffffff>可以包含代码和数据,对于一个程序员来说,如果他能把数据放到</FONT><B><FONT 
            color=#ffff99>_LDATA</FONT></B><FONT 

⌨️ 快捷键说明

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