📄 20000916013.htm
字号:
<HTML>
<HEAD>
<TITLE>C++语言的VxD与外界通信的所有接口</TITLE>
<META content="MSHTML 5.00.2314.1000" name=GENERATOR>
</HEAD>
<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0
vLink=#990099>
<div align="center">
<table width="744" border="0" cellspacing="0" cellpadding="0" height="76">
<tr>
<td>
<p class=MsoPlainText align="center"><font size="3"><span lang=EN-US>
<b><br>
C++语言的VxD与外界通信的所有接口</b></span></font></p>
<p class=MsoPlainText><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</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>从多任务操作系统Windows 3.1起,计算机中的任一物理设备x可同时被基于Dos或Wi</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>ndows的多个进程使用,这种一对多的关系称为"设备虚拟化",各进程通过运行在核心层的</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>VxD(虚拟x设备驱动程序)存取物理设备x。操作系统提供给用户的软件服务也可以用VxD</span></p>
<p class=MsoPlainText align="left">实现。计算机中的其他资源<span lang=EN-US>,如CPU、内存等也可同时被多个进程使用,各进程在系统提供</span></p>
<p class=MsoPlainText align="left">的虚拟机<span lang=EN-US>(VM)环境下存取这类资源。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>VxD可由虚拟机管理器(VMM)在开机时装入核心层(称静态装入,即置VxD于c:\window</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>s\system目录下,在c:\windows\system.ini文件中,对节[386Enh]加一行"device=此VxD</span></p>
<p class=MsoPlainText align="left">文件名<span lang=EN-US>"),或由应用程序实时装入(称动态装入),而后,各进程便可存取锁定在内存中的V</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>xD数据区,以实时控制VxD的行为,VxD的内部结构可防止两个进程同时存取其数据区。Vx</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>D通过响应VMM发给它的事件与外界交互。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>Windows 95中,基于Dos的每个进程在单独的VM中运行(称在V86模式下运行),既可按</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>Dos单进程方式,在640k低内存中运行(称在实模式下运行),又可利用多进程环境的优点,</span></p>
<p class=MsoPlainText align="left">在整个内存中运行<span lang=EN-US>(称在保护模式下运行),通过95的DPMI接口存取内存高端的Windows图</span></p>
<p class=MsoPlainText align="left">形环境。其他<span lang=EN-US>16位或32位应用程序均在同一系统VM中运行。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>下面只讨论95环境下的VxD。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>二、 VxD的创建</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>1. 由汇编语言创建VxD:需安装微软公司的Win32 SDK及DDK。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>2. 由C或C++语言创建VxD:需安装VC2.0或BC4.0,及Vireo Software公司的VToolsD软</span></p>
<p class=MsoPlainText align="left">件包。</p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>VToolsD含3个实用工具:可创建VxD框架的QuickVxD;可动态装卸VxD的VxD Loader;可</span></p>
<p class=MsoPlainText align="left">显示内存<span lang=EN-US>VxD特性的VxD Viewer。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>QuickVxD含7个对话页:</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>(1) Device Parameters页</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun: yes">
</span><span style="mso-spacerun: yes"> </span>包括最多8个字符的VxD名,唯一标识号(ID),相对其他VxD的装入顺序(VxD
Viewer可</span></p>
<p class=MsoPlainText align="left">显出某<span lang=EN-US>VxD的装入顺序值Init Order,若指定新VxD的装入顺序小于此Init
Order,则新Vx</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>D将在此VxD前被装入),实现语言(C或C++)静、动态装入方式等。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>(2) VxD Services页</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>可被其他VxD访问的接口(称为VxD服务),要求本VxD的ID>0,且未与内存各VxD的ID值</span></p>
<p class=MsoPlainText align="left">冲突。</p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>此ID可向微软公司申请,也可使用Vireo公司的VIREO_TEST_ID(3180h)。下称此类ID</span></p>
<p class=MsoPlainText align="left">为接口<span lang=EN-US>ID。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>(3) API页</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>可被应用程序在实模式/V86模式下、保护模式下、DPMI的实模式/V86模式下、DPMI</span></p>
<p class=MsoPlainText align="left">的保护模式下访问的接口<span lang=EN-US>(统称应用接口),前两者要求本VxD提供接口ID,后两者只要求本</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>VxD提供以0结尾的唯一标识串;访问前,先要静态或动态装入本VxD(第4者要求静态装入)</span></p>
<p class=MsoPlainText align="left">。</p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>第1、3者可被普通汇编程序访问,第2、4者可被在BC的Windows 3-x(16)平台上生成</span></p>
<p class=MsoPlainText align="left">的<span lang=EN-US>Windows程序访问。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>(4) Control Messages页</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>对出现在Windows 3.1及Windows 95中各消息的响应,如静态装入时的DTNAMIC_INIT</span></p>
<p class=MsoPlainText align="left">消息。</p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>(5) Windows95 Control Messages页</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>对只出现在Windows 95中各消息的响应,如动态装入时的SYS_DYNAMIC_INIT消息。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>(6) 用C++实现VxD时的Classes页</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>从虚拟设备驱动程序类VDevice派生的类名(如MyDevice),此类的成员函数将接收(4</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>)及(5)页中出现的大多数消息。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>从VM实例类VVirtualMachine派生的类名(如MyVM),此类的成员函数将接收贯穿在VM</span></p>
<p class=MsoPlainText align="left">生命期中的各消息<span lang=EN-US>,如系统VM初启消息Sys_VM_Init;</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>从线程实例类VThread派生的类名(如MyThread)。此类的成员函数将接收贯穿在线程</span></p>
<p class=MsoPlainText align="left">生命期中的各消息<span lang=EN-US>,如新线程初启消息THREAD_INIT。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>(7) Output Files页</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>体现以上内容的3个VxD文件(.h,.c或.cpp,.mak)将被存放的目录位置。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>三、 C++语言的VxD与外界通信的所有接口</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>我们将简要实现my.VxD的应用接口及服务,它们均作为类的函数成员,存于my.h,my.</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>cpp中。</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>1. 被32位C应用程序访问的接口</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>应用程序先用CreateFile打开VxD,后用DeviceIoControl使VMM发送W32_DEVICEIOCO</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US>NTROL消息给VxD:</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>HANDLE h;char ibuf[2],obuf[2];BOOL r;DWORD oc;OVERLAPPED
o;</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>h=CreateFile("\\\\.\\my.vxd",0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0);</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>//打开静态my.VxD,或动态装入my.VxD</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>r=DeviceIoControl(h,命令码C,ibuf,sizeof(ibuf),obuf,sizeof(obuf),&oc,NULL</span></p>
<p class=MsoPlainText align="left">或<span lang=EN-US>&o);</span></p>
<p class=MsoPlainText align="left"><span lang=EN-US><span style="mso-spacerun:
yes"> </span>/*与my.VxD的事件过程OnW32DeviceIoControl交换数据,用ibuf向VxD传数据,用obu</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -