chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1596回复:9

数据包NdisMIndicateReceivePacket这种情况下怎么不行呢?

楼主#
更多 发布于:2004-06-02 17:32
我在passthru的基础上把在ptRecieve和PtTransferDataComplete中把收到数据包后保存在自己的队列中不向上指示,然后把这些数据传给应用程序分析后在通过io事件通知底层数据包出队列,决定向上指示还是直接抛弃。在ptRecieve(packetsize=lookaheadsize)和PtTransferDataComplete(packetsize>lookaheadsize)中保存
if (SaveToPacketQueue(pPacketQueue,ProtocolBindingContext,&Packet,&pPacketContent,PacketLen,DIRECTION_RECEIVE)==0){...}
SaveToPacketQueue用于保存收到的数据包的信息,包括下面内容
typedef struct _PACKET_MAP //定义数据包映射表
{
  NDIS_HANDLE ProtocolBindingContext;
  PNDIS_PACKET Packet;
  PVOID Address;
  UINT Size;
  UINT Direct;
}PACKET_MAP,*PPACKET_MAP;
然后在IRP_MJ_DEVICE_CONTROL中如果允许则
QueuePacketPass(pPacketQueue); //允许环形队列中的头数据包发送,调用NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &pPacket, 1);
可是我在用ping(icmp包)测试的时候如果指定包的长度<1473则能够ping通,否则不通,搞了很久还没找到原因,希望高手指点!




chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-03 17:47
但是我是想在下层抓包后让上层组包对应用层协议分析(http\\smtp\\pop3\\telnet\\dns\\icq等应用协议),如果在驱动中开发这些协议分析估计比较费时间.同时要求对包进行动作处理(抛弃\\通过)等,而且还要有简易的防火墙功能啊,怎么驱动和应用程序通讯要耗比较多时间吗?看来还有不少不可预见的问题啊


[编辑 -  6/3/04 by  chili]
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-03 17:26
数据送到应用层没办法提高速度。因为系统要做好多事情,况且还要使用内核对象,内核对象本身也是极其费事的。
直接在驱动中处理数据就可以了,VPN,防火墙都这么做,一定是可行的。
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-03 14:29
可是只要我在驱动中用keSetEvent通知应用程序有数据包(上面什么都不处理就是发个IO_PACKET_PASS_EVENT)的时候就会出现上面所说的情况啊....,该以怎样的方式和应用程序通讯呢?
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-03 13:29
非常感谢asmsys老大的指点,我在驱动中进队列后直接出队列(把传到应用程序处理的代码去掉后)ping 包的长度没限制都可以了终于找到问题所在了,后面的工作就改变传给应用程序数据的方法了。
非常感谢!!!
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-03 11:27
是不是只要我加快对数据包的处理还是可以解决这种问题的(我准备把它搞到网关那里的)?
这个还要你试试。
一般NDIS_STATUS_RESOUR标志的时候要求上层立即拷贝包并返回,这个一般大致是什么数量级呢?
COPY1500个字节的数量级。
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-03 10:41
是不是只要我加快对数据包的处理还是可以解决这种问题的(我准备把它搞到网关那里的)?一般NDIS_STATUS_RESOUR标志的时候要求上层立即拷贝包并返回,这个一般大致是什么数量级呢?看来得优化代码了
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-03 10:19
大体思路就这样,只要把包COPY出来就好了。
另外,如果处理队列的时间过长,TIME OUT是必然的。
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-03 10:13
啊 这样啊,那我的设计是不是要做调整了?这种情况有什么办法解决吗??
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-06-03 09:49
如果是ptRecievePacket中的包可以这么做,没有问题,因为此时拥有对包的所有权。
但PTreceive和PtTransferDataComplete的组合被使用,有一个重要的原因就是下层的小端口
举包的时候使用了NDIS_STATUS_RESOURCE标志,这意味着下层的小端口的资源紧张,要求上层立即拷贝包并返回,此时包的所有权没有交上来,等你在队列中处理包时,该包很可能已经被下一批数据使用了。
游客

返回顶部