关于解决应用层提取NDIS驱动数据包丢包的方案,通过event加共享内存实现
截获的网络封包,很多时候都需要将包的信息或者是包的内容通过win32层显示出来,很多人想到的方法是event加IOCTL,不过这样很容易产生丢包的问题,因为网络接受发送数据包的速度原比event 和 IOCTL的速度要快,也就是说当一个event发到win32层时,win32层通过DeviceIoControl得到数据的时候,原来自己预先定义的缓冲区已经被覆盖了多少遍了。
(解决方法很简单,没必要写出来,只不过以前我初学的时候靠自己鼓捣出来的,就连代码都贴这里了,现在看来很傻就想删掉,不丢人现眼了,但是要删的时候还是发现最近的来源里还有人搜索关于丢包的,干脆把代码删除掉,思路重新写一些吧。)
大概是这个样子的,首先驱动自己创建一个队列用于存放获取到的数据包,加锁访问该队列保证同步。同时刚才说的event机制保留住,每次ring3获得event信号的时候下来访问队列,一直访问到队列为空才返回,继续等待信号,如此反复,个人机器上没问题的。