ljc1007
驱动牛犊
驱动牛犊
  • 注册日期2001-08-23
  • 最后登录2005-07-07
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1885回复:4

极富挑战性:NDIS IM Driver蓝屏问题?

楼主#
更多 发布于:2004-09-07 12:58
用Driver Strudio的Network Wizard生成了IM Driver,在OnReceive里对接收到的数据包做了些改动(例如,IP地址,端口等),然后又通过ForwardDown发送回去,自己分配的Packet Discriptor,缓冲区使用的是NDIS Frame的,如下代码所示:

// Allocate the buffer discriptro
KNdisBuffer b=m_BufferPool.Allocate((PVOID)pstruEtherHeader,(HeaderBufferSize+PacketSize));

if (b.IsValid())
{
     KNdisPacket p = m_TxPacketPool.Allocate();
     if (p.IsValid())
     {
        // Valid packet
        p.ChainAtFront((PNDIS_BUFFER)b);
      
        // Set the flag [6/24/2004]
        p.SetFlags(0);

       // Store the KNdisBuffer pointer=b [6/23/2004]
       m_TxPacketPool.GetContext(p)->bufPacket = b;

       ForwardDown(p);

       return NDIS_STATUS_NOT_ACCEPTED;
     }
     else
     {
         // Invalid Packet discriptor, Release the buffer
         m_BufferPool.Free(b);
     }
}

在OnSendComplete(PNDIS_PACKET pPacket, NDIS_STATUS Status)里释放Buffer和Packet Discriptor
if(m_TxPacketPool.IsFrom(pPacket))
{
   // Free the buffer [6/23/2004]
   KNdisBuffer b = m_TxPacketPool.GetContext(pPacket)->bufPacket;
   if (b.IsValid())
   {
    m_BufferPool.Free(b);
   }

   // Release my packet pool [6/9/2004]
   KNdisPacket::Reinitialize(pPacket);
   m_TxPacketPool.Free(pPacket);
}
运行一段时间(接收了大量数据包)之后,出现蓝屏,提示:IRQL_NO_LESS_OR_EQUAL错误,不知是什么问题?
哪位高手指点,必高分酬谢!

同意
ljc1007
驱动牛犊
驱动牛犊
  • 注册日期2001-08-23
  • 最后登录2005-07-07
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-09 13:16
军中无人啊!
同意
sword3i
驱动牛犊
驱动牛犊
  • 注册日期2003-07-25
  • 最后登录2013-01-07
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望112点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-09 17:24
这么多内存操作,只给一段代码很难看出来
随风奔跑自由是方向 追逐雷和闪电的力量 把浩瀚的海洋装进我胸膛 即使再小的帆也能远航 随风飞翔有梦作翅膀 敢爱敢做勇敢闯一闯 哪怕遇见再大的风险再大的浪 也会有默契的目光 努力蹭分! ..................
right_wind
驱动中牛
驱动中牛
  • 注册日期2001-10-12
  • 最后登录2018-05-29
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望66点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2004-09-14 23:10
主要检查一下是否有内存复制时是否越界了,另外就是检查内核函数的IRQL级是否满足。
good good study, day day up。
xz_clark
驱动牛犊
驱动牛犊
  • 注册日期2004-09-17
  • 最后登录2004-10-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-18 05:24
你这个错误肯定是在IRQ_DISPATCH_LEVEL干了些只能在IRQ_PASSIVE_LEVEL干的事,查一查在这个code path里你可能调用到的NDIS function,看有没有要求在IRQL < IRQ_DISPATACH 下完成的。

另外,你没分析一下Crash Dump吗?
游客

返回顶部