yellowzzp
驱动小牛
驱动小牛
  • 注册日期2007-07-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1015分
  • 威望131点
  • 贡献值0点
  • 好评度117点
  • 原创分0分
  • 专家分0分
阅读:1444回复:1

是什么影响了。NdisSend 发给本机的包 ,不能到达RecvPacket例程?

楼主#
更多 发布于:2008-06-20 11:39
本身是重定向不起作用的问题,后来发现是本应该到达Recv例程的,包并没有到。可是在截包软件中却发现包已经发出。
包的IP MAC肯定没有错误。

半年前也曾经遇到过这样的问题。最后设置了一个包的FLAG 使问题得以解决。DONT_LOOPBACK.

没想到半年后 又出现了新的问题,到底包没有到达Recv例程。

此时用半年前 可以使用的程序。发现都丧失了效果。。

请问谁有这方面的经历?来说下到底是什么影响了 发给本机包的到达??
yellowzzp
驱动小牛
驱动小牛
  • 注册日期2007-07-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1015分
  • 威望131点
  • 贡献值0点
  • 好评度117点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-06-23 13:53
贴代码:
NDIS_STATUS        Status;
    PNDIS_PACKET    MyPacket;
    PUCHAR            pPacketContent;
    PNDIS_BUFFER    PacketBuffer;
    PADAPT            pAdapt = g_pSendAdapt;
    ULONG            PacketLen;
    PSEND_RSVD        Rsvd;
    ULONG           ReturnLen;
    NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
    HighestAcceptableAddress.LowPart = -1;
    HighestAcceptableAddress.HighPart = -1;
    
    
    ComposeHttpContent();
    PacketLen = strlen(httpRedirectFullAddr)+54;

    KdPrint(("开始给自己发送HTML 重定向 包,长度为%d",PacketLen));

    Status =  NdisAllocateMemory(&pPacketContent,PacketLen,0,HighestAcceptableAddress);//分配内存
    if(!NT_SUCCESS(Status))
    {
        return ;//分配失败 返回
    }
    NdisZeroMemory(pPacketContent,PacketLen);

    NdisMoveMemory(pPacketContent,data,ETHERNET_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE);//把数据全部拷贝,然后更改一些数据
    //填充包内容
    FillContentData_ReDirect(data,pPacketContent);//把 pPacket 的内容拷贝到 pPacketContent,返回PacketLen


    //分配一个新包
    NdisAllocatePacket(&Status,&MyPacket,pAdapt->SendPacketPoolHandle);
    if(NT_SUCCESS(Status))
    {
        //用上面的包内容 pPacketContent 分配一个新的缓冲区  PacketBuffer
        NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->SendPacketPoolHandle,pPacketContent,PacketLen);


        //把这个新分配的缓冲区 连接到 刚分配的新的包上
        NdisChainBufferAtFront( MyPacket, PacketBuffer);

        Rsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved);
        Rsvd ->OriginalPkt = NULL;

        MyPacket->Private.Head->Next=NULL;
        MyPacket->Private.Tail=NULL;
        NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);//自己定义的包

    
        NdisSend(&Status, pAdapt->BindingHandle, MyPacket);//发送

        KdPrint(("发送完成 HTML 重定向 。。。。。6.255 测试"));
        if (Status != NDIS_STATUS_PENDING)//返回pending的话自己分配的东饕?赑tSendComplete里面释放
        {
            //    NdisIMCopySendCompletePerPacketInfo (OldPacket, MyPacket);
            NdisUnchainBufferAtFront(MyPacket ,&PacketBuffer);
            NdisQueryBufferSafe(PacketBuffer,(PVOID *)&pPacketContent,&ReturnLen,32);
            NdisFreeBuffer(PacketBuffer);
            NdisFreeMemory(pPacketContent,ReturnLen,0);
            NdisDprFreePacket(MyPacket);
            return;
        }
    }
    else
    {
        NdisFreeMemory(pPacketContent,PacketLen,0);
        return ;
    }


Complete就不贴了  基本都一样。
游客

返回顶部