RT,谢谢,俺的邮箱:[email protected]

解决方案 »

  1.   

    用 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_INITSYS_DYNAMIC_DEVICE_EXITW32_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 :PROCextrn SysDynamicDeviceExit :PROCextrn W32DeviceIoControl :PROC...PUBLIC DELPHIIO_DDBPublic @@HandleFinallyPublic @initialization...Control_0 proccmp eax, SYS_DYNAMIC_DEVICE_INITjnz short chkSysDynExitcall SysDynamicDeviceInitcmp eax, 1retn;-------------chkSysDynExit:cmp eax, SYS_DYNAMIC_DEVICE_EXITjnz short chkDevIOCtlcall SysDynamicDeviceExitcmp eax, 1retn;-------------chkDevIOCtl:cmp eax, W32_DEVICEIOCONTROLjnz short loc_retpush esipush edxpush ebxpush ecxcall W32DeviceIoControlcmp eax, 1retn;-------------loc_ret:clcretnControl_0 endp@@HandleFinally:@initialization:ret_LTEXT endsENDDelphi 会为单元的 initialization/finalization 建立代码调用外部过程 HandleFinaly 和 initialization ,即使 initialization/finalization 在单元中不存在。因此我们在汇编的启动文件中建立空的外部过程入口。主 Delphi 程序单元(vxdProcs.pas)...procedure ShellMessage(Handle, Flags : integer; const Message, Caption : PChar;Callback, ReferenceData : pointer); stdcall; assembler;asmmov ebx, Handle // virtual machine handlemov eax, Flags // message box flagsmov ecx, Message // address of message textmov edi, Caption // address of caption textmov esi, Callback // address of callbackmov edx, ReferenceData // reference data for callbackint 20H // VxDCalldd 170004h // Shell_Messageend;function SysDynamicDeviceInit : INTEGER;beginShellMessage(0, $10, Copyright, 'SysDynInit: Hello from Delphi VxD !!!', nil, nil);Result := VXD_SUCCESS;end;function SysDynamicDeviceExit : INTEGER;beginShellMessage(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;beginShellMessage(0, $10, Copyright, 'W32DevIOCtl', nil, nil);if (dwService = DIOC_OPEN) thenbeginResult := NO_ERROR;endelse if (dwService = DIOC_CLOSEHANDLE) thenbeginResult := VXD_SUCCESS;endelse if (dwService > MAX_PASVXD_W32_API) thenbeginResult := ERROR_NOT_SUPPORTED;endelsebeginResult := VXD_SUCCESS;end;end;... [译者:好了,简单的 VxD 设备驱动程序编写完毕了。你可以将它当作一个写 VxD 设备驱动程序的模板。]附一:Make.batD:~198DDK-coff -DBLD_COFF -DIS_32 -W2 -c -Cx -Zm -DMASM6 vxdmain.asmcall dcc3.bat -J vxdprocs.pasD:~198DDK/DEF:vxddef.def /VXD vxdmain.obj vxdprocs /OUT:delphiio.vxd附二:现在让我们来编写对该 VxD 的测试程序,两个按钮:一个打开 VxD;一个关闭 VxD。constVxDName = '\..VXD';...function TVxDTestForm.OpenVxDDriver: boolean;beginHVxDHandle := CreateFile(VxDName,0,0,nil,0,FILE_FLAG_DELETE_ON_CLOSE,0);Result := HVxDHandle <> INVALID_HANDLE_VALUE;end;procedure TVxDTestForm.CloseVxDDriver;beginif HVxDHandle <> INVALID_HANDLE_VALUE then beginCloseHandle(HVxDHandle);HVxDHandle := INVALID_HANDLE_VALUE;end;end 转帖
      

  2.   

    谢谢 xiangwangz,你给的源代码挺好用,能不能再给份猛料啊?谢谢!
      

  3.   

    xiangwangz兄弟:我给你发了短消息,我把分都给你,你给我一份,好吧 ?谢谢,以后还有很多的问题要你帮忙呢?嘿嘿!