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

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

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 4 页
字号:
            color=#ffffff>段里,把代码放到</FONT><B><FONT 
            color=#ffff99>_LTEXT</FONT></B><FONT color=#ffffff> 
            段里,就会显得很容易理解。最后,这两个段都会被编译到最后的可执行程序的同一个段内。</FONT></FONT></FONT> 
            <BR><FONT face=Arial,Helvetica><FONT size=-1><FONT 
            color=#ffffff>一个VxD程序导出且仅导出一个标记:它的设备描述块(DDB)。DDB实际上是一个结构,它包含了VMM需要知道的所有的VxD信息。你</FONT><B><FONT 
            color=#ffff99>必须</FONT></B><FONT 
            color=#ffffff>在模块定义文件中导出DDB。</FONT></FONT></FONT> <BR><FONT 
            face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1>在大多数时候,你可以把上面的.DEF文件用到你的新建的VxD项目中去。你只要把.DEF文件里第一行和最后一行的VxD名字改掉就可以了。在一个汇编的VxD项目中,段的定义是不必要的,段的定义主要用于C的VxD项目编写,但用在汇编里也是可以的。你会得到一大堆警告的信息但是它能汇编成功。你也可以删掉你在你的项目里没有用到的段定义从而去掉这些讨厌的警告信息。</FONT></FONT></FONT> 
            <BR><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1>vmm.inc包含了许多用于定义你的源文件中的段的宏:</FONT></FONT></FONT> <BR>&nbsp; 
            <CENTER>
            <TABLE border=1 width="45%">
              <TBODY>
              <TR>
                <TD>_<B><FONT face=Arial,Helvetica><FONT 
                  size=-1>LTEXT</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_LOCKED_CODE_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_PTEXT</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_PAGEABLE_CODE_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_DBOCODE</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_DEBUG_ONLY_CODE_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_ITEXT</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_INIT_CODE_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_LDATA</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_LOCKED_DATA_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_IDATA</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_IDATA_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_PDATA</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_PAGEABLE_DATA_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_STEXT</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_STATIC_CODE_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_SDATA</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_STATIC_DATA_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_DBODATA</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_DEBUG_ONLY_DATA_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_16ICODE</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_16BIT_INIT_SEG</FONT></FONT></B></TD></TR>
              <TR>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>_RCODE</FONT></FONT></B></TD>
                <TD><B><FONT face=Arial,Helvetica><FONT 
                  size=-1>VxD_REAL_INIT_SEG</FONT></FONT></B></TD></TR></TBODY></TABLE></CENTER>
            <P><FONT face=Arial,Helvetica><FONT size=-1><FONT 
            color=#ffffff>每个宏都有它相对应的结束宏,例如,如果你要在你的源文件中定义一个</FONT><B><FONT 
            color=#ffff99>_LTEXT</FONT></B><FONT 
            color=#ffffff>段,你应该这样写:</FONT></FONT></FONT> 
            <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
              color=#66ff99><FONT 
              size=-1>VxD_LOCKED_CODE_SEG</FONT></FONT></FONT></B> 
              <P><B><FONT face=Arial,Helvetica><FONT 
              size=-1>(把你的代码写在这里)</FONT></FONT></B> 
              <P><B><FONT face=Arial,Helvetica><FONT color=#66ff99><FONT 
              size=-1>VxD_LOCKED_CODE_ENDS</FONT></FONT></FONT></B></P></BLOCKQUOTE>
            <H3><FONT face=Arial,Helvetica><FONT color=#66ffff><FONT 
            size=+0>VxD结构</FONT></FONT></FONT></H3><FONT 
            face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1>现在你了解了LE文件里的段,我们可以继续来看一下源文件。你会发现VxD程序有一个特点,那就是它用了很多的宏。你可以看到在VxD中宏几乎无处不在,这都成为一个习惯了。这些宏用来隐藏一些底层的细节,也增加了源程序的可移植性。如果你有兴趣,你可以看一看像vmm.inc这一类的库文件中的这些宏的定义。</FONT></FONT></FONT> 
            <BR><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1>下面是VxD源文件结构:</FONT></FONT></FONT> <BR>&nbsp; 
            <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
              color=#66ff99><FONT size=-1>.386p</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#66ff99><FONT 
              size=-1>include vmm.inc</FONT></FONT></FONT></B> 
              <P><B><FONT face=Arial,Helvetica><FONT color=#66ff99><FONT 
              size=-1>DECLARE_VIRTUAL_DEVICE FIRSTVXD,1,0, FIRSTVXD_Control, 
              UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER</FONT></FONT></FONT></B> 

              <P><B><FONT face=Arial,Helvetica><FONT color=#66ff99><FONT 
              size=-1>Begin_control_dispatch FIRSTVXD</FONT></FONT></FONT></B> 
              <BR><B><FONT face=Arial,Helvetica><FONT color=#66ff99><FONT 
              size=-1>End_control_dispatch FIRSTVXD</FONT></FONT></FONT></B> 
              <P><B><FONT face=Arial,Helvetica><FONT color=#66ff99><FONT 
              size=-1>end</FONT></FONT></FONT></B></P></BLOCKQUOTE>
            <P><BR><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1>这段源程序给人的第一印象就是:它并不像一个汇编源程序。那是因为它用了很多宏。让我们来分析一下源程序以便你能很快理解它。</FONT></FONT></FONT> 

            <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
              color=#ffcc33><FONT 
            size=-1>.386p</FONT></FONT></FONT></B></BLOCKQUOTE><FONT 
            face=Arial,Helvetica><FONT size=-1><FONT 
            color=#ffffff>告诉编译器我们要使用包括CPU特权指令的80386指令系统。你也可以使用</FONT><B><FONT 
            color=#ffcc33>.486p</FONT></B><FONT color=#ffffff>或者</FONT><B><FONT 
            color=#ffcc33>.586p</FONT></B><FONT 
            color=#ffffff>.</FONT></FONT></FONT> 
            <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
              color=#ffcc33><FONT size=-1>include 
              vmm.inc</FONT></FONT></FONT></B></BLOCKQUOTE><FONT 
            face=Arial,Helvetica><FONT color=#ffffff><FONT 
            size=-1>你的每个VxD源程序都必须包含imm.inc,因为它包含了你在源程序里所要用到的宏的定义。你还可以根据需要包含其他的库文件。</FONT></FONT></FONT> 

            <BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
              color=#ffcc33><FONT size=-1>DECLARE_VIRTUAL_DEVICE FIRSTVXD,1,0, 
              FIRSTVXD_Control, UNDEFINED_DEVICE_ID, 
              UNDEFINED_INIT_ORDER</FONT></FONT></FONT></B></BLOCKQUOTE><FONT 
            face=Arial,Helvetica><FONT size=-1><FONT 
            color=#ffffff>正如我们刚才说的,VMM通过VxD程序的</FONT><B><FONT 
            color=#ffff99>设备描述块(DDB)</FONT></B><FONT 
            color=#ffffff>来获取它所需要知道的关于VxD的所有信息。一个设备描述块是一个结构,它包含了许多关于VxD的重要信息,比如VxD的名字,它的设备ID,它的VxD服务函数入口(如果有的话),等等。你可以在imm.inc里查一查这个结构,它被定义为</FONT><B><FONT 
            color=#ffff99>VxD_Desc_Block</FONT></B><FONT 
            color=#ffffff>。你必须在</FONT><B><FONT 
            color=#ffff99>.DEF</FONT></B><FONT color=#ffffff> 
            文件里导出这个结构。这个结构有22个数据,但是你只用填写其中的几个。然后vmm.inc包含的一个宏会为你初始化并填写这些数据。这个宏叫做</FONT><B><FONT 
            color=#ffff99>DECLARE_VIRTUAL_DEVICE</FONT></B><FONT 
            color=#ffffff>。它的格式如下:</FONT></FONT></FONT> 
            <P><B><FONT face=Arial,Helvetica><FONT size=-1><FONT 
            color=#66ff99>Declare_Virtual_Device&nbsp;&nbsp;</FONT><FONT 
            color=#ffcc33> Name, MajorVer, MinorVer, CtrlProc, DeviceID, 
            InitOrder, V86Proc, PMProc, RefData</FONT></FONT></FONT></B> 
            <P><FONT face=Arial,Helvetica><FONT size=-1><FONT 
            color=#ffffff>你可以看到:VxD源程序中的标号是不区分大小写的,你可以用大写,小写或者混合起来用都可以。让我们来看一下</FONT><B><FONT 
            color=#ffff99>Declare_virtual_device</FONT></B><FONT 
            color=#ffffff>里的每一个参数。</FONT></FONT></FONT> 
            <UL>
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#66ff99>Name</FONT></B><FONT color=#ffffff>&nbsp; VxD的名字 
              最多8个字符。它</FONT><B><FONT color=#ffff99>必须</FONT></B><FONT 
              color=#ffffff>是大写!在系统中的所有VxD程序里,它们的名字不能重复,每个VxD的名字应该是唯一的。这个宏同时也会根据这个名字产生DDB的名字,产生的办法就是:在这个名字的后面加上</FONT><B><FONT 
              color=#ffff99>_DDB</FONT></B><FONT 
              color=#ffffff>。所以如果你的VxD的名字是</FONT><B><FONT 
              color=#ffff99>FIRSTVXD</FONT></B><FONT color=#ffffff>, 
              </FONT><B><FONT 
              color=#ffff99>Declare_Virtual_Device</FONT></B><FONT 
              color=#ffffff>这个宏就会把DDB的名字定为</FONT><B><FONT 
              color=#ffff99>FIRSTVXD_DDB</FONT></B><FONT 
              color=#ffffff>。记住,你还要在.DEF文件里导出DDB。所以你必须使DDB的名字和.DEF文件定义中的相同。</FONT></FONT></FONT> 

              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#66ff99>MajorVer</FONT></B><FONT color=#ffffff> 和 
              </FONT><B><FONT color=#66ff99>MinorVer</FONT></B><FONT 
              color=#ffffff> 你的VxD的主要的和次要的版本。</FONT></FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#66ff99>CtrlProc</FONT></B><FONT color=#ffffff> 
              你的VxD程序的</FONT><B><FONT color=#ffff99>设备控制函数</FONT></B><FONT 
              color=#ffffff>的名字。设备控制函数是一个接受和处理VxD程序的控制消息的函数。你可以把设备控制函数看作Window函数的等价物。既然我们要用</FONT><B><FONT 
              color=#ffff99>Begin_Control_Dispatch</FONT></B><FONT 
              color=#ffffff>这个宏来生成我们的设备控制函数,那么我们应该使用一个标准格式的名字,那就是</FONT><B><FONT 
              color=#99ff99>VxD的名字</FONT><FONT 
              color=#ffff99>_Control</FONT></B><FONT color=#ffffff>。 
              </FONT><B><FONT 
              color=#ffff99>Begin_Control_Dispatch</FONT></B><FONT 
              color=#ffffff>这个宏把</FONT><B><FONT 
              color=#ffff99>_Control</FONT></B><FONT color=#ffffff> 
              加到它后面的那个名字上(而我们又通常把VxD的名字写在它后面)作为设备控制函数的名字,所以我们就应该把VxD的名字加上</FONT><B><FONT 
              color=#ffff99>_Control</FONT></B><FONT 
              color=#ffffff>作为</FONT><B><FONT 
              color=#66ff99>CtrlProc</FONT></B><FONT color=#ffffff> 
              参数的值。</FONT></FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#66ff99>DeviceID </FONT></B><FONT 
              color=#ffffff>你的VxD程序的16位唯一标识符 
              当且仅当你的VxD程序需要处理以下情况时你需要用到这个ID:</FONT></FONT></FONT> 
              <UL>
                <LI><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
                size=-1>你的VxD程序导出一些供其他VxD程序使用的VxD服务。因为20H中断接口用设备ID来定位/区分VxD程序,所以一个唯一的ID对你的VxD程序是必要的。</FONT></FONT></FONT> 

                <LI><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
                size=-1>Your VxD 
                你的VxD程序要在初始化中断2FH,1607H时通知实模式程序它的存在。</FONT></FONT></FONT> 
                <LI><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT 
                size=-1>Some 
                一些实模式软件(TSR)要用中断2FH,1605H来加载你的VxD程序。</FONT></FONT></FONT> 
              </LI></UL><FONT face=Arial,Helvetica><FONT size=-1><FONT 
              color=#ffffff>如果你的VxD程序不需要一个唯一的设备ID,你可以把这一项设为</FONT><B><FONT 
              color=#ffff99>UNDEFINED_DEVICE_ID </FONT></B><FONT 
              color=#ffffff>,如果你需要它,你可以去Microsoft要一个。</FONT></FONT></FONT> 
              <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
              color=#66ff99>InitOrder</FONT></B><FONT color=#ffffff> 
              初始化的顺序,简单的说,就是加载的顺序。VMM就按照这个次序来加载VxD程序。每个VxD程序都有一个加载次序号,例如:</FONT></FONT></FONT> 

⌨️ 快捷键说明

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