📄 20000916013.htm
字号:
<p class=MsoPlainText align="left"><span lang=EN-US>f从VxD取数据,VxD传回的数据总量放在oc中*/</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>CloseHandle(h);//关闭或动态卸下VxD</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>my.VxD应在Windows 95 control messages页上选W32_DEVICEIOCONTROL事件,在DWO</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>RD MyDevice::OnW32DeviceIoControl(PIOCTLPARAMS
p)事件过程中写:</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>switch(p->dioc_IOCtlCode){</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>case 命令码C:</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>用p指向的IOCTLPARAMS结构,与应用程序交换数据;</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>if (成功) return(0); /*使DeviceIoControl的返回值r为TRUE*/</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>else return(1);</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>default:</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>return(0);</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>以上做法要求VxD立即交换数据(同步通讯),值FILE_FLAG_DELETE_ON_CLOSE指明Clo</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>seHandle将不在内存中保留引用记数为0的VxD。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>VxD也可延迟交换数据,此时,应用程序先传值FILE_FLAG_DELETE_ON_CLOSE|FILE_FL</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>AG_OVERLAPPED</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>到CreateFile,用o.hEvent=CreateEvent(0,TRUE,0,NULL)创建事件,再传o的地址到</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>DeviceIoControl,然后用GetOverlappedResult(h,&o,&oc,TRUE)在o上睡眠。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>此时,p->lpoOverlapped一定大于0,VxD可用VMM服务_LinPageLock,按页上锁p->dio</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>c_InBuf指向的应用程序ibuf区,p->dioc_OutBuf指向的obuf区,p->lpoOverlapped指向的</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>o结构。要交换数据时,可置数据及数据总量到p->dioc_OutBuf及p->lpoOverlapped->O_</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>InternalHigh,然后调用VMM服务VWIN32_DIOCCompletionRoutine(p->lpoOverlapped->O</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>_Internal)唤醒应用程序。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>VMM动态装卸VxD时,以命令码0及-1发送W32_DEVICEIOCONTROL消息给VxD,故Vireo公</span></p>
<p class=MsoPlainText align="left">司建议命令码<span lang=EN-US>C取[2048,4095]。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>2. 被Real/V86模式下16位应用程序访问的接口</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>my.VxD先要指定接口ID(如3180h),再在API页上选Standard Application
Entry Po</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>ints框中的Real/V86 Mode标签,即可生成MyDevice::V86_API_Entry入口,访问它的汇编</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>entry dd ?</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>mov ax,1684h ;功能号</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>mov bx,3180h ;接口ID</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>int 2fh ;取入口的段/偏移到es/di,成功时,di及es返回非零值</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>mov ax,es</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>or ax,di</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>jz 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>mov ah,码C</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>L0: 错误处理</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>MyDevice::V86_API_Entry(VMHANDLE hVM,CLIENT_STRUCT*
p)入口可以是:</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>if (p->CBRS.Client_AH==码C) p->CBRS.Client_AL=0;</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>3. 被保护模式下16位应用程序访问的接口</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>与第2条类似,但选Protected Mode标签,即可生成MyDevice::PM_API_Entry入口,访</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){FAR</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>PROC entry; //32位</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,1684h</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>mov bx,3180h</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>int 2fh ;取入口的选择符/偏移到es/di,成功时,di及es返回非零值</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>mov ax,es</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>or ax,di</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>jz 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>mov ah,码C</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>}</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>对PM_API_Entry的处理如第2条。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>4. 被DPMI的实模式/V86模式下16位应用程序访问的接口</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>与第2条类似,但在API页上选Vendor Specific Application Entry
Points中的Rea</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>l/V86 Mode标签,然后在Vendor
ID String中输入唯一标识串my,即可生成My_V86Vendor</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>Entry::handler入口,访问它的程序是:</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>str db ‘my',0 ;VxD的唯一标识串</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>entry dd ?</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -