这里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);}}