荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: huanghm (东方不败), 信区: Program
标  题: TSR与WIN 95应用程序通信
发信站: BBS 荔园晨风站 (Tue Jun  2 05:28:47 1998), 转信

  开发硬件的用户大都通过TSR程序以提供软中断调用
的形式来驱动DOS环境下的硬件。在DOS系统下,通过TSR程
序驱动硬件非常容易实现,可是,他们却遇到一个难题,
希望能将TSR实现的DOS设备驱动程序方便快捷地应用于WIN
DOWS 95系统,因为重新开发WINDOWS 95系统的设备驱动
程序VxD是一件非常不容易的事,这是用户不希望的。可是
,是否可以寻找一种简便的方法,实现WINDOWS 95下应用
程序与DOS下的驱动程序TSR通信,将DOS下的TSR嫁接到WI
NDOWS 95环境下呢?回答是肯定的,本文将寻找一种可行
的方法。

  一、通过寄存器传递参数

  WINDOWS 3X是基于DOS的操作系统,WINDOWS 95虽
然表面上脱离了DOS,实际上是WINDOWS 40 +DOS 7.0。
如果用户是通过寄存器而不是通过指针或者地址传递参数
,那问题就比较简单了。用户可以在应用程序中嵌套汇编
,向系统提交软中断申请,通过寄存器来传递简单的参数
。WINDOWS 95系统截获所有的中断指令,并判别它是否提
供了WINDOWS的中断服务程序,如果没有,WINDOWS就不做
任何事情,直接地切换到V86模式,调用V86模式的IVT(In
terrupt Virtual Table)的中断服务程序,并在V86模式
下运行中断服务程序,直到软中断返回,系统再将处理器
切换到保护模式,继续运行WINDOWS的应用程序。

  通过寄存器,WINDOWS应用程序与TSR驱动程序之间可
以实现通信,实现起来也比较简单,即在WINDOWS应用程
序中通过嵌套汇编调用软中断,就象在DOS应用程序中那样
,先运行TSR程序,然后调用软中断服务。

  二、通过公用缓冲区交换数据

  在很多情况下,需要交换大量的数据,只通过寄存器
来传递是不行的。必须选择另一种方法:公用缓冲区数据
交换。通过公用缓冲区交换数据时必须要特别的小心,这
是因为WINDOWS 95应用程序访问公用缓冲区是在保护模式
下,而TSR驱动程序则是在实模式环境下来访问公用缓冲
区的。

  一般情况下,TSR驱动程序实模式下分配一个公用缓
冲区,得到一个实模式的地址指针,通过一定的方法,将
指向缓冲区的实模式指针转化成保护模式的指针,提供给W
INDOWS 95应用程序,应用程序可以通过指针,在保护模
式下访问公用缓冲区。下面详细地介绍其实现方法。

  我们知道,在TSR程序分配的缓冲区得到的指针都是
实模式的,它是由段和偏移量形成的,而保护模式下的指
针则是由选择器和偏移量形成的。段和选择器的差别在于
处理器如何利用其生成线性地址。实模式下,线性地址的
形成非常简单:

  线性物理地址=(段〈〈4+偏移量);

  而保护模式下线性地址则与选择器之间没有简单的数
学关系,而是通过选择器查询描述符表得到一个基地址,
再加上偏移量计算得到线性地址。将实模式指针转化成保
护模式的指针的基本思想是:利用实模式生成的线性地址
为基址生成一个保护模式的选择器。基于以上的分析,下
面的一小段程序可以实现将实模式的地址转换为保护模式
的地址。

  void far *RealPtrToProtectPtr(DWORD Segment,D
WORD Offset)

  {

   char far *PtrProtect;

   WORD MyDs,Sel;

  DWORD Base;

  —asm mov MyDs,ds

  Sel=AllocSelector(MyDs);

  Base=(Segment<<4)+Offset;

  SetselectorBase(Sel,Base);

  SetSelectorLimit(Sel,64×1024);

  return(MAKELP(Sel,0));

  }

  这样,WINDOWS 95应用程序就可以在保护模式下访问
TSR分配的公用缓冲区。通过该缓冲区WINDOWS 95与TSR之
间就可以实现大量的数据交换。
--

※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.25]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店