全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1613
推到 Plurk!
推到 Facebook!

用Delphi編寫VxD設備驅動程式

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-21 20:10:30 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-22 09:01:02 IP:211.21.xxx.xxx 未訂閱
還是要動到組合語言~~ -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-29 07:37:04 IP:210.200.xxx.xxx 未訂閱
關於這個範例,我已經有實際去操作過了;不過卻卡在Delphi3以上版本產生的*.OBJ檔案無法被Masm 接受(因為M$用的OBJ檔案格式為COFF ,而Borland用的是 OWF);所以Masm無法呼叫Delphi的Procedure!!
系統時間:2024-04-27 11:57:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!