머리말
Delphi 3.0을 사용하여 VxD 장치 드라이버를 작성합니다. Delphi 3에서는 컴파일되고 통과됩니다. Delphi 2에서는 테스트가 없습니다. Delphi 4에서 생성된 개체 파일 M$ Linker 5.12.8181은 인식할 수 없습니다. 의 Macro Assembler ver. 6.11d, 링커는 M$ Incremental Linker ver. 5.12.8181입니다. , Windows 98DDK(http://www.microsoft.com/ddk/ddk98.htm)에서 제공됩니다.
소개하다
Windows용 VxD 장치 드라이버에는 두 가지 유형이 있습니다.
1. 운영 체제에 로드되고 메모리에 영구적으로 존재하는 정적 VxD.
2. 필요할 때 메모리에 로드되는 동적 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 함수.
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
외부 W32DeviceIoControl:PROC
...
공개 DELPHIIO_DDB
공개 @@HandleFinally
공개 @초기화
...
Control_0 프로세스
cmp eax, SYS_DYNAMIC_DEVICE_INIT
jnz 짧은 chkSysDynExit
SysDynamicDeviceInit 호출
cmp eax, 1
반환
;-------------
chkSysDynExit:
cmp eax, SYS_DYNAMIC_DEVICE_EXIT
jnz 짧은 chkDevIOCtl
SysDynamicDeviceExit에 전화하세요.
cmp eax, 1
반환
;-------------
chkDevIOCtl:
cmp eax, W32_DEVICEIOControl
jnz 짧은 loc_ret
푸시 esi
푸시 edx
pushebx
푸시섹
W32DeviceIoControl 호출
cmp eax, 1
반환
;-------------
loc_ret:
클씨
반환
Control_0 끝
@@HandleFinally:
@초기화:
리트
_LTEXT 끝
끝
Delphi는 초기화/종료가 유닛에 존재하지 않는 경우에도 유닛의 초기화/종료를 위해 외부 프로시저인 HandleFinaly 및 초기화를 호출합니다. 따라서 어셈블리 시작 파일에 빈 외부 프로시저 항목을 만듭니다.
메인 델파이 프로그램 유닛(vxdProcs.pas)
...
절차 ShellMessage(핸들, 플래그: 정수; const 메시지, 캡션: PChar;
콜백, ReferenceData : stdcall 어셈블러;
asm
mov ebx, Handle // 가상 머신 핸들
mov eax, 플래그 // 메시지 상자 플래그
mov ecx, Message // 메시지 텍스트의 주소
mov edi, Caption // 캡션 텍스트의 주소
mov esi, 콜백 // 콜백 주소
mov edx, ReferenceData // 콜백 참조 데이터
int 20H // VxDCall
dd 170004h // Shell_Message
끝;
함수 SysDynamicDeviceInit: INTEGER;
시작하다
ShellMessage(0, $10, Copyright, 'SysDynInit: Hello from Delphi VxD !!!', nil, nil);
결과 := VXD_SUCCESS;
끝;
함수 SysDynamicDeviceExit: INTEGER;
시작하다
ShellMessage(0, $10, Copyright, 'SysDynDevExit: Delphi VxD에서 안녕 !!!', nil, nil);
결과 := VXD_SUCCESS;
끝;
함수 W32DeviceIoControl(dwService : INTEGER;
dwDDB : 정수;
h장치: INTEGER;
lpDIOCParms : 포인터) : INTEGER;
시작하다
ShellMessage(0, $10, 저작권, 'W32DevIOCtl', nil, nil);
if (dwService = DIOC_OPEN) 그러면
시작하다
결과 := NO_ERROR;
끝
그렇지 않은 경우 (dwService = DIOC_CLOSEHANDLE) 그러면
시작하다
결과 := VXD_SUCCESS;
끝
그렇지 않으면 (dwService > MAX_PASVXD_W32_API)
시작하다
결과 := 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
dcc3.bat -J vxdprocs.pas를 호출하십시오.
D:VISUAL~198DDKBINlink /DEF:vxddef.def /VXD vxdmain.obj vxdprocs /OUT:delphiio.vxd
부록 2:
이제 두 개의 버튼이 있는 VxD용 테스트 프로그램을 작성해 보겠습니다. 하나는 VxD를 여는 버튼이고 다른 하나는 VxD를 닫는 버튼입니다.
const
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;
끝;
끝