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

📄 20000916013.htm

📁 C++Builder教学大全
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<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">&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</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>从多任务操作系统Windows 3.1起,计算机中的任一物理设备x可同时被基于Dos或Wi</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US>ndows的多个进程使用,这种一对多的关系称为&quot;设备虚拟化&quot;,各进程通过运行在核心层的</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">&nbsp;&nbsp;&nbsp; </span>VxD可由虚拟机管理器(VMM)在开机时装入核心层(称静态装入,即置VxD于c:\window</span></p>

        <p class=MsoPlainText align="left"><span lang=EN-US>s\system目录下,在c:\windows\system.ini文件中,对节[386Enh]加一行&quot;device=此VxD</span></p>

        <p class=MsoPlainText align="left">文件名<span lang=EN-US>&quot;),或由应用程序实时装入(称动态装入),而后,各进程便可存取锁定在内存中的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">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>下面只讨论95环境下的VxD。</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>二、 VxD的创建</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>1. 由汇编语言创建VxD:需安装微软公司的Win32 SDK及DDK。</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>QuickVxD含7个对话页:</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>(1) Device Parameters页</span></p>

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

          </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</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">&nbsp;&nbsp;&nbsp; </span>(2) VxD Services页</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>可被其他VxD访问的接口(称为VxD服务),要求本VxD的ID&gt;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">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>(3) API页</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>(4) Control Messages页</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>(5) Windows95 Control Messages页</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>对只出现在Windows 95中各消息的响应,如动态装入时的SYS_DYNAMIC_INIT消息。</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>(6) 用C++实现VxD时的Classes页</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>(7) Output Files页</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>体现以上内容的3个VxD文件(.h,.c或.cpp,.mak)将被存放的目录位置。</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>三、 C++语言的VxD与外界通信的所有接口</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>1. 被32位C应用程序访问的接口</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </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">&nbsp;&nbsp;&nbsp; </span>h=CreateFile(&quot;\\\\.\\my.vxd&quot;,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">&nbsp;&nbsp;&nbsp; </span>//打开静态my.VxD,或动态装入my.VxD</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>r=DeviceIoControl(h,命令码C,ibuf,sizeof(ibuf),obuf,sizeof(obuf),&amp;oc,NULL</span></p>

        <p class=MsoPlainText align="left">或<span lang=EN-US>&amp;o);</span></p>

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

yes">&nbsp;&nbsp;&nbsp; </span>/*与my.VxD的事件过程OnW32DeviceIoControl交换数据,用ibuf向VxD传数据,用obu</span></p>

⌨️ 快捷键说明

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