阅读:1226回复:0
问个驱动和应用程序通讯的问题
我做了一个NDIS HOOK的驱动,和一个输出TCP连接的应用程序,我采用事件作为通讯的方式。
现在的问题是: 我在应用程序中输出的连接数量要小于驱动中采用dbgprint输出的连接数量。我初步怀疑当驱动激活应用程序后,应用程序处理去了,但是这时驱动中又有下一个数据包但是还没来得及同步,所以就直接通过了。一句话就是驱动和应用程序没有完全同步。 我应该怎么做,等到驱动激活应用程序时处于挂起状态,直到应用程序处理完毕在往下走呢? 我得代码在下面 应用层: while (1) { WaitForSingleObject(pThis->m_hEvent,INFINITE); i++; pIp = (PIPHEADER)pThis->m_pShareMemory; sprintf(srcip,\"%03d.%03d.%03d.%03d\",pIp->SourceIp[0], pIp->SourceIp[1], pIp->SourceIp[2], pIp->SourceIp[3]); sprintf(destip,\"%03d.%03d.%03d.%03d\",pIp->DestinationIp[0], pIp->DestinationIp[1], pIp->DestinationIp[2], pIp->DestinationIp[3]); sprintf(nuo,\"%d\",i); pThis->AddRow(srcip,nuo,destip,\"1\"); //设置事件对象为无信号状态 DeviceIoControl(pThis->m_hDevice, IO_CLEAR_EVENT, NULL, 0, NULL, 0, &dwReturn, NULL ); } 驱动层 __try{ __try{ if (IS_APP_MONITOR ==1 ) { //如果监控但是有信号 while (gxEvent==NULL) ; memset(m_systemAddress,0,sizeof(IPHEADER)); memcpy(m_systemAddress,(char *)pIpHeader,sizeof(IPHEADER)); KeSetEvent(gxEvent,0,FALSE); } } except(EXCEPTION_EXECUTE_HANDLER){ DbgPrint(\"Have Exception\\n\"); } } finally{}; |
|