用Delphi编写VxD设备驱动程序
来源:优易学  2011-10-10 10:01:12   【优易学:中国教育考试门户网】   资料下载   IT书店

  介绍
  windows 存在有两种类型的 vxd 设备驱动程序:
  1、静态(static) vxd ,装入操作系统并永久的存在于内存中;
  2、动态(dynamic) vxd,当需要时才调入内存,用完后关闭vxd即可释放内存。
  inprise delphi 有能力建立任何一种类型的 vxd 设备驱动程序,下面我们将介绍如何建立动态 vxd。
  当 win32 应用程序打开一个 vxd “虚拟”设备时,vwin32 使用 loaddevice 将 vxd 装入内存,并建立消息w32_deviceiocontrol ,发向 vxd。
  也就是说,vxd 至少应该响应以下两个系统信息和编写以下的一个函数:
  sys_dynamic_device_init
  sys_dynamic_device_exit
  w32_deviceiocontrol 函数.
  消息 sys_dynamic_device_init 在尝试装入 vxd 时发送到 vxd ,消息 sys_dynamic_device_exit 在尝试动态交换时发送到 vxd ,消息的处理者在成功处理后,应该在寄存器 ax 中返回 vxd_success 标志。
  w32_deviceiocontrol 的 dwservice 参数有以下的值:
  dioc_open 当 vxd 通过 createfile() 函数尝试打开操作时发送(在 sys_dynamic_device_init 消息后),如果成功返回 no_error (0);
  dioc_closehandle 当 vxd 通过 closehandle() 函数尝试关闭操作时发送(在 sys_dynamic_device_exit 前)
  所有其它的值 > 0 意味着不同的函数调用(由 dwiocontrolcode 给出),当 vxd 被 deviceiocontrol 函数调用时。
  启动模块(vxdmain.asm)
  ...
  extrn sysdynamicdeviceinit :proc
  extrn sysdynamicdeviceexit :proc
  extrn w32deviceiocontrol  :proc
  ...
  public delphiio_ddb
  public @@handlefinally
  public @initialization
  ...
  control_0proc
  cmpeax, sys_dynamic_device_init
  jnzshort chksysdynexit
  callsysdynamicdeviceinit
  cmpeax, 1
  retn
  ;-------------
  chksysdynexit:
  cmpeax, sys_dynamic_device_exit
  jnzshort chkdevioctl
  callsysdynamicdeviceexit
  cmpeax, 1
  retn
  ;-------------
  chkdevioctl:
  cmpeax, w32_deviceiocontrol
  jnzshort loc_ret
  pushesi
  pushedx
  pushebx
  pushecx
  callw32deviceiocontrol
  cmpeax, 1
  retn
  ;-------------
  loc_ret:
  clc
  retn
  control_0endp
  @@handlefinally:
  @initialization:
  ret
  _ltext  ends
  end
  delphi 会为单元的 initialization/finalization 建立代码调用外部过程 handlefinaly 和 initialization ,即使 initialization/finalization 在单元中不存在。因此我们在汇编的启动文件中建立空的外部过程入口。

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训