?? csdn_文檔中心_虛擬設備驅動程序結構(vxd教程3).htm
字號:
</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><BR></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0
width=770>
<TBODY>
<TR bgColor=#006699>
<TD align=middle bgColor=#006699 id=white><FONT
color=#ffffff>對該文的評論</FONT></TD>
<TD align=middle>
<SCRIPT src="CSDN_文檔中心_虛擬設備驅動程序結構(Vxd教程3).files/readnum.htm"></SCRIPT>
</TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TH bgColor=#006699 id=white><FONT
color=#ffffff>我要評論</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
<TBODY>
<TR>
<TD>你沒有登陸,無法發表評論。 請先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=552">登陸</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注冊</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
<TBODY>
<TR align=middle>
<TD height=10 vAlign=bottom><A
href="http://www.csdn.net/intro/intro.asp?id=2">網站簡介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">廣告服務</A> - <A
href="http://www.csdn.net/map/map.shtm">網站地圖</A> - <A
href="http://www.csdn.net/help/help.asp">幫助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">聯系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
border=0 height=48 src="CSDN_文檔中心_虛擬設備驅動程序結構(Vxd教程3).files/biaoshi.gif"
width=40></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百聯美達美公司 版權所有 京ICP證020026號</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--內容結束//--><!--結束//--></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -