阅读:1499回复:1
是什么影响了。NdisSend 发给本机的包 ,不能到达RecvPacket例程?
本身是重定向不起作用的问题,后来发现是本应该到达Recv例程的,包并没有到。可是在截包软件中却发现包已经发出。
包的IP MAC肯定没有错误。 半年前也曾经遇到过这样的问题。最后设置了一个包的FLAG 使问题得以解决。DONT_LOOPBACK. 没想到半年后 又出现了新的问题,到底包没有到达Recv例程。 此时用半年前 可以使用的程序。发现都丧失了效果。。 请问谁有这方面的经历?来说下到底是什么影响了 发给本机包的到达?? |
|
沙发#
发布于: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就不贴了 基本都一样。 |
|