Kata pengantar
Gunakan Delphi 3.0 untuk menulis driver perangkat VxD. Ini dikompilasi dan dilewati di Delphi 3. Tidak ada tes di Delphi 2. File Objek M$ Linker 5.12.8181 yang dibuat oleh Delphi 4 tidak dapat dikenali Macro Assembler versi 6.11d, linkernya adalah M$ Inkremental Linker versi 5.12.8181 , mereka berasal dari Windows 98DDK (http://www.microsoft.com/ddk/ddk98.htm).
memperkenalkan
Ada dua jenis driver perangkat VxD untuk Windows:
1. VxD Statis, dimuat ke dalam sistem operasi dan ada secara permanen di memori;
2. VxD Dinamis, yang dimuat ke dalam memori bila diperlukan. Setelah digunakan, tutup VxD untuk melepaskan memori.
InPRise Delphi memiliki kemampuan untuk membuat semua jenis driver perangkat VxD. Di bawah ini kami akan memperkenalkan cara membuat VxD dinamis.
Ketika aplikasi Win32 membuka perangkat "virtual" VxD, VWIN32 menggunakan LoadDevice untuk memuat VxD ke dalam memori dan membuat pesan W32_DEVICEIOCONTROL dan mengirimkannya ke VxD.
Dengan kata lain, VxD setidaknya harus merespons dua pesan sistem berikut dan menulis salah satu fungsi berikut:
SYS_DYNAMIC_DEVICE_INIT
SYS_DYNAMIC_DEVICE_EXIT
Fungsi W32_DEVICEIOCONTROL.
Pesan SYS_DYNAMIC_DEVICE_INIT dikirim ke VxD ketika mencoba memuat VxD, dan pesan SYS_DYNAMIC_DEVICE_EXIT dikirim ke VxD ketika mencoba bertukar secara dinamis. Pengendali pesan harus mengembalikan flag VXD_SUCCESS di register AX setelah pemrosesan berhasil.
Parameter dwService dari W32_DEVICEIOCONTROL memiliki nilai berikut:
DIOC_OPEN dikirim ketika VxD mencoba operasi terbuka melalui fungsi CreateFile() (setelah pesan SYS_DYNAMIC_DEVICE_INIT), dan mengembalikan NO_ERROR (0) jika berhasil;
DIOC_CLOSEHANDLE Dikirim ketika VxD mencoba operasi penutupan melalui fungsi CloseHandle() (sebelum SYS_DYNAMIC_DEVICE_EXIT)
Semua nilai lain > 0 berarti pemanggilan fungsi yang berbeda (diberikan oleh dwIoControlCode) ketika VxD dipanggil oleh fungsi DeviceIoControl.
Mulai modul (vxdmain.asm)
...
extrn SysDynamicDeviceInit:PROC
extrn SysDynamicDeviceKeluar:PROC
ekstrak W32DeviceIoControl:PROC
...
DELPHIIO_DDB UMUM
Publik @@HandleFinally
@inisialisasi publik
...
Kontrol_0 proses
cmp eax, SYS_DYNAMIC_DEVICE_INIT
jnz pendek chkSysDynExit
hubungi SysDynamicDeviceInit
cmp eax, 1
ret
;-------------
chkSysDynKeluar:
cmp eax, SYS_DYNAMIC_DEVICE_EXIT
jnz pendek chkDevIOCtl
hubungi SysDynamicDeviceExit
cmp eax, 1
ret
;-------------
chkDevIOCtl:
cmp eax, W32_DEVICEIOCONTROL
jnz loc_ret pendek
dorong esi
dorong edx
pushebx
pushecx
panggil W32DeviceIoControl
cmp eax, 1
ret
;-------------
lokasi_ret:
kl
ret
Kontrol_0 akhirp
@@MenanganiAkhirnya:
@inisialisasi:
membasahi
_LTEXT berakhir
AKHIR
Delphi akan memanggil prosedur eksternal HandleFinaly dan inisialisasi untuk inisialisasi/finalisasi unit, meskipun inisialisasi/finalisasi tidak ada di unit. Oleh karena itu, kami membuat entri prosedur eksternal kosong di file startup perakitan.
Unit program Delphi utama (vxdProcs.pas)
...
procedure ShellMessage(Handle, Flags : integer; const Pesan, Keterangan : PChar;
Panggilan Balik, Data Referensi : penunjuk);
asm
mov ebx, Menangani // menangani mesin virtual
mov eax, Flags // bendera kotak pesan
mov ecx, Pesan // alamat teks pesan
mov edi, Caption // alamat teks caption
mov esi, Panggilan Balik // alamat panggilan balik
mov edx,ReferenceData // data referensi untuk panggilan balik
int 20H // VxDCall
hh 170004h // Shell_Message
akhir;
fungsi SysDynamicDeviceInit: INTEGER;
mulai
ShellMessage(0, $10, Hak Cipta, 'SysDynInit: Halo dari Delphi VxD !!!', nihil, nihil);
Hasil := VXD_SUCCESS;
akhir;
fungsi SysDynamicDeviceExit: INTEGER;
mulai
ShellMessage(0, $10, Hak Cipta, 'SysDynDevExit: Selamat tinggal dari Delphi VxD !!!', nihil, nihil);
Hasil := VXD_SUCCESS;
akhir;
fungsi W32DeviceIoControl(dwService : INTEGER;
dwDDB : BULAT;
hPerangkat: INTEGER;
lpDIOCParms : penunjuk) : BULAT;
mulai
ShellMessage(0, $10, Hak Cipta, 'W32DevIOCtl', nihil, nihil);
jika (dwService = DIOC_OPEN) maka
mulai
Hasil := NO_ERROR;
akhir
lain jika (dwService = DIOC_CLOSEHANDLE) lalu
mulai
Hasil := VXD_SUCCESS;
akhir
lain jika (dwService > MAX_PASVXD_W32_API) lalu
mulai
Hasil := ERROR_NOT_SUPPORTED;
akhir
kalau tidak
mulai
Hasil := VXD_SUCCESS;
akhir;
akhir;
...
[Penerjemah: Oke, driver perangkat VxD sederhana telah ditulis. Anda dapat menggunakannya sebagai templat untuk menulis driver perangkat VxD. ]
Lampiran 1: Make.bat
D:VISUAL~198DDKBINWin98ml -coff -DBLD_COFF -DIS_32 -W2 -c -Cx -Zm -DMASM6 vxdmain.asm
hubungi dcc3.bat -J vxdprocs.pas
D:VISUAL~198DDKBINlink /DEF:vxddef.def /VXD vxdmain.obj vxdprocs /OUT:delphiio.vxd
Lampiran 2:
Sekarang mari kita tulis program pengujian untuk VxD, dengan dua tombol: satu untuk membuka VxD; satu lagi untuk menutup VxD.
konstanta
VxDName = '/.DELPHIIO.VXD';
...
fungsi TVxDTestForm.OpenVxDDriver: boolean;
mulai
HVxDHandle := BuatFile(VxDName,0,0,nil,0,FILE_FLAG_DELETE_ON_CLOSE,0);
Hasil := HVxDHandle <> INVALID_HANDLE_VALUE;
akhir;
prosedur TVxDTestForm.CloseVxDDriver;
mulai
jika HVxDHandle <> INVALID_HANDLE_VALUE maka mulailah
CloseHandle(HVxDHandle);
HVxDHandle := INVALID_HANDLE_VALUE;
akhir;
akhir