qaymuic
驱动牛犊
驱动牛犊
  • 注册日期2003-02-04
  • 最后登录2008-07-28
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望6点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1177回复:0

如何更改KNdisPacket中的数据?

楼主#
更多 发布于:2008-06-10 08:54
NDIS_STATUS PacketFilterAdapter::OnSend(const KNdisPacket& Original, KNdisPacket& Repackaged)
{
         //复制所有数据到m_Buf
    unsigned char m_Buf[1514];
    unsigned long n_buflen=0;
    KNdisBuffer n_buf=Original.QueryFirstBuffer();
    while(n_buf.IsValid() && n_buflen<1514)
    {
        unsigned long blen=n_buf.Length();
        if(blen>(1514-n_buflen))
            blen=1514-n_buflen;
        memcpy(&m_Buf[n_buflen],n_buf.Address(),blen);
        n_buflen+=blen;
        n_buf=n_buf.GetNext();
    }
   //非TCP数据,过
    if(n_buflen<sizeof(_ETHeader)+sizeof(_IPHeader)+sizeof(_TCPHeader))
    {
        Repackaged.CloneDown(Original);
        return Status;
    }
    PETHeader pH=(PETHeader)m_Buf;
  //非IP协议,过
    if(pH->type!=0x8)
    {
        Repackaged.CloneDown(Original);
        return Status;
    }
    PIPHeader pIH=(PIPHeader)&m_Buf[sizeof(_ETHeader)];
 //非TCP协议,过
    if(pIH->ipProtocol!=6)
    {
        Repackaged.CloneDown(Original);
        return Status;
    }
    bool findbd=false;
    for(unsigned long pindex=sizeof(_ETHeader)+sizeof(_IPHeader)+sizeof(_TCPHeader);pindex<n_buflen-4;pindex++)
    {
        if(0==_strnicmp("baidu",(char*)&m_Buf[pindex],5))
        {
            m_Buf[pindex]='a';
            m_Buf[pindex+1]='b';
            m_Buf[pindex+2]='c;
            m_Buf[pindex+3]='d';
            m_Buf[pindex+4]='e';
            pindex+=4;
            findbd=true;
        }
    }
  //不包含baidu字样,过
    if(false==findbd)
    {
        Repackaged.CloneDown(Original);
        return Status;
    }
 //计算效验和
    ChecksumTCP((PIPHeader)&m_Buf[sizeof(_ETHeader)],(PTCPHeader)&m_Buf[sizeof(_ETHeader)+sizeof(_IPHeader)],(char*)&m_Buf[sizeof(_ETHeader)+sizeof(_IPHeader)+sizeof(_TCPHeader)],n_buflen-(sizeof(_ETHeader)+sizeof(_IPHeader)+sizeof(_TCPHeader)));

//现在的m_Buf应该是个完整的网络数据包,下面怎么写呢?

}
游客

返回顶部