caichenxiaoqian
驱动牛犊
驱动牛犊
  • 注册日期2008-04-09
  • 最后登录2008-05-05
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1747回复:3

关于NDIS修改数据包的问题

楼主#
更多 发布于:2008-04-14 18:50
以下是我的代码,我在protocolHeader.h中定义了各种结构体
但是编译的时候,总是说这个结构体对象没有定义(包含了头文件的,而且放在precomp。h也试过)
NDIS_STATUS
MPSend(
    IN    NDIS_HANDLE                MiniportAdapterContext,
    IN    PNDIS_PACKET            Packet,
    IN    UINT                    Flags
    )
{
    PADAPT            pAdapt = (PADAPT)MiniportAdapterContext;
    NDIS_STATUS        Status;
    PNDIS_PACKET    MyPacket;
    PRSVD            Rsvd;
    PVOID            MediaSpecificInfo = NULL;
    ULONG            MediaSpecificInfoSize = 0;

    
    ASSERT (pAdapt->pSecondaryAdapt);

    pAdapt = pAdapt->pSecondaryAdapt;


    if (IsIMDeviceStateOn (pAdapt) == FALSE)
    {
        return NDIS_STATUS_FAILURE;
    }


    NdisAllocatePacket(&Status,
                       &MyPacket,
                       pAdapt->SendPacketPoolHandle);

    if (Status == NDIS_STATUS_SUCCESS)
    {
        //====================================================================
        //---- modefy MyPacket  ----------------------------------------------
        
            PUCHAR       pPacketContent;
            PUCHAR       pBuf;
            ULONG        nBufferSize;
            MDL          * pNext;
            UINT         i,j;
            BOOLEAN      transFlag = FALSE;
            PNDIS_BUFFER MyBuffer;
            PIPHeader    pIPHeader;
              PUDPHeader pUDPHeader;
              PUDPHeaderHH psdhdr;
  

            Status= NdisAllocateMemory( &pPacketContent, 2000, 0,HighestAcceptableMax);

            NdisQueryBufferSafe(Packet->Private.Head,&pBuf,&nBufferSize,32);

            NdisMoveMemory(pPacketContent,pBuf,nBufferSize);

            i = nBufferSize;

            pNext = Packet->Private.Head;
            
            //------ 把包的数据拷贝到pPacketContent里面 --------------------
            for(;;)
            {
                if(pNext == Packet->Private.Tail)
                    break;
                pNext = pNext->Next;
                if(pNext == NULL)
                    break;
                NdisQueryBufferSafe(pNext,&pBuf,&nBufferSize,32);

                if(pBuf == NULL)
                    goto MM;
                NdisMoveMemory(pPacketContent,pBuf,nBufferSize);

                i = i+nBufferSize;

            }

            //--------------------------------------------------------------
            //--- 判断是不是要修改的包 -------------------------------------
            if(pPacketContent[12] == 8 && pPacketContent[13] == 0)  //if the packet is IP packet
            {
               pIPHeader = (PIPHeader)(pPacketContent+14); //point to IP Packet header

              unsigned long ipdest;
              ipdest = (ULONG)(192 + 168*256 + 17*256*256 + 48*256*256*256);
               if(pIPHeader->ipDestination == ipdest && pIPHeader->ipProtocol == (ULONG)17) //如果是要截获的包
               {
                   transFlag = TRUE;
               }
            }
        

        if(transFlag)
        {
            USHORT iphdrlen = (pIPHeader->iphVerLen & 0x0f) * sizeof(ULONG);
            UCHAR checkbuff[2000] = {0};

          
             USHORT udplen;
             pUDPHeader = (PUDPHeader)(pPacketContent+14 + iphdrlen);
             udplen = (pUDPHeader->len);
          
            
        //修改源地址
             pIPHeader->ipSource = 10 ;
        

      
        //填充UDP伪首部
        psdhdr->saddr = pIPHeader->ipSource;
        psdhdr->daddr = pIPHeader->ipDestination;
        psdhdr->len = pUDPHeader->len;
        psdhdr->mbz = 0;
        psdhdr->proto = 17;

        //计算UDP校验和,包括所有UDP数据
        NdisMoveMemory(checkbuff,&psdhdr,sizeof(psdhdr));
        NdisMoveMemory(checkbuff+sizeof(psdhdr),pUDPHeader,udplen);
        pUDPHeader->checksum = CheckSum((USHORT *)checkbuff,sizeof(psdhdr)+udplen);

        //计算IP首部校验和
        pIPHeader->ipChecksum = CheckSum((USHORT *)pIPHeader,iphdrlen);


        //============================================================================
            NdisAllocateBuffer(&Status,&MyBuffer,pAdapt->SendPacketPoolHandle,pPacketContent,i); //把数据包的内容copy给MyBuffer

            NdisChainBufferAtFront(MyPacket, MyBuffer);   //把MyBuffer关联到MyPacket
            Rsvd =(PRSVD)(MyPacket->ProtocolReserved);
            Rsvd->OriginalPkt = MyPacket;

            MyPacket->Private.Head->Next = NULL;
            MyPacket->Private.Tail = NULL;
            NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);
            NdisReturnPackets(&Packet, 1);
            NdisSend(&Status,pAdapt->BindingHandle,MyPacket);
            if(Status != NDIS_STATUS_PENDING)
            {
                NdisUnchainBufferAtFront(MyPacket ,&MyBuffer); //从MyPacket中解除buffer
                NdisQueryBufferSafe(MyBuffer, &pPacketContent, &nBufferSize,32 );
                if(pPacketContent != NULL)
                    NdisFreeMemory(pPacketContent,nBufferSize, 0);
                NdisFreeBuffer(MyBuffer);
            }


        //==============================================================================

        }
        else  
        {


           PNDIS_PACKET_EXTENSION    Old, New;

            Rsvd = (PRSVD)(MyPacket->ProtocolReserved);
           Rsvd->OriginalPkt = Packet;
           MyPacket->Private.Flags = Flags;

           MyPacket->Private.Head = Packet->Private.Head;
           MyPacket->Private.Tail = Packet->Private.Tail;
           NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);

           NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket),
                       NDIS_OOB_DATA_FROM_PACKET(Packet),
                       sizeof(NDIS_PACKET_OOB_DATA));

            NdisIMCopySendPerPacketInfo(MyPacket, Packet);
        
           NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet,
                                            &MediaSpecificInfo,
                                            &MediaSpecificInfoSize);

            if (MediaSpecificInfo || MediaSpecificInfoSize)
           {
                 NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket,
                                                MediaSpecificInfo,
                                                MediaSpecificInfoSize);
           }
           NdisSend(&Status,
                   pAdapt->BindingHandle,
                   MyPacket);


             if (Status != NDIS_STATUS_PENDING)
             {
                  NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
                  NdisFreePacket(MyPacket);
             }
        }
    }
    else
    {
        
    }

    return(Status);
}
good good study , day day up
zz123439
驱动牛犊
驱动牛犊
  • 注册日期2007-11-21
  • 最后登录2016-01-09
  • 粉丝2
  • 关注0
  • 积分341分
  • 威望45点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-04-14 23:19
我也正做这个,互相学习探讨吧QQ270996889   SDTZ_ZZ@126.COM
TTman
驱动牛犊
驱动牛犊
  • 注册日期2008-04-09
  • 最后登录2011-07-18
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-04-15 19:47
我是刚刚接触驱动,也遇到过这样的问题,之前写C++习惯了,如果是C的话,这样就编译不过去
hsjpeter
驱动牛犊
驱动牛犊
  • 注册日期2008-04-19
  • 最后登录2008-06-04
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-04-19 13:59
我也是刚学驱动,做的也是这个,有兴趣的联系啊,QQ:410651416
e-mail:hsjpeterlinwu@163.com
游客

返回顶部