驱动层主动发数据到应用层

上次转载的一片博客已经介绍了驱动层主动发送数据给应用层的方法,下面介绍的一种方法有点差异之处,上次的是在应用层创建事件对象,在驱动层创建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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值