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

📄 20000916013.htm

📁 C++Builder教学大全
💻 HTM
📖 第 1 页 / 共 3 页
字号:
        <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">&nbsp;&nbsp;&nbsp; </span>CloseHandle(h);//关闭或动态卸下VxD</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>switch(p-&gt;dioc_IOCtlCode){</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>case 命令码C:</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>用p指向的IOCTLPARAMS结构,与应用程序交换数据;</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>if (成功) return(0); /*使DeviceIoControl的返回值r为TRUE*/</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>else return(1);</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>default:</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>return(0);</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>}</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>到CreateFile,用o.hEvent=CreateEvent(0,TRUE,0,NULL)创建事件,再传o的地址到</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US>DeviceIoControl,然后用GetOverlappedResult(h,&amp;o,&amp;oc,TRUE)在o上睡眠。</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>此时,p-&gt;lpoOverlapped一定大于0,VxD可用VMM服务_LinPageLock,按页上锁p-&gt;dio</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US>c_InBuf指向的应用程序ibuf区,p-&gt;dioc_OutBuf指向的obuf区,p-&gt;lpoOverlapped指向的</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US>o结构。要交换数据时,可置数据及数据总量到p-&gt;dioc_OutBuf及p-&gt;lpoOverlapped-&gt;O_</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US>InternalHigh,然后调用VMM服务VWIN32_DIOCCompletionRoutine(p-&gt;lpoOverlapped-&gt;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">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>2. 被Real/V86模式下16位应用程序访问的接口</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>entry dd ?</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov ax,1684h ;功能号</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov bx,3180h ;接口ID</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>int 2fh ;取入口的段/偏移到es/di,成功时,di及es返回非零值</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov ax,es</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>or ax,di</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>jz L0</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov word ptr [entry],di</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov word ptr [entry+2],es</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov ah,码C</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>call [entry]</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>L0: 错误处理</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>if (p-&gt;CBRS.Client_AH==码C) p-&gt;CBRS.Client_AL=0;</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>3. 被保护模式下16位应用程序访问的接口</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>_asm{</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov ax,1684h</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov bx,3180h</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>int 2fh ;取入口的选择符/偏移到es/di,成功时,di及es返回非零值</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov ax,es</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>or ax,di</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>jz L0</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov word ptr [entry],di</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov word ptr [entry+2],es</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>mov ah,码C</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>call [entry]</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>}</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>对PM_API_Entry的处理如第2条。</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>4. 被DPMI的实模式/V86模式下16位应用程序访问的接口</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>str db ‘my',0 ;VxD的唯一标识串</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:

yes">&nbsp;&nbsp;&nbsp; </span>entry dd ?</span></p>

⌨️ 快捷键说明

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