序文
Delphi 3.0 を使用して VxD デバイス ドライバを作成します。Delphi 3 でコンパイルおよびパスします。Delphi 2 ではテストはありません。Delphi 4 で作成されたオブジェクト ファイル M$ Linker 5.12.8181 は認識できません。のマクロ アセンブラ バージョン 6.11d、リンカは M$ インクリメンタル リンカ バージョン 5.12.8181 です。 、これらは Windows 98DDK (http://www.microsoft.com/ddk/ddk98.htm) から来ています。
導入
Windows には 2 種類の VxD デバイス ドライバーがあります。
1. 静的 VxD。オペレーティング システムにロードされ、メモリ内に永続的に存在します。
2. 動的 VxD。必要に応じてメモリにロードされます。使用後、VxD を閉じてメモリを解放します。
InPRise Delphi には、あらゆるタイプの VxD デバイス ドライバーを作成する機能があります。以下では、動的 VxD を作成する方法を紹介します。
Win32 アプリケーションが VxD の「仮想」デバイスを開くと、VWIN32 は LoadDevice を使用して VxD をメモリにロードし、メッセージ W32_DEVICEIOCONTROL を作成して VxD に送信します。
言い換えれば、VxD は少なくとも次の 2 つのシステム メッセージに応答し、次の関数のいずれかを記述する必要があります。
SYS_DYNAMIC_DEVICE_INIT
SYS_DYNAMIC_DEVICE_EXIT
W32_DEVICEIOCONTROL 関数。
VxD をロードしようとするとメッセージ SYS_DYNAMIC_DEVICE_INIT が 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 は、VxD が DeviceIoControl 関数によって呼び出されるときに、別の関数呼び出し (dwIoControlCode によって与えられる) を意味します。
開始モジュール (vxdmain.asm)
...
extrn SysDynamicDeviceInit:PROC
extrn SysDynamicDeviceExit:PROC
extrn W32DeviceIoControl:PROC
...
パブリック DELPHIIO_DDB
パブリック @@HandleFinally
パブリック @initialization
...
Control_0 プロセス
cmp eax、SYS_DYNAMIC_DEVICE_INIT
jnz short chkSysDynExit
SysDynamicDeviceInit を呼び出す
cmp eax、1
戻る
;---------------
chkSysDyn終了:
cmp eax、SYS_DYNAMIC_DEVICE_EXIT
jnz ショート chkDevIOCtl
SysDynamicDevice を呼び出すExit
cmp eax、1
戻る
;---------------
chkDevIOCtl:
cmp eax、W32_DEVICEIOCONTROL
jnz ショート loc_ret
プッシュESI
プッシュEDX
プッシュセブ
プッシュエク
W32DeviceIoControl を呼び出す
cmp eax、1
戻る
;---------------
loc_ret:
clc
戻る
Control_0 エンドプ
@@ハンドル最後に:
@初期化:
レット
_LTEXT が終了します
終わり
Delphi は、ユニットに初期化/終了処理が存在しない場合でも、ユニットの初期化/終了処理のために外部プロシージャ HandleFinaly と初期化を呼び出します。したがって、アセンブリ起動ファイルに空の外部プロシージャ エントリを作成します。
メインの Delphi プログラム ユニット (vxdProcs.pas)
...
プロシージャ ShellMessage(Handle, Flags : integer; const Message, Caption : PChar;
コールバック、ReferenceData : ポインタ);
アズム
mov ebx, Handle // 仮想マシンのハンドル
mov eax, Flags // メッセージ ボックスのフラグ
mov ecx, Message // メッセージテキストのアドレス
mov edi, Caption // キャプションテキストのアドレス
mov esi, Callback // コールバックのアドレス
mov edx, ReferenceData // コールバック用の参照データ
int 20H // VxDCall
dd 170004h // シェルメッセージ
終わり;
関数 SysDynamicDeviceInit: INTEGER;
始める
ShellMessage(0, $10, 著作権, 'SysDynInit: Delphi VxD からこんにちは !!!', nil, nil);
結果 := VXD_SUCCESS;
終わり;
関数 SysDynamicDeviceExit: INTEGER;
始める
ShellMessage(0, $10, Copyright, 'SysDynDevExit: Delphi VxD からさようなら !!!', nil, nil);
結果 := VXD_SUCCESS;
終わり;
function W32DeviceIoControl(dwService : INTEGER;
dwDDB : 整数;
hデバイス: 整数;
lpDIOCParms : ポインタ) : INTEGER;
始める
ShellMessage(0, $10, 著作権, 'W32DevIOCtl', nil, nil);
if (dwService = DIOC_OPEN) then
始める
結果 := NO_ERROR;
終わり
else if (dwService = DIOC_CLOSEHANDLE) then
始める
結果 := VXD_SUCCESS;
終わり
else if (dwService > MAX_PASVXD_W32_API) then
始める
結果 := ERROR_NOT_SUPPORTED;
終わり
それ以外
始める
結果 := VXD_SUCCESS;
終わり;
終わり;
...
[翻訳者: わかりました。簡単な VxD デバイス ドライバーが作成されました。これは、VxD デバイス ドライバーを作成するためのテンプレートとして使用できます。 ]
付録 1: Make.bat
D:VISUAL~198DDKBINWin98ml -coff -DBLD_COFF -DIS_32 -W2 -c -Cx -Zm -DMASM6 vxdmain.asm
call dcc3.bat -J vxdprocs.pas
D:VISUAL~198DDKBINlink /DEF:vxddef.def /VXD vxdmain.obj vxdprocs /OUT:delphiio.vxd
付録 2:
次に、2 つのボタンを備えた VxD のテスト プログラムを作成しましょう。1 つは VxD を開き、もう 1 つは VxD を閉じます。
定数
VxDName = '/.DELPHIIO.VXD';
...
関数 TVxDTestForm.OpenVxDDriver: ブール値;
始める
HVxDHandle := CreateFile(VxDName,0,0,nil,0,FILE_FLAG_DELETE_ON_CLOSE,0);
結果 := HVxDHandle <> INVALID_HANDLE_VALUE;
終わり;
プロシージャ TVxDTestForm.CloseVxDDriver;
始める
HVxDHandle <> INVALID_HANDLE_VALUE の場合、開始します
CloseHandle(HVxDHandle);
HVxDHandle := INVALID_HANDLE_VALUE;
終わり;
終わり