当前位置: 代码迷 >> 驱动开发 >> 500 分NDIS的有关问题,跪求,各种求
  详细解决方案

500 分NDIS的有关问题,跪求,各种求

热度:108   发布时间:2016-04-28 10:51:11.0
500 分NDIS的问题,求助,跪求,各种求
这里100分
http://topic.csdn.net/u/20110726/14/3e990ad4-17c9-4bc3-910c-5a8335c0d6ac.html

这里200分
http://topic.csdn.net/u/20110802/10/99da0395-8388-4f29-a55c-924b29fa3aac.html

本帖200分,共500分,求解决NDIS拦截HTTP数据包问题。

当前情况:
修改扩展XPASSTHRU 程序,在服务器上拦截指定域名(未备案),我在PtReceivePacket解析到指定的域名后,就发送我的
拦截页面数据包,发送成功后客户端成功显示我的拦截页面,然后问题来了,服务端一直在重发ACK同步数据包。
为了解决这个问题,我在PtReceivePacket 的PEDEING里和PtSendComplete 里加上了像服务端发送RESET数据包的函数,然后
在PtSendComplete 的NdisFreeBuffer 蓝屏,注释掉NdisFreeBuffer 不蓝屏,可是还是不挺的重发ACK包,而且我没有抓取
到我往服务器发送的RESET包,头晕了,求帮助,需要看代码可以给下邮箱或QQ,我的QQ:116988566
PtSendComplete PtReceivePacket 函数如下:
C/C++ code
INTPtReceivePacket(    IN    NDIS_HANDLE            ProtocolBindingContext,    IN    PNDIS_PACKET        Packet    ){    PADAPT            pAdapt =(PADAPT)ProtocolBindingContext;    NDIS_STATUS        Status;    PNDIS_PACKET    MyPacket;    PRSVD            Resvd;    PUCHAR       pPacketContent;    PUCHAR       pBuf;    UINT         BufLength;    MDL          * pNext;    UINT         i,j;    BOOLEAN      transflag = FALSE;    NDIS_STATUS        Status2;    NDIS_STATUS        Status3;    NDIS_STATUS        Status4;    PNDIS_BUFFER  MyBuffer;    NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;    if(!pAdapt->MiniportHandle)    return 0;    if(pAdapt->isSecondary)    {           ASSERT(0);    }    NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle);    if(Status == NDIS_STATUS_SUCCESS)    {            Resvd =(PRSVD)(MyPacket->MiniportReserved);        Resvd->OriginalPkt = Packet;        MyPacket->Private.Head = Packet->Private.Head;        MyPacket->Private.Tail = Packet->Private.Tail;        NDIS_SET_ORIGINAL_PACKET(            MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet));        NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet);        Status = NDIS_GET_PACKET_STATUS(Packet);        NDIS_SET_PACKET_STATUS(MyPacket, Status);        NDIS_SET_PACKET_HEADER_SIZE(            MyPacket, NDIS_GET_PACKET_HEADER_SIZE(Packet));        HighestAcceptableAddress.QuadPart = -1;        Status2= NdisAllocateMemory( &pPacketContent, 2000, 0,HighestAcceptableAddress);        if (Status2!=NDIS_STATUS_SUCCESS )     return Status;        NdisZeroMemory (pPacketContent, 2000);        NdisQueryBuffer(Packet->Private.Head, &pBuf, &BufLength);        NdisMoveMemory(pPacketContent, pBuf, BufLength);        i = BufLength;        pNext = Packet->Private.Head;        for(;;)        {            if(pNext == Packet->Private.Tail)                break;            pNext = pNext->Next;            if(pNext == NULL)                 break;            NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);            NdisMoveMemory(pPacketContent+i,pBuf,BufLength);            i+=BufLength;        }         DBGPRINT("#############################  IP  Packet  #########################\n");         pAdapt = pAdapt->pSecondaryAdapt;        if( DecodeTCP(pPacketContent) )        {            //DbgBreakPoint();            NdisAllocateBuffer(&Status3,&MyBuffer,pAdapt->SendPacketPoolHandle,pPacketContent,i);            if (Status3==NDIS_STATUS_SUCCESS )             {                NdisChainBufferAtFront(MyPacket, MyBuffer);                Resvd =(PRSVD)(MyPacket->ProtocolReserved);                Resvd->OriginalPkt = MyPacket;                NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);                NdisReturnPackets(&Packet, 1);                 MyPacket->Private.Head->Next=NULL;                MyPacket->Private.Tail=NULL;                Resvd->IsPrivate = 1;                Resvd->IsRst = 0;                Resvd->pMyBuffer=&MyBuffer;                Resvd->    pMyContent=&pPacketContent;                NdisSend(&Status4,pAdapt->BindingHandle,MyPacket);                    DbgPrint("[xiaoc httpfilter] NdisSend status = %d!\n", Status4);                if(Status4!=NDIS_STATUS_PENDING)                {                                        ResetPacketToServer(pAdapt, MyPacket, pPacketContent);                    NdisUnchainBufferAtFront(MyPacket,&MyBuffer);                    NdisFreeBuffer(MyBuffer);                    NdisDprFreePacket(MyPacket);                        NdisFreeMemory(pPacketContent,BufLength,0);                    return 0;                }                //ResetPacketToServer(pAdapt, MyPacket, pPacketContent);                return 0;                    }                }        else            NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);        NdisFreeMemory(pPacketContent,BufLength,0);        if(Status == NDIS_STATUS_RESOURCES)        {            NdisDprFreePacket(MyPacket);        }        return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0);    }    else    {        return(0);    }}VOIDPtSendComplete(    IN    NDIS_HANDLE            ProtocolBindingContext,    IN  PNDIS_PACKET        Packet,    IN  NDIS_STATUS            Status){    PADAPT            pAdapt =(PADAPT)ProtocolBindingContext;    PNDIS_PACKET            Pkt;    PRSVD            Rsvd;     PNDIS_BUFFER pPacketBuffer;      PUCHAR pPacketContent;      UINT BufLength;    DBGPRINT("==> Passthru Protocol PtSendComplete\n");        //PrintPacket(Packet);pAdapt = pAdapt->pPrimaryAdapt;Rsvd =(PRSVD)(Packet->ProtocolReserved);Pkt = Rsvd->OriginalPkt; pPacketBuffer = (PNDIS_BUFFER)Rsvd->pMyBuffer;pPacketContent = (PUCHAR)Rsvd->pMyContent;    DBGPRINT("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");DbgPrint("Rsvd->IsPrivate: %u\n", Rsvd->IsPrivate);    DBGPRINT("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");if (!Rsvd->IsPrivate){NdisIMCopySendCompletePerPacketInfo (Pkt, Packet);NdisDprFreePacket(Packet);NdisMSendComplete(pAdapt->MiniportHandle, Pkt,Status);DBGPRINT("<== Passthru Protocol PtSendComplete\n");}else{    DbgBreakPoint();    if( !Rsvd->IsRst )    {            ResetPacketToServer(pAdapt, Packet, pPacketContent );    }    NdisUnchainBufferAtFront(Packet,&pPacketBuffer);    NdisQueryBufferSafe(pPacketBuffer,&pPacketContent,&BufLength,32);    //NdisFreeBuffer(pPacketBuffer);    //NdisFreeMemory(pPacketContent,BufLength,0);    NdisDprFreePacket(Packet);}}