驱动层和应用层的通信问题,关于共享内存的改变,如何相互通知,分不够可以再加
驱动层和应用层的通信问题,关于共享内存的改变,如何相互通知,分不够可以再加
问题是这样的:我想在驱动和应用程序间共享一块内存,由驱动将数据写入共享内存中,然后由事件通知应用程序去读内存,对其数据作出判断,并将结果写入这块内存中的第2位,并将第1位置成0表示处理过了。但是驱动总是不能及时读到应用程序做出的改变。
目前我们可以判定应用程序的写入驱动是可以读到的,可是我希望通过应用程序的改变来决定驱动程序中下一步怎么走,这需要很快,最好是立刻读到有改变动作并读取改变值
我曾经试过在应用层中修改后通过deviceiocontrol传到驱动层,驱动层读出变化来,后来证实这条路走不通,具体原因就不说了,但是可以知道的是至少在0.00004秒之内就改变了值
可是如果我在驱动层直接用while来等待,就会造成死机,我不知道是因为应用程序改变太慢造成的还是因为应用层和驱动层同时操作了一块共享内存造成的
于是我改用for语句10000*10000次循环来看看应用程序什么时候改变的值,遗憾的是这么多次读取全部说明了应用程序还没有做出改变,我算了一下,这么多次循环,已经超过0.0004秒了,理论上改变已经进行了
我现在比较迷惑,到底有什么办法能让我在驱动中很快获得应用层改变的动作并马上读取改变后的值?
附上基本代码
驱动程序里:
// 分配与应用程序共享的内存
SystemVirtualAddress = ExAllocatePool(NonPagedPool, 1500);
Mdl = IoAllocateMdl(SystemVirtualAddress, 1500, FALSE, FALSE, NULL);
MmBuildMdlForNonPagedPool(Mdl);
// 将分配的内存映射到用户进程地址空间,并返回地址。
case IO_GET_SHAREMEMORY_ADDR:
try
{
UserVirtualAddress = MmMapLockedPages(Mdl, UserMode);
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddress;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(PVOID);
}
except(EXCEPTION_EXECUTE_HANDLER){}
//读取相关代码
if(!KeReadStateEvent(gpEventObject))
{
// 复制数据到共享内存
memset(ip_packet, 0, 100);
memcpy(ip_packet, (char *)ip, sizeof(IP_PACKET));
KeSetEvent(gpEventObject, 0, FALSE);//通知应用程序读内存
DbgPrint("现在的信号态是%ld\n", KeReadStateEvent(gpEventObject));
ip = (p_u_char)SystemVirtualAddress;
//for(i=0;i<1000;i++)
DbgPrint("当前的p_ip->doing为%d %d %d\n", ip[0],ip[1],ip[2]);
}
else{return 1;}
DbgPrint("当前的p_ip->doing为%d %d %d\n", ip[0],ip[1],ip[2]);
DbgPrint("gpEventObject被传进来了 当前的p_ip->doing为%d\n", p_ip->doing);
return 1;
应用程序的相关改变代码:
DeviceIoControl(m_hDevice,
IO_GET_SHAREMEMORY_ADDR,
NULL,
NULL,
szOutputBuffer,
sizeof(szOutputBuffer),
&dwReturn,
NULL
);
psharememory = *((PVOID *)szOutputBuffer);
WaitForSingleObject(pThis->m_hEvent, INFINITE);
p_u_char ip = (p_u_char)pThis->psharememory;
fout<<(int)ip[28]<<' '<<(int)ip[29]<<' '<<(int)ip[30]<<' '<<(int)ip[31]<<endl;
if(ip[28] == 202 && ip[29] == 205 && ip[30] == 3)
{
ip[1]=1;;
}
ip[0]=0;