用Delphi编写VxD设备驱动程序

http://tech.ddvip.com   2006年07月30日    社区交流

本文详细介绍用Delphi编写VxD设备驱动程序

  主 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,你可以改。

责编:豆豆技术应用

正在加载评论...