能用Delphi写VxDDDDD啦!!!!!!!(0分)

  • 主题发起人 主题发起人 aimingoo
  • 开始时间 开始时间
A

aimingoo

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用 Delphi 编写 VxD 设备驱动程序

关键词:Delphi控件杂项

作者:Emil Biserov(dinfo@mail.primorye.ru)(Russion)
英语翻译:Vitaly Zayko(zayko@vitsoftware.com)
中文翻译改编:Riceball(teditor@mailroom.com)

前言
用 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
8DDK(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
函数调用时。

启动模块(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
...

==================
K!俄国鬼子就是厉害!据说这个东东99年就发表了,但我们现在才看到!
 
哇塞,牛大了
 
o Faint, 这也叫用Delphi写Vxd
这叫用Delphi写汇编模块
 
K!!!

懂不懂呀!你!
procedure ShellMessage()是在vxdProcs.pas中主要用来屏幕显示的过程,中间调用了
汇编,是因为在VxD所处于的Ring0级,绝大多数Winapi不能使用,所有基于Windows消
息的事件服务程序和调用都不起作用,这时,不用汇编写,那要用什么写呀?

vxdProcs.pas主要用于产生vxdProcs.obj文件,与vxdmain.obj一起链接成vxd。vxdmain.asm
是一个标准的VxD调用的头,代码量倒是不大,而且基本上也不需要大改动就可用了。
用这种方法写VxD,你的精力可以将大的花在vxdProcs.pas这个单元的编写上。它是纯
功能部分,纯IDE环境的、纯Pascal语法的、可使用熟悉的BASM的代码!看起来已经是
很不错了。黑黑。

仔细想了想,用VC来写这段代码(我的意思是vxdProcs.pas这样的一段代码),也不过
如此嘛!哈哈哈哈。

用了一晚上的时间测试。结果如下:
1. 一定要用Delphi3来编译vxdProcs.pas!D4/D5都不成。
2. 一定要用生成C obj方式,即-J开关。生成C++ Obj不行。即不能用-JP开关。
3. 汇编编译器用MASM/TASM均可。但建议找个高版本。
4. 链接器一定要用WinDDK中所带的Link.exe,有且仅有这个版本的Link.exe支持生成VxD!
5. 测试程序能在Win98上使用,但在WinNT/2K上均无效。
6. 在Win98上测试结果:进入蓝屏方式,显示一条信息!!!系统Ring0权限已经获得!
7. Win98 DDK下载地址:http://www.microsoft.com/ddk/install98ddk.htm
 
window2000不是已经取消了vxd吗,那还有什吗用,不是趋势!
 
bcb不知好使不?
 
to sunstone:
Win2K中的确取消了解VxD。但是,上面这个方法更重要的是提供了一个思路。即
WinDDK + Delphi来开发设备驱动的方法。
其实,这种方法可以不仅是用来写VxD,写NT/2K的驱动也都是可以的。
因为,这意味着可以为Delphi的代码构造任意结构的文件头。 ^-^
 
这是个令人振奋的好消息!其实一种语言的潜力是要靠大家来挖掘的。Delphi+WinDDK 就是
一个超级组合。以前不是有很多人断定 Delphi 充其量只能算是合 VB 较劲的工具吗?不是
说 Delphi 没有和 VC 一争高下的资格吗?其实,这些都只说明了很多人对 Delphi 的内在
潜力并不清楚。说句老实话,离开了 DDK,VC++ 还能开发出 VxD 吗?我绝对相信 Delphi
结和 Win2000 DDK 就可以开发出 WDM 新规范的设备驱动程序。为什么这些新的突破和发现
总是被老外抢先?我觉得,我们中国很多程序员有一种惰性,当然我不是职业程序员,但我
也有这种惰性。那就是不愿意下硬功夫吃透一个开发工具。其实我相信我们中国人的能力绝
对强于洋人。现在不就是一个好的启发吗?既然俄国人能够用 Delphi 做出过去大家认为不
可能的事情,那么我们肯定可以用 Delphi 做出更多令人惊叹的东西,只要我们肯努力!我
写这些绝不是与 VC/VB 程序员级爱好者为敌。选用什么开发工具是各人自己的事。只要能够
做出东西,就是最好的。我们的目标只有一个,那就是用好自己喜爱的开发工具,做出令人
赞叹的软件产品。
 
总算大虾给我们指出方向,告诉我们这样可以或者不可以,谢谢,俺就等着这一天了。
 
呵呵,
Vxd我还是了解一点,也作过一点东西。

我觉得大家不要把精力放在语言的一较高下上。
作Vxd本来就是一件比较繁琐和危险的,
要做好一个Vxd需要了解掌握相关的底层知识,
对Vxd要作的事也要非常清楚,
MS也并不鼓励大家没事找事去做Vxd玩。

对于Delphi而言,
Borland并不提供制做Vxd的任何支持。


上文之所以可以利用Delphi辅助制做Vxd不过是因为Delphi支持嵌入汇编,
而且D3的编译器又能生成符合生成LE文件格式的obj文件。


如果是这样,为什么不用MASM去做,更安全可靠一些。
如果对汇编使用不熟,
在理解了Vxd的基础上,
大家可以使用VxdTools,Driver Studio等工具,
同样是可以比较轻松的制作Vxd。

MS用C+汇编作出了Windows,并不是说也一定要Delphi+汇编作一个。

毕竟Delphi的长处是做应用,
发掘潜力当然好,
不过如果连borland的工程师对之都没信心,
我们所能作的,
应该就是仅限于在闲暇去探讨一下。



 
大虾们,
给我一分这样的东东好吗?
 
各位能否推荐一本介绍VxD方面的入门书???
 
to amo:
不同意你的意见。:(
语言的一较高下的确没有什么意义。各种语言都有适合自己的场合和环境。通常人们都认
为VC是万能的,而ASM是无所不能的。
但好象这不等于所有的Delphi程序员就得再学一遍VC + ASM吧?事实上,掌握一门语言并
不是太容易的事。高级语言之间或者互通性大些,但ASM呢?不能指望任何人都能有ASM写
Windows的水平吧?

Delphi + WinDDK写VxD的意义主要在于一条思路。其编程重心被放在vxdProcs.pas这个单
元之后,会使程序员开发精力更加集中,至少(*y/z mod m)这些表达式,或者for i:=0 to x do;
这样的语法都是可用的了。
我想,使用这样的东东做出来的代码,至少会让我赏心悦目一些。哈哈。
 
很高兴啊,不知道WMD是不是也能搞定
 
接受答案了.
 
[:)]我说怎么回事。我用d4编译的obj文件
link不认。
 
后退
顶部