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)唤醒应用程序。
责编:豆豆技术应用