阅读:1943回复:9
新手急问:如何使用内存中数据构造一个NDIS_PACKET?(15分)
小弟做一个邮件过滤驱动,将邮件数据拦截下来写入临时文件后进行病毒扫描,然后需要将该文件读出重新组包再发给应用程序。现在不知该如何将一块内存中的数据构造成一个NDIS_PACKET,请大虾指教!一并请教还有哪些注意事项,谢谢!
[编辑 - 9/7/04 by EvilRyu] |
|
沙发#
发布于:2004-09-20 16:22
呵呵,我也是刚刚接触NDIS不久,菜鸟一个,至于构包的细节你可以研究论坛上前辈高人的代码
zxcasd说的pending问题,我没有做过特别大的数据包的测试,不过我可以说说:自己正在写的一个网卡数据嗅探过滤器的实现 我在驱动加载后,生成共享内存与应用层进行通讯,然后通过驱动和应用层共同维护的循环队列来管理这段共享内存(在驱动层过滤数据包后push至队列,应用层pop数据包),在应用层单独有个线程负责得到驱动改队列的数据(我是通过内核与应用层共享的信号量来通知合适读取数据),基于上面的实现,我基本可以完全能实时监控网络数据 当然,我的这个实现只是针对单个的网络包进行分析,不知如果是大邮件的话,是否需要把邮件所有的网络数据包在ndis中并截获分析?如果真需要的话,那我认为可能会是应用层产生pending, 呵呵,不知zxcasd有没有什么更好的办法解决 [编辑 - 9/20/04 by sword3i] [编辑 - 9/20/04 by sword3i] |
|
|
板凳#
发布于:2004-09-20 11:30
呵呵 小弟正在思考着跟问题,zxcasd兄能给个建议吗?还有构包方面的问题 如果不介意 能留个qq吗?小弟的8331654 呵呵
|
|
地板#
发布于:2004-09-20 11:13
sword3i大虾真不好意思 我的帖子发完好几天没人回 还以为没人理我 今天才看到你的回答 你说的过程能够更加详细一点吗?还有zxcasd大虾的意思可能是上层的应用程序如果不挂起的话,如果邮件过大,可能导致会话超时而使应用程序中断会话 是这个意思吗? 是这个意思啊。。。呵呵,你不会是做阻塞的吧。。。 [编辑 - 9/20/04 by zxcasd] |
|
|
地下室#
发布于:2004-09-20 10:25
sword3i大虾真不好意思 我的帖子发完好几天没人回 还以为没人理我 今天才看到你的回答 你说的过程能够更加详细一点吗?还有zxcasd大虾的意思可能是上层的应用程序如果不挂起的话,如果邮件过大,可能导致会话超时而使应用程序中断会话 是这个意思吗?
ps:分现在就给两位 呵呵 |
|
5楼#
发布于:2004-09-10 09:29
你为什么要让你的应用层线程挂起呢? 不太明白你的意思,呵呵
|
|
|
6楼#
发布于:2004-09-09 19:55
[quote][quote]小弟做一个邮件过滤驱动,将邮件数据拦截下来写入临时文件后进行病毒扫描,然后需要将该文件读出重新组包再发给应用程序。现在不知该如何将一块内存中的数据构造成一个NDIS_PACKET,请大虾指教!一并请教还有哪些注意事项,谢谢! 先抛开构造NDIS_PACKET的问题,你有想过这个邮件过滤驱动如何实现pending上面的应用程序吗? [/quote] 你说的pending是只ndispacket的pending状态吗?,如果是他完全可以在receivecomplete和returnpackets里进行处理 [/quote] 不是,我说的pending是指让上面的应用程序处于一种挂起的状态,并不是对ndispacket的状态而言。 |
|
|
7楼#
发布于:2004-09-09 17:45
[quote]小弟做一个邮件过滤驱动,将邮件数据拦截下来写入临时文件后进行病毒扫描,然后需要将该文件读出重新组包再发给应用程序。现在不知该如何将一块内存中的数据构造成一个NDIS_PACKET,请大虾指教!一并请教还有哪些注意事项,谢谢! 先抛开构造NDIS_PACKET的问题,你有想过这个邮件过滤驱动如何实现pending上面的应用程序吗? [/quote] 你说的pending是只ndispacket的pending状态吗?,如果是他完全可以在receivecomplete和returnpackets里进行处理 |
|
|
8楼#
发布于:2004-09-09 17:34
小弟做一个邮件过滤驱动,将邮件数据拦截下来写入临时文件后进行病毒扫描,然后需要将该文件读出重新组包再发给应用程序。现在不知该如何将一块内存中的数据构造成一个NDIS_PACKET,请大虾指教!一并请教还有哪些注意事项,谢谢! 先抛开构造NDIS_PACKET的问题,你有想过这个邮件过滤驱动如何实现pending上面的应用程序吗? |
|
|
9楼#
发布于:2004-09-09 17:12
首先你需要分配一个packetpool-NdisDprAllocatePacket,然后调用NdisAllocatePacket或NdisDprAllocatePacket就可以了,注意已经分配包描述符与缓冲描述符关联,这你可以看看论坛上的前辈高人的代码
呵呵,赶快给分 |
|
|