📄 vxd-c3.htm
字号:
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 EQU
000000000H</FONT></FONT></TT></B> <BR><B><TT><FONT color=#ffffff><FONT
size=-1>DEBUG_INIT_ORDER EQU
000000000H</FONT></FONT></TT></B> <BR><B><TT><FONT color=#ffffff><FONT
size=-1>DEBUGCMD_INIT_ORDER EQU
000000000H</FONT></FONT></TT></B> <BR><B><TT><FONT color=#ffffff><FONT
size=-1>PERF_INIT_ORDER EQU
000900000H</FONT></FONT></TT></B> <BR><B><TT><FONT color=#ffffff><FONT
size=-1>APM_INIT_ORDER 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> </FONT><FONT color=#66ff99>
FIRSTVXD</FONT></FONT></FONT></B> <BR><B><FONT face=Arial,Helvetica><FONT
size=-1><FONT color=#ffffff> </FONT><FONT
color=#ffcc33>Control_Dispatch</FONT><FONT color=#ffffff> 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> ml</FONT></B><FONT color=#ffffff> -</FONT><B><FONT
color=#ffff99>coff -c -Cx -DMASM6 -DBLD_COFF -DIS_32 </FONT><FONT
color=#66ff99>firstvxd.asm</FONT></B></FONT></FONT>
<P><FONT face=Arial,Helvetica><FONT size=-1><B><FONT
color=#ffff99>-coff </FONT></B><FONT color=#ffffff> 表明COFF数据格式</FONT></FONT></FONT> <BR><FONT face=Arial,Helvetica><FONT
size=-1><B><FONT color=#ffff99>-c </FONT></B><FONT color=#ffffff>
只汇编,不调用连接程序来连接,这样我们就可以在调用link.exe的时候使用跟多的参数。</FONT></FONT></FONT> <BR><FONT
face=Arial,Helvetica><FONT size=-1><B><FONT color=#ffff99>-Cx</FONT></B><FONT
color=#ffffff> 保存公共,外部标记。</FONT></FONT></FONT> <BR><FONT face=Arial,Helvetica><FONT
size=-1><B><FONT color=#ffff99>-D<text></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 </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:<.DEF file></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> 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> ml -coff -c -Cx -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 + -