VxD认识

一.  .vxd文件是什么?vb中如何用它?

 

VXD是虚拟设备驱动,它通常完成一些系统底层的工作。调用VXD一般时利用Windows API的CreateFile打开设备,然后利用DeviceIoControl来调用VXD。具体的调用办法是由VXD的设计者规定的,需要查看有关的文档说明。

 

 

二.  怎样生成.vxd文件?

 

VxD入门教程    
   
   
  1.背景知识    
   
  为了看懂本篇所给的例子,需要C,   汇编及Windows   设备驱动程序的相关知识。    
   
  2.开发工具    
   
  需要   Microsoft   Visual   C++   2.0   以上版本,MASM   6.11C,   及Windows   95   DDK(以下采    
  用   VC++   6.0   为例)    
   
  3.目的    
   
  利用以上所列的开发工具,编写一个动态装入的   VxD,   利用该VxD可以读取内存地址0    
  处的中断向量表。    
   
  4.开始    
   
  第一步:    
   
  用   VC++   新建一个工程,取名为   MiniVxd,   类型为   Win32   App   或   Console   App因为V    
  C++不提供直接生成    
   
  VxD的App   Wizard,所以只好自己在以上两种App中选择一个,然后再进行手工修改一下    
  ,需要修改的内容    
   
  只有一处,即在   Link   的命令行上加上一个选项    
   
  /VXD    
   
  第二步:    
   
  新建一个空文件,在其中输入以下代码:    
   
  TITLE   MINIVXD   -   By   Ding   Kai    
   
  .386p    
   
  include   vmm.inc    
   
   
  MINIVXD_DYNAMIC   EQU   1    
   
  ;   定义设备驱动程序块   DDB,   由于是动态装入的,所以设备ID和装入顺序可以取未定    
  义值.    
   
  DECLARE_VIRTUAL_DEVICE   MINIVXD,   1,   0,   MsgDispatch,UNDEFINED_DEVICE_ID,    
   
  Undefined_Init_Order,   0,   0    
   
  VXD_LOCKED_CODE_SEG    
   
  ;   定义消息派遣表,本例中只需要一条消息,即W32_DEVICEIOCONTROL,用于从Win32Ap    
  p中利用    
   
  ;   DeviceIoControl   API函数同本VxD进行通讯.    
   
   
  BeginProc   MsgDispatch    
   
  Control_Dispatch   W32_DEVICEIOCONTROL,   W32DeviceIoControl,   sCall,    
   
   
  clc    
   
  ret    
   
  EndProc   MsgDispatch    
   
   
  VXD_LOCKED_CODE_ENDS    
   
  END    
   
   
  将文件存盘,文件名取为   VxdStub.asm,   然后用下列命令编译该文件:    
   
  Aml   -coff   -W2   -DBLD_COFF   -DIS_32   -c   -Cx   -DMASM6   -I/95DDK/INC32   VxdStub.asm    
   
   
  这将会生成   vxdstub.obj,将此OBJ文件加入到工程文件中。    
   
   
  第三步:    
   
  创建一个   C   语言文件,文件名取为   MiniVxd.c,在文件中输入以下代码:    
   
  #define   WIN40SERVICES    
   
  #pragma   warning   (disable:4229)    
   
  #include    
   
  #define   WANTVXDWRAPS    
   
  #pragma   intrinsic(memcpy)    
   
  #pragma   VxD_LOCKED_DATA_SEG    
   
   
  //   此处可以定义任何在VxD中需要的全局变量.    
   
  char   AnyData[200];    
   
  #pragma   VxD_LOCKED_CODE_SEG    
   
  ///    
   
  DWORD   __stdcall   GetMemory(   DWORD   dwDDB,   PDIOCPARAMETERS   pD   )    
   
  {    
   
  BYTE   *p;    
   
  //   此处忽略了参数检查,实际应用中切不可如此   !!    
   
  p   =   (PBYTE)pD->lpvOutBuffer;    
   
  memcpy(p,   0,   1024);   //   读取中断向量表,共   1024   字节    
   
  return   1024;    
   
  }    
   
  ///    
   
  /*   Win32   interface   */    
   
  ///    
   
  int   __stdcall    
   
  W32DeviceIoControl(   DWORD   dwIoCtrlCode,   /*ecx*/    
   
  DWORD   dwDDB,   /*ebx*/    
   
  DWORD   pDIOCParams   )   /*esi*/    
   
  {    
   
  PDIOCPARAMETERS   pD;    
   
  pD   =   (PDIOCPARAMETERS)pDIOCParams;    
   
  if   (   dwIoCtrlCode   ==   DIOC_OPEN   ||    
   
  dwIoCtrlCode   ==   DIOC_CLOSEHANDLE)    
   
  return   0L;    
   
  //   Init   returned   value    
   
  if   (pD->lpcbBytesReturned)    
   
  *(DWORD   *)pD->lpcbBytesReturned   =   0;    
   
  if   (dwIoCtrlCode==1)   {   //   1   =   DeviceIoControl代码    
   
  GetMemory(dwDDB,   pD);    
   
  }    
   
  else    
   
  return   ERROR_NOT_SUPPORTED;    
   
  return   0;    
   
  }    
   
  将本文件加入到工程文件中.    
   
   
  第四步:    
   
  创建一个模块定义文件,此文件将要定义最终生成的VxD文件的段属性并输出设备驱动    
  程序块,    
   
  输入下面的代码,并将文件存为   MiniVxd.def,同时将其加入到工程文件中.    
   
  VXD   MINIVXD   DYNAMIC    
   
  DESCRIPTION   'Written   by   Ding   Kai'    
   
  SEGMENTS    
   
  _LTEXT   CLASS   'LCODE'   PRELOAD   NONDISCARDABLE    
   
  _LDATA   CLASS   'LCODE'   PRELOAD   NONDISCARDABLE    
   
  _TLS   CLASS   'LCODE'   PRELOAD   NONDISCARDABLE    
   
  _BSS   CLASS   'LCODE'   PRELOAD   NONDISCARDABLE    
   
  _ITEXT   CLASS   'ICODE'   DISCARDABLE    
   
  _IDATA   CLASS   'ICODE'   DISCARDABLE    
   
  _PTEXT   CLASS   'PCODE'   NONDISCARDABLE    
   
  _PDATA   CLASS   'PDATA'   NONDISCARDABLE   SHARED    
   
  HEAPSIZE   10240    
   
  STACKSIZE   40960    
   
  EXPORTS    
   
  MINIVXD_DDB   @1    
   
   
  当然,其中有些段在本程序中不存在,此处列出来是想将此文件做为一个模板以供以    
  后使用。    
   
   
  第五步:    
   
  加入本工程文件需要的最后一个,VxdWarps.clb,   这个文件是DDK的LIB目录中.    
   
  第六步:    
   
  所需的四个文件已经全部加入完毕,它们是:    
   
  vxdstub.obj    
   
  minivxd.c    
   
  minivxd.def    
   
  vxdwarps.clb    
   
   
  在进行make之前请检查一下文件路径,   在   Include   中一定要包含   DDK   目录中的INC3    
  2   目录.    
   
  确认无误后可以按   F7   键进行   Make   了。    
   
   
  结果会在   DEBUG   目录或   Release   目录   (依赖于工程文件的设置)   生成MiniVxd.vxd    
  文件。    
   
   
  至此,一个小小的Vxd文件生成完毕,   可以在程序中用下面的代码与本VxD进行通讯.    
   
   
   
  BYTE   buffer[1024];    
   
  DeviceIoControl(hVxd,   1,   NULL,   NULL,   buffer,   1024,   NULL,   0);    
   
   
  结果,当前的中断向量表就会出现在   buffer   数组中。    
   
  本文不再提供完整的测试程序,需要的话请与作者联系    
   
  5.小结    
   
   
  本文用一个简单的示例介绍了如何在   Windows   95   下编写可动态安装的   VxD,   这种方    
  法及用这种方法    
   
  编写的VxD在Windows   98   下同样适用。然而,在   Windows   NT   不能采用这种方法    
   
   
   
  **************************************************************************    
  *******************************************    
   
  标   题:   VxD世界——虚拟的Windows世界    
   
   
  从事Windows系统编程的读者一定听说过VxD──这个在Windows(注:指Windows   3.1    
  /95/98,    
   
  非Windows   NT)的世界里无所不能的超级武器。迄今为

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值