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

📄 vxd-c3.htm

📁 汇编语言编写的虚拟驱动程序
💻 HTM
📖 第 1 页 / 共 3 页
字号:
  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> </LI></UL>
<UL>
  <UL><B><TT><FONT color=#ffffff><FONT 
    size=-1>VMM_INIT_ORDER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EQU 
    000000000H</FONT></FONT></TT></B> <BR><B><TT><FONT color=#ffffff><FONT 
    size=-1>DEBUG_INIT_ORDER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EQU 
    000000000H</FONT></FONT></TT></B> <BR><B><TT><FONT color=#ffffff><FONT 
    size=-1>DEBUGCMD_INIT_ORDER&nbsp;&nbsp; EQU 
    000000000H</FONT></FONT></TT></B> <BR><B><TT><FONT color=#ffffff><FONT 
    size=-1>PERF_INIT_ORDER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EQU 
    000900000H</FONT></FONT></TT></B> <BR><B><TT><FONT color=#ffffff><FONT 
    size=-1>APM_INIT_ORDER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EQU 
    001000000H</FONT></FONT></TT></B></UL>
  <P><BR><FONT face=Arial,Helvetica><FONT size=-1><FONT color=#ffffff>你可以看到:</FONT><B><FONT color=#ffff99>VMM</FONT></B><FONT color=#ffffff>, 
  </FONT><B><FONT color=#ffff99>DEBUG</FONT></B><FONT color=#ffffff>和
  </FONT><B><FONT color=#ffff99>DEBUGCMD</FONT></B><FONT color=#ffffff>是首先加载的VxD程序,然后是</FONT><B><FONT 
  color=#ffff99>PERF</FONT></B><FONT color=#ffffff>和</FONT><B><FONT 
  color=#ffff99>APM</FONT></B><FONT color=#ffffff>。初始化顺序值越低的VxD程序越先被加载。如果你的VxD程序在初始化时需要用到其他VxD程序提供的服务,那么你必须把初始化顺序的值设得比你所要调用的那个VxD程序的大,这样,当你的VxD程序加载时,你所要的VxD就已经在内存中为你准备好了。如果不想去管你的VxD的初始化顺序,就把这个参数填写为</FONT><B><FONT 
  color=#ffff99>UNDEFINED_INIT_ORDER </FONT></B><FONT color=#ffffff>。</FONT></FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
  color=#ffff99>V86Proc</FONT></B><FONT color=#ffffff>和</FONT><B><FONT 
  color=#ffff99>PMProc</FONT></B><FONT color=#ffffff>  你的程序可以导出供V86和保护模式程序使用的API,这两个参数就是用来填写这些API的地址。记住,VxD程序除了监控系统虚拟机外,还要监控一个或多个运行在DOS或者保护模式下的虚拟机程序。理所当然的,VxD程序要为DOS和保护模式程序提供API支持。如果你不导出这些API,你可以不填这两个参数。</FONT></FONT></FONT> 
  <LI><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
  color=#66ff99>RefData</FONT></B><FONT color=#ffffff>  
  </FONT><B><FONT color=#ffff99>输入输出监视器(IOS)</FONT></B><FONT 
  color=#ffffff>要用到的参考数据。只有一种情况下你要用到这个参数:当你在为IOS编写一个层驱动程序时。否则,你可以不填这个参数。</FONT></FONT></FONT> </LI></UL><FONT 
face=Arial,Helvetica><FONT size=-1><FONT color=#ffffff>接下来是
</FONT><B><FONT color=#ffff99>Begin_Control_Dispatch</FONT></B><FONT 
color=#ffffff>宏。</FONT></FONT></FONT> 
<BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT size=-1><FONT 
  color=#ffcc33>Begin_control_dispatch</FONT><FONT color=#66ff99> 
  FIRSTVXD</FONT></FONT></FONT></B> <BR><B><FONT face=Arial,Helvetica><FONT 
  size=-1><FONT color=#ffcc33>End_control_dispatch </FONT><FONT 
  color=#66ff99>FIRSTVXD</FONT></FONT></FONT></B></BLOCKQUOTE><FONT 
face=Arial,Helvetica><FONT size=-1><FONT color=#ffffff>这两个宏定义了设备控制函数,当VxD的控制消息发生时,VMM就调用这个函数。你必须填写设备控制函数名字的前半部分,在本例中,我们用的是
</FONT><B><FONT color=#66ff99>FIRSTVXD</FONT></B><FONT color=#ffffff>。这个宏会在你输入的前半部分后加上</FONT><B><FONT color=#ffff99>_Control</FONT></B><FONT 
color=#ffffff>作为设备控制函数的名字。这个名字一定要和你在</FONT><B><FONT 
color=#ffff99>Declare_virtual_device</FONT></B><FONT color=#ffffff> 
宏中给参数</FONT><B><FONT color=#66ff99>CtrlProc</FONT></B><FONT color=#ffffff>填的名字一致。设备控制函数总是放在锁定段(</FONT><B><FONT 
color=#ffff99>VxD_LOCKED_CODE_SEG</FONT></B><FONT color=#ffffff>)内的。上面定义的设备控制函数什么也不干。你需要说明你的VxD程序要响应什么控制消息,以及处理这个消息的函数,你可以用</FONT><B><FONT color=#ffff99>Control_Dispatch</FONT></B><FONT 
color=#ffffff>宏来实现这一点。</FONT></FONT></FONT> 
<BLOCKQUOTE><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
  color=#ffff99>Control_Dispatch </FONT></B><I><FONT color=#66ffff>message, 
  function</FONT></I></FONT></FONT></BLOCKQUOTE><FONT face=Arial,Helvetica><FONT 
size=-1><FONT color=#ffffff>例如,如果你的VxD程序只要处理</FONT><B><FONT color=#ffff99>Device_Init </FONT></B><FONT 
color=#ffffff>消息,你的设备控制程序要这样写:</FONT></FONT></FONT> 
<BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT size=-1><FONT 
  color=#ffcc33>Begin_Control_Dispatch</FONT><FONT 
  color=#ffffff>&nbsp;</FONT><FONT color=#66ff99> 
  FIRSTVXD</FONT></FONT></FONT></B> <BR><B><FONT face=Arial,Helvetica><FONT 
  size=-1><FONT color=#ffffff>&nbsp; </FONT><FONT 
  color=#ffcc33>Control_Dispatch</FONT><FONT color=#ffffff>&nbsp; Device_Init, 
  OnDeviceInit</FONT></FONT></FONT></B> <BR><B><FONT face=Arial,Helvetica><FONT 
  size=-1><FONT color=#ffcc33>End_Control_Dispatch</FONT><FONT 
  color=#66ff99>FIRSTVXD</FONT></FONT></FONT></B></BLOCKQUOTE><FONT 
face=Arial,Helvetica><FONT size=-1><B><FONT 
color=#ffff99>OnDeviceInit</FONT></B><FONT color=#ffffff>就是要处理</FONT><B><FONT 
color=#ffff99>Device_Init</FONT></B><FONT color=#ffffff>消息的函数的名字。你可以给你的函数取任何你想取的名字。</FONT></FONT></FONT> <BR><FONT 
face=Arial,Helvetica><FONT size=-1><FONT color=#ffffff>你可以用</FONT><B><FONT color=#ffff99>end</FONT></B><FONT color=#ffffff> 
直接地结束你的VxD源程序。</FONT></FONT></FONT> <BR><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><B><FONT 
color=#ffff99>Begin_Control_Dispatch</FONT></B><FONT color=#ffffff>宏来定义一个设备控制程序。你必须在.def文件中的</FONT><B><FONT color=#ffff99>EXPORTS</FONT></B><FONT color=#ffffff>下面填写设备控制块的名字,从而导出该设备控制块。</FONT></FONT></FONT> 
<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>编译的过程和编译普通的win32程序一样。先调用ml.exe编译asm源文件,然后用link.exe来连接object文件。不同的地方是ml.exe和link.exe后所带的命令行参数不同。</FONT></FONT></FONT> 
<P><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
color=#66ffff>&nbsp;ml</FONT></B><FONT color=#ffffff> -</FONT><B><FONT 
color=#ffff99>coff -c -Cx -DMASM6 -DBLD_COFF -DIS_32&nbsp; </FONT><FONT 
color=#66ff99>firstvxd.asm</FONT></B></FONT></FONT> 
<P><FONT face=Arial,Helvetica><FONT size=-1><B><FONT 
color=#ffff99>-coff&nbsp;</FONT></B><FONT color=#ffffff> 表明COFF数据格式</FONT></FONT></FONT> <BR><FONT face=Arial,Helvetica><FONT 
size=-1><B><FONT color=#ffff99>-c&nbsp;</FONT></B><FONT color=#ffffff>&nbsp; 
只汇编,不调用连接程序来连接,这样我们就可以在调用link.exe的时候使用跟多的参数。</FONT></FONT></FONT> <BR><FONT 
face=Arial,Helvetica><FONT size=-1><B><FONT color=#ffff99>-Cx</FONT></B><FONT 
color=#ffffff>&nbsp; 保存公共,外部标记。</FONT></FONT></FONT> <BR><FONT face=Arial,Helvetica><FONT 
size=-1><B><FONT color=#ffff99>-D&lt;text&gt;</FONT></B><FONT color=#ffffff> 
定义一个文本宏,例如,-DBLD_COFF定义了一个文本宏BLD_COFF,这个宏用来作为编译的条件。如果你有兴趣,你可以在库文件中查找BLD_COFF,自己亲眼看看它对汇编过程起什么作用。上面的命令行定义了三个文本宏:BLD_COFF,IS_32和MASM6。如果你对C编程熟悉的话,你会知道这些定义相当于完成以下功能:</FONT></FONT></FONT> 
<BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT color=#66ff99><FONT 
  size=-1>#define BLD_COFF </FONT></FONT></FONT></B> <BR><B><FONT 
  face=Arial,Helvetica><FONT color=#66ff99><FONT size=-1>#define 
  IS_32</FONT></FONT></FONT></B> <BR><B><FONT face=Arial,Helvetica><FONT 
  color=#66ff99><FONT size=-1>#define 
MASM6</FONT></FONT></FONT></B></BLOCKQUOTE><B><FONT face=Arial,Helvetica><FONT 
size=-1><FONT color=#66ffff>link </FONT><FONT color=#ffff99>-vxd 
-def:firstvxd.def&nbsp; </FONT><FONT 
color=#66ff99>firstvxd.obj</FONT></FONT></FONT></B> 
<P><FONT face=Arial,Helvetica><FONT size=-1><B><FONT color=#ffff99>-vxd 
</FONT></B><FONT color=#ffffff>表明我们要根据obj文件来生成一个VxD文件。</FONT></FONT></FONT> <BR><FONT face=Arial,Helvetica><FONT 
size=-1><B><FONT color=#ffff99>-def:&lt;.DEF file&gt;</FONT></B><FONT 
color=#ffffff> 指定该VxD文件的模式定义文件。</FONT></FONT></FONT> 
<P><FONT face=Arial,Helvetica><FONT color=#ffffff><FONT size=-1>我觉得用makefile很方便,如果你不喜欢用makefile,你也可以创建批处理文件来自动完成编译过程。我的makefile如下:</FONT></FONT></FONT> 
<P><B><FONT face=Arial,Helvetica><FONT color=#ffcc33><FONT 
size=-1>NAME=firstvxd</FONT></FONT></FONT></B> 
<P><B><FONT face=Arial,Helvetica><FONT color=#ffcc33><FONT 
size=-1>$(NAME).vxd:$(NAME).obj</FONT></FONT></FONT></B> <BR><B><FONT 
face=Arial,Helvetica><FONT color=#ffcc33><FONT 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; link -vxd -def:$(NAME).def 
$(NAME).obj</FONT></FONT></FONT></B> 
<P><B><FONT face=Arial,Helvetica><FONT color=#ffcc33><FONT 
size=-1>$(NAME).obj:$(NAME).asm</FONT></FONT></FONT></B> <BR><B><FONT 
face=Arial,Helvetica><FONT color=#ffcc33><FONT 
size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ml -coff -c -Cx&nbsp; -DMASM6 
-DBLD_COFF -DIS_32 $(NAME).asm</FONT></FONT></FONT></B> <BR>
<hr size="1">
<div align="center"> 
  <script language="JavaScript1.1" src=http://ad.t2t2.com/textclick.asp?user=bigluo&style=4&bkcolor=no></script>
  <br>
</div>
<!-- 10:1 文本广告交换 --> 
<div align="center"> 
  <script language="JavaScript1.1" src=http://coolsite21.com:90/c21.dll?Type=PT&id=1047&col=6&ReferID=1047&v=0></script>
  <!-- 10:1 文本广告交换 --> </div>
<hr size="1">
<br>
<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>
<CENTER></CENTER></BODY></HTML>

⌨️ 快捷键说明

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