zhenxf
驱动牛犊
驱动牛犊
  • 注册日期2004-12-15
  • 最后登录2010-07-23
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1215回复:0

DriverNetWorks的加密发包代码

楼主#
更多 发布于:2005-08-02 11:05
  下面是将接收的数据加密,然后交给协议层的代码,问题是如果加密后的数据长度小于等于收到的数据,则成功发送,否则,进入了死循环,不知道如何解决,请大侠指点,谢谢!

NDIS_STATUS MyAdapter::OnReceive
(const KNdisPacket& Original, KNdisPacket& Repackaged)
{
       TRACE("OnReceive() %ul bytes\n", (ULONG) Original.QueryTotalLength());
      
       // This implementation simply points the Repackaged to the buffers of the
       // Original and forwards it over the binding.
       NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
      
       Repackaged.CloneUp(Original);
      
       KNdisPacket MyPacket = m_RxPool.Allocate();
       if (MyPacket.IsValid())
       {
              bool b = CreateNewPacket(Repackaged, MyPacket);
              if (b)
              {
                     NDIS_SET_ORIGINAL_PACKET((PNDIS_PACKET)MyPacket, NDIS_GET_ORIGINAL_PACKET((PNDIS_PACKET)Repackaged));

                     MyPacket.SetFlags(Repackaged.GetFlags());

                     m_RxPool.GetContext(MyPacket)->FrameworkPacket = Repackaged;
                    
                     ForwardUp(MyPacket);
                     Status = NDIS_STATUS_NOT_ACCEPTED;
              }
              else
              {
                     m_RxPool.Free(MyPacket);
              }
       }

       return Status;
      
}

VOID MyAdapter::OnReturnPacket(PNDIS_PACKET pPacket)
{
       // OnReturnPacket will not be called if private packet pool is not implemented because
       // DriverNetworks RePackaged will be recycled in KNdisFilterAdapter::ReturnPacket
      
       ASSERT (m_RxPool.IsFrom(pPacket));
      
       KNdisPacket Repackaged = m_RxPool.GetContext(pPacket)->FrameworkPacket;
       ASSERT(Repackaged.IsValid());

       // Recycle our own packet
       PUCHAR pPacketContent;
       PNDIS_BUFFER PacketBuffer;
       UINT bufLength;
      
       NdisUnchainBufferAtFront(pPacket, &PacketBuffer);
       NdisQueryBufferSafe(PacketBuffer, (PVOID *)&pPacketContent, &bufLength, 32);
      
       NdisFreeMemory(pPacketContent, BUFFER_SIZE, 0);
       m_Pool.Free(PacketBuffer);
      
       KNdisPacket::Reinitialize(pPacket);
       m_RxPool.Free(pPacket);
      
       // return Repackaged to the framework/originating miniport
       if (Repackaged.IsValid())
       {
              KNdisFilterAdapter::ReturnPacket(Repackaged);
       }
}
游客

返回顶部