C++语言的VxD与外界通信的所有接口

http://tech.ddvip.com   2006年03月31日    社区交流

本文详细介绍C++语言的VxD与外界通信的所有接口

  应用程序先用CreateFile打开VxD,后用DeviceIoControl使VMM发送W32_DEVICEIOCONTROL消息给VxD:

  HANDLE h;char ibuf[2],obuf[2];BOOL r;DWORD oc;OVERLAPPED o;

  h=CreateFile("\\\\.\\my.vxd",0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0);

  //打开静态my.VxD,或动态装入my.VxD

  r=DeviceIoControl(h,命令码C,ibuf,sizeof(ibuf),obuf,sizeof(obuf),&oc,NULL或&o);

  /*与my.VxD的事件过程OnW32DeviceIoControl交换数据,用ibuf向VxD传数据,用obuf从VxD取数据,VxD传回的数据总量放在oc中*/

  CloseHandle(h);//关闭或动态卸下VxD

  my.VxD应在Windows 95 control messages页上选W32_DEVICEIOCONTROL事件,

  在DWORD MyDevice::OnW32DeviceIoControl(PIOCTLPARAMS p)事件过程中写:

  switch(p->dioc_IOCtlCode){

  case 命令码C:

  用p指向的IOCTLPARAMS结构,与应用程序交换数据;

    if (成功) return(0); /*使DeviceIoControl的返回值r为TRUE*/
    else return(1);
    default:
    return(0);
   }

  以上做法要求VxD立即交换数据(同步通讯),值FILE_FLAG_DELETE_ON_CLOSE指明CloseHandle将不在内存中保留引用记数为0的VxD。

  VxD也可延迟交换数据,此时,应用程序先传值FILE_FLAG_DELETE_ON_CLOSE|FILE_FLAG_OVERLAPPED

  到CreateFile,用o.hEvent=CreateEvent(0,TRUE,0,NULL)创建事件,再传o的地址到DeviceIoControl,然后用GetOverlappedResult(h,&o,&oc,TRUE)在o上睡眠。

  此时,p->lpoOverlapped一定大于0,VxD可用VMM服务_LinPageLock,按页上锁p->dioc_InBuf指向的应用程序ibuf区,p->dioc_OutBuf指向的obuf区,p->lpoOverlapped指向的o结构。要交换数据时,可置数据及数据总量到p->dioc_OutBuf及p->lpoOverlapped->O_InternalHigh,然后调用VMM服务VWIN32_DIOCCompletionRoutine(p->lpoOverlapped->O_Internal)唤醒应用程序。

责编:豆豆技术应用

正在加载评论...