lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1589回复:11

20分再问各位大侠,在定时器函数中发自定义包死机的问题

楼主#
更多 发布于:2003-07-30 15:33
我在IMD驱动中的定时器函数中调用NdisMIndicateReceivePacket函数向上发自定义包,使用softice调试,发现每次调用到该函数时机器会死机。

我自己分析会不会是因为定时器函数和ptreceive函数都调用NdisMIndicateReceivePacket造成冲突引起的啊?

有没有什么解决方法么? :(
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-30 16:35
自己顶一下 :)

还有一个情况,如果将包的status作如下设置:

NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);
系统不会死机,但是会影响上网和收发邮件,提示:“无法解析服务器ip地址”

不明白,困惑中

 :P
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-30 17:56
自己顶一下 :)

还有一个情况,如果将包的status作如下设置:

NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);
系统不会死机,但是会影响上网和收发邮件,提示:“无法解析服务器ip地址”

不明白,困惑中

 :P

设置RESOURCES表示低层网卡的资源不足,这时TCP协议栈回把收发包的速度马上降下来。导致丢包。
//这是我的想法,没有经过证实。
放弃瘟草,现吃李草
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-30 18:01
[quote]自己顶一下 :)

还有一个情况,如果将包的status作如下设置:

NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);
系统不会死机,但是会影响上网和收发邮件,提示:“无法解析服务器ip地址”

不明白,困惑中

 :P

设置RESOURCES表示低层网卡的资源不足,这时TCP协议栈回把收发包的速度马上降下来。导致丢包。
//这是我的想法,没有经过证实。 [/quote]

证实~~~
[color=red]大头鬼! :P[/color]
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-30 18:22
非常高兴得到证实。:)
放弃瘟草,现吃李草
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-30 19:01
if((Seconds-LiveSeconds)>20)//如果>20秒
{
 NdisDprAllocatePacket(&Status, &MyPacket, MyAdapt->RecvPacketPoolHandle);
 if(Status == NDIS_STATUS_SUCCESS)
 {
  NdisAllocateBuffer(&Status, &pPacketBuffer, MyAdapt->RecvBufferPoolHandle, m_BufferSystemVirtualAddress+Num*58, 54);// PacketLen
  if(Status == NDIS_STATUS_SUCCESS)
  {
   NdisChainBufferAtFront(MyPacket, pPacketBuffer);
   MyPacket->Private.Head->Next = NULL;
   MyPacket->Private.Tail = NULL;
   Rsvd=(PRSVD)(MyPacket->MiniportReserved);
   Rsvd->OriginalPkt = NULL;
   NDIS_SET_PACKET_HEADER_SIZE(MyPacket, 14);
   if(MyAdapt->MiniportHandle==NULL)
   {
    DBGPRINT(\"miniporthandle为空\\n\");
   }
//**   NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);
   NdisMIndicateReceivePacket(MyAdapt->MiniportHandle, &MyPacket, 1);
   NdisZeroMemory(m_BufferSystemVirtualAddress+Num*58,58);
   if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING)
   {
    NdisFreeBuffer(pPacketBuffer);
    NdisDprFreePacket(MyPacket);
   }
  }
 }
}
上面是我的代码,麻烦各位大侠看看为什么会死机?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-31 08:07
m_BufferSystemVirtualAddress这个东西在哪里申请的?
为什么释放包的时候,没有释放m_BufferSystemVirtualAddress,
m_BufferSystemVirtualAddress的总长度是多少?
放弃瘟草,现吃李草
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-31 09:22
这个m_BufferSystemVirtualAddress是一个全局的变量,在mphalt中释放资源。
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-31 09:29
90%错在这里了,你自己去找把,或者把m_BufferSystemVirtualAddress的那部分代码帖出来
放弃瘟草,现吃李草
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-07-31 09:39
这部分的代码不会有问题,具体的过程如下:

1、这个驱动如果只能虚拟一个rst包,也就是m_BufferSystemVirtualAddress中只保存最近的一个tcp连接的各特征项,如果我在定时器函数中在向上指示这个虚拟包时,设定
NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);
程序完全正常,好像也没有发现丢包的现象,而且完全实现我的要求:超时后断开tcp连接;

2、我把这个驱动修改成可以防御多包的tcp攻击时,就出现了上述问题。

因此我认为m_BufferSystemVirtualAddress中组建的包应该没有什么问题,我想应该是原理上的,也就是我这样自己组包发送原理的问题
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-07-31 09:49
我刚才又看了论坛中的一个帖子“部分源码,很精彩”
在ptreceive函数中有如下设置:

//
// Make sure the status is set to NDIS_STATUS_RESOURCES.
//
NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);

NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);

ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES);

这样作的目的是什么啊?
会不会也出现降低TCP协议栈收发包的速度啊?

以前有个测试:网卡本来走ptreceivepacket函数,结果把该标志设置后,就该走ptreceive了,上面是不是这样的考虑啊?

lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-07-31 11:16
谢谢各位大侠,放分先 :D
游客

返回顶部