Windows 存在有两种类型的 VxD 设备驱动程序: 
  1、静态(Static) VxD ,装入操作系统并永久的存在于内存中; 
  2、动态(Dynamic) VxD,当需要时才调入内存,用完后关闭VxD即可释放内存。 

解决方案 »

  1.   

    如果只凭借delphi的开发环境,恐怕写不了。
    “在windows环境下,除了写驱动,delphi无所不能……”
    好象需要一个什么别的东西才行,我实在记不起来了~~
      

  2.   

    当 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 标志。 
      

  3.   

      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_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;  function SysDynamicDeviceInit : INTEGER; begin   ShellMessage(0, $10, Copyright, 'SysDynInit: Hello from Delphi VxD !!!', nil, nil);   Result := VXD_SUCCESS; end;  function SysDynamicDeviceExit : INTEGER; begin   ShellMessage(0, $10, Copyright, 'SysDynDevExit: Bye from Delphi VxD !!!', nil, nil);   Result := VXD_SUCCESS; end;  function W32DeviceIoControl(dwService : INTEGER;   dwDDB : INTEGER;   hDevice : INTEGER;   lpDIOCParms : pointer) : INTEGER; begin   ShellMessage(0, $10, Copyright, 'W32DevIOCtl', nil, nil);    if (dwService = DIOC_OPEN) then   begin   Result := NO_ERROR;   end   else if (dwService = DIOC_CLOSEHANDLE) then   begin   Result := VXD_SUCCESS;   end   else if (dwService > MAX_PASVXD_W32_API) then   begin   Result := ERROR_NOT_SUPPORTED;   end   else   begin   Result := VXD_SUCCESS;   end; end; ...   [译者:好了,简单的 VxD 设备驱动程序编写完毕了。你可以将它当作一个写 VxD 设备驱动程序的模板。]  附一:Make.bat D:\VISUAL~1\98DDK\BIN\Win98\ml -coff -DBLD_COFF -DIS_32 -W2 -c -Cx -Zm -DMASM6 vxdmain.asm call dcc3.bat -J vxdprocs.pas D:\VISUAL~1\98DDK\BIN\link /DEF:vxddef.def /VXD vxdmain.obj vxdprocs /OUT:delphiio.vxd  附二: 现在让我们来编写对该 VxD 的测试程序,两个按钮:一个打开 VxD;一个关闭 VxD。  const VxDName = '\\.\DELPHIIO.VXD';  ...  function TVxDTestForm.OpenVxDDriver: boolean; begin HVxDHandle := CreateFile(VxDName,0,0,nil,0,FILE_FLAG_DELETE_ON_CLOSE,0); Result := HVxDHandle <> INVALID_HANDLE_VALUE; end;  procedure TVxDTestForm.CloseVxDDriver; begin if HVxDHandle <> INVALID_HANDLE_VALUE then begin   CloseHandle(HVxDHandle);   HVxDHandle := INVALID_HANDLE_VALUE; end; end 
      

  4.   

    太难了~~~我先也是想用Delphi写VXD的,而且还下了VtoolsD,但是——太难了:(不过如果你成功,能告诉我吗? [email protected]