主 delphi 程序单元(vxdprocs.pas)
...
procedure shellmessage(handle, flags : integer; const message, caption : pchar;
callback, referencedata : pointer); stdcall; assembler;
asm
movebx, handle// virtual machine handle
moveax, flags// message box flags
movecx, message// address of message text
movedi, caption// address of caption text
movesi, callback// address of callback
movedx, referencedata// reference data for callback
int20h// 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,你可以改。
上一页 [1] [2]
责任编辑:小草