用Delphi编写VxD设备驱动程序

2016-01-29 14:25 5 1 收藏

用Delphi编写VxD设备驱动程序,用Delphi编写VxD设备驱动程序

【 tulaoshi.com - Delphi 】

  用 delphi 3.0 编写 vxd 设备驱动程序,在delphi 3 下编译通过,delphi 2 下没有测试,delphi 4 建立的 object 文件 m$ linker 5.12.8181 不能识别,这里使用的汇编器是m$的macro assembler ver. 6.11d ,联结器是m$ incremental linker ver. 5.12.8181 ,它们来自 windows 98ddk(http://www.microsoft.com/ddk/ddk98.htm)。

  介绍

 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 函数调用时。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/delphi/)

启动模块(vxdmain.asm)
...
extrn sysdynamicdeviceinit :proc
extrn sysdynamicdeviceexit :proc
extrn w32deviceiocontrol  :proc
...
            public delphiio_ddb
      public @@handlefinally
      public @initialization
...
control_0  proc
  cmp  eax, sys_dynamic_device_init
  jnz  short chksysdynexit
  call  sysdynamicdeviceinit
  cmp  eax, 1
  retn  
;-------------

chksysdynexit:
  cmp  eax, sys_dynamic_device_exit
  jnz  short chkdevioctl
  call  sysdynamicdeviceexit
  cmp  eax, 1
  retn  
;-------------
chkdevioctl:
  cmp  eax, w32_deviceiocontrol
  jnz  short loc_ret
  push  esi
  push  edx
  push  ebx
  push  ecx
  call  w32deviceiocontrol
  cmp  eax, 1
  retn  
;-------------
loc_ret:
  clc  
  retn  

control_0  endp

@@handlefinally:
@initialization:
      ret

_ltext  ends
            end

  delphi 会为单元的 initialization/finalization 建立代码调用外部过程 handlefinaly 和 initialization ,即使 initialization/finalization 在单元中不存在。因此我们在汇编的启动文件中建立空的外部过程入口。

  主 delphi 程序单元(vxdprocs.pas) 

...
procedure shellmessage(handle, flags : integer; const message, caption : pchar; 
  callback, referencedata : pointer); stdcall; assembler;
asm
 mov  ebx, handle    // virtual machine handle
 mov  eax, flags    // message box flags
 mov  ecx, message    // address of message text
 mov  edi, caption    // address of caption text
 mov  esi, callback    // address of callback
 mov  edx, referencedata    // reference data for callback

 int  20h      // vxdcall
 dd   170004h      // shell_message
end;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/delphi/)

function sysdynam

来源:https://www.tulaoshi.com/n/20160129/1493277.html

延伸阅读
标签: Delphi
  如果你想自己用Delphi编写一个打印程序,那么,下面这些技巧或许对你有所帮助。 1.获娶显示当前打印机的分辨率 Windows下的打印分辨对打印程序有着至关重要的作用,如果你想知道打印机的分辨率,请在程序中加入一行:ShowMessage(′水平分辨率′+inttostr(GetDeviceCaps(printerHandle,LOGPIXELSX))+chr(13)+′垂直分辨率:′+...
标签: windows系统
Windows 8如何更新设备的驱动程序 Win8系统更新某一设备的驱动程序的方法如下: 1、右键单击桌面空白处,桌面下方弹出所有应用选项,左键单击所有应用。 2、左键单击控制面板。 3、第二种进入控制面板方法。同时按下键盘上 Windows 和" X "键,单击控制面板。 4、左键单击硬件和声音。 5...
Linux中的大部分驱动程序,是以模块的形式编写的.这些驱动程序源码可以修改到内核中,也可以把他们编译成模块形势,在需要的时候动态加载. 一个典型的驱动程序,大体上可以分为这么几个部分: 1,注册设备 在系统初启,或者模块加载时候,必须将设备登记到相应的设备数组,并返回设备的主驱动号,例如:对快设备来说调...
标签: Delphi
  一、Win2000服务简介 服务程序(Service Application)是一种运行于WinNT的后台程序,每个服务程序(Service Application)中可能包含若干个服务(Service),每个服务就是其中的一个线程(该服务也可以创建多个子线程)。采用服务,应用程序可以获得特殊的权限,而且不会被用户通过Win2000的任务管理器直接结束程序,所以服务...
驱动程序怎么安装   在安装驱动程序时,Windows一般要把.inf文件拷贝一份到Win-dowsInf或WindowsInfOther目录下,以备将来使用。Inf目录下除了有.inf文件外,还有两个特殊文件Drvdata.bin和Drvidx.bin,以及一些.pnf文件,它们都是Windows为了加快处理速度而自动生成的二进制文件。Drvdata.bin和Drvidx.bin记录了.inf文件描述的所有硬...

经验教程

976

收藏

41
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部