📄 20000916013.htm
字号:
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>mov ax,168Ah ;功能号</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>lea si,str ;要求ds/si值是str的段值/偏移值</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>int 2Fh ;取入口的段/偏移到es/di,成功时,al返回0</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>cmp al,0</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>jne L0</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>mov word ptr [entry],di</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>mov word ptr [entry+2],es</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>...</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>call [entry]</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>对handler的处理如第二条。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>5. 被DPMI的保护模式下16位应用程序访问的接口</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>与第4条类似,但选Protected Mode标签,即可生成My_ProtVendorEntry::handler入</span></p>
<p class=MsoPlainText align="left">口<span lang=EN-US>,访问它的程序是:</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>int PASCAL WinMain(HANDLE h1,HANDLE h0,LPSTR lpCmdLine,int
nCmdShow){</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>char *id="my";</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>FARPROC entry;</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>_asm{</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>mov ax,168Ah</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>mov si,id</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>int 2Fh ;取入口的选择符/偏移到es/di</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>cmp al,0</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun: yes">
</span><span style="mso-spacerun: yes"> </span>...</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>}</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>}</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>对handler的处理如第2条。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>6. 可被其他VxD访问的接口</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>若your.VxD欲调my.VxD的做两数相减的minus接口,需在my.VxD的VxD service页上输</span></p>
<p class=MsoPlainText align="left">入原型</p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>DWORD _cdecl minus(DWORD i,DWORD j),再在MyDevice::minus中,写return(i-j);</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>your.mak中,需处理中间文件wrap.cpp:</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>OBJECTS=your.OBJ wrap.obj</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>...</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>wrap.OBJ:wrap.cpp my.h</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>wrap.cpp中,对带参数的VxD服务,需用VMM宏指令VxDJmp转入,各参数进入wrap时,已</span></p>
<p class=MsoPlainText align="left">按<span lang=EN-US>C的调用约定入栈;对不带参数VxD服务,可调用VMM宏指令VxDCall(接口名):</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>#include "my.h"</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>DWORD _cdecl MyDevice::minus(DWORD i,DWORD j){</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>VxDJmp(minus);</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>}</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>your.cpp的某一函数f,可用VMM服务Get_DDB,查my.VxD是否已装入,若未装入,则用V</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>xDLDR服务VxDLDR_LoadDevice将其装入:</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>#define DEVICE_MAIN</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>#include "your.h"</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>Declare_Virtual_Device(YOUR)</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>#undef DEVICE_MAIN</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>#include "my.h" //此行需在DEVICE_MAIN外</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>VOID f(){</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>PDEVICEINFO pinfo;</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>PDDB pddb;</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>DWORD r;</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>pddb=Get_DDB(0,"MY</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>"); //用空格补全长度小于8的VxD名</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>if (pddb==0) {//未装入</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>r=VxDLDR_LoadDevice("my.VxD",</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>VxDLDR_INIT_DEVICE,&pinfo,&pddb);</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>if (r!=0) //VxDLDR_LoadDevice未能成功装入my.VxD</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>return;</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>}</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>MyDevice::minus(值1,值2);</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>}</span></p>
</td>
</tr>
</table>
</div>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -