用Delphi編寫VxD設備驅動程式 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 用Delphi編寫VxD設備驅動程式 用 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 函數調用時。 ?動模組(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
順便說一下,delphi中有個編譯選項可以控制程式載入的入口 一般是0x00400000,你可以改。
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
Jasonwong
版主 發表:49 回覆:931 積分:581 註冊:2006-10-27 發送簡訊給我 |
|
G01
高階會員 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |