上次转载的一片博客已经介绍了驱动层主动发送数据给应用层的方法,下面介绍的一种方法有点差异之处,上次的是在应用层创建事件对象,在驱动层创建MDL(内存描述符)来实现同步通信,而这次则是在应用层创建虚拟内存,驱动程序将虚拟地址转换成物理地址,然后再转成驱动程序能访问的虚拟地址,同样能达到内存共享的目的。
驱动层部分代码
switch (ioControlCode)
{
case 2001: //传入共享内存
{
buff = (UCHAR *)Irp->AssociatedIrp.SystemBuffer ;
memmove(&a,&buff[4],4);
output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);
break;
}
case 2002: //获取信号灯
{
buff = (UCHAR *)Irp->AssociatedIrp.SystemBuffer ;
memmove(&Appevent,&buff[0],4);
memmove(&Sysevent,&buff[4],4);
ObReferenceObjectByHandle(Appevent,GENERIC_ALL,NULL,KernelMode,&AppeventObject,NULL);
ObReferenceObjectByHandle(Sysevent,GENERIC_ALL,NULL,KernelMode,&SyseventObject,NULL);
break;
}
...
}
以上是应用层通过相应控制码传入事件和共享内存,接下来驱动层要主动放松内容给应用层
memmove(&output[0],&a,4);
KeSetEvent((PRKEVENT)AppeventObject,0,0);
KeWaitForSingleObject((PRKEVENT)SyseventObject,Executive,KernelMode,0,0);
KeResetEvent((PRKEVENT)SyseventObject);
memmove(&a,&output[4],4);