阅读:1216回复:0
为什麽在PtReceivePacket中看不到包的信息,但能看到机器是跑了PtReceivePacket的~~附源码
我只在PtReceivePacket和MPSend中作了修改而已
INT PtReceivePacket( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet ) { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; NDIS_STATUS Status; PNDIS_PACKET MyPacket; PRSVD Resvd; //--------------------------------------------------------- int PacketSize; PUCHAR pPacketContent; PUCHAR pBuf; UINT BufLength; MDL *pNext; UINT i; //--------------------------------------------------------- UINT workmode=0; //自己用来定义的工作模式 DbgPrint(\"===============>正在运行中的资料:PtReceivePacket<===============\\n\"); if(!pAdapt->MiniportHandle) { return 0; } // We should not be getting Receives on a Secondary, this is just specific to our LBFO driver // if(pAdapt->isSecondary) { DBGPRINT(\"PASSTHRU GETTING RECEIVES ON SECONDARY\\n\"); ASSERT(0); } // // Get a packet off the pool and indicate that up // 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; // // Get the original packet(it could be the same packet as one received or a different one // based on # of layered MPs) and set it on the indicated packet so the OOB stuff is visible // correctly at the top. // NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); // // Set Packet Flags // 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)); if(workmode==1) { NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyPacket,1); DbgPrint(\"现在的工作模式是=====>允许包通过<=====\\n\"); } else { DbgPrint(\"现在的工作模式是=====>封包截获<=====\\n\"); //把数据包内容从Packet拷贝到pPacketContent NdisQueryPacket(Packet,NULL,NULL,NULL,&PacketSize); Status= NdisAllocateMemory( &pPacketContent,2000,0,HighestAcceptableMax); if (Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"=====>分配一个系统空间 NdisAllocateMemory 失败<=====\\n\"); return Status; } //初始化所分配的缓冲区 NdisZeroMemory (pPacketContent, 2000); //安全地指向所发封包的地方,取出该包现在在缓冲区的首地址和长度 NdisQueryBufferSafe(Packet->Private.Head,&pBuf,&BufLength,32 ); //把所要发出去的封包的地址付给我们自己所开辟的虚拟地址中,并付给长度 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; } //数据拷贝完毕 if (pPacketContent[13] != 0) { DbgPrint(\"===============>这不是一个 IP 包.<===============\\n\"); NdisFreeMemory(pPacketContent, 2000, 0); NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyPacket,1); return NDIS_STATUS_SUCCESS; /* if(Status == NDIS_STATUS_RESOURCES) { NdisDprFreePacket(MyPacket); } return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0); */ } switch (pPacketContent[23]) { case 1: DbgPrint(\"===============>这是一个 IP/ICMP 包.<===============\\n\"); DbgPrint(\"目的 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[0], pPacketContent[1], pPacketContent[2], pPacketContent[3], pPacketContent[4], pPacketContent[5]); DbgPrint(\"源 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[6], pPacketContent[7], pPacketContent[8], pPacketContent[9], pPacketContent[10], pPacketContent[11]); DbgPrint(\"源 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[26], pPacketContent[27], pPacketContent[28], pPacketContent[29]); DbgPrint(\"目的 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[30], pPacketContent[31], pPacketContent[32], pPacketContent[33]); //释放之前所分配的缓存空间 NdisFreeMemory(pPacketContent, 2000, 0); break; case 6: DbgPrint(\"===============>这是一个 IP/TCP 包.<===============\\n\"); DbgPrint(\"目的 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[0], pPacketContent[1], pPacketContent[2], pPacketContent[3], pPacketContent[4], pPacketContent[5]); DbgPrint(\"源 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[6], pPacketContent[7], pPacketContent[8], pPacketContent[9], pPacketContent[10], pPacketContent[11]); DbgPrint(\"源 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[26], pPacketContent[27], pPacketContent[28], pPacketContent[29]); DbgPrint(\"目的 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[30], pPacketContent[31], pPacketContent[32], pPacketContent[33]); DbgPrint(\"源 端口 为: %x%x (16进制) \\n\\n\",pPacketContent[34],pPacketContent[35]); DbgPrint(\"目的 端口 为: %x%x (16进制) \\n\\n\",pPacketContent[36],pPacketContent[37]); //释放之前所分配的缓存空间 NdisFreeMemory(pPacketContent, 2000, 0); break; case 17: DbgPrint(\"===============>这是一个 IP/UDP 包.<===============\\n\"); DbgPrint(\"目的 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[0], pPacketContent[1], pPacketContent[2], pPacketContent[3], pPacketContent[4], pPacketContent[5]); DbgPrint(\"源 MAC 地址 为: %x - %x - %x - %x - %x - %x \\n\\n\",pPacketContent[6], pPacketContent[7], pPacketContent[8], pPacketContent[9], pPacketContent[10], pPacketContent[11]); DbgPrint(\"源 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[26], pPacketContent[27], pPacketContent[28], pPacketContent[29]); DbgPrint(\"目的 IP 地址 为: %u . %u . %u . %u \\n\\n\",pPacketContent[30], pPacketContent[31], pPacketContent[32], pPacketContent[33]); DbgPrint(\"源 端口 为: %x%x (16进制) \\n\\n\",pPacketContent[34],pPacketContent[35]); DbgPrint(\"目的 端口 为: %x%x (16进制) \\n\\n\",pPacketContent[36],pPacketContent[37]); //释放之前所分配的缓存空间 NdisFreeMemory(pPacketContent, 2000, 0); break; default: NdisFreeMemory(pPacketContent, 2000, 0); break; } NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyPacket,1); } if(Status == NDIS_STATUS_RESOURCES) { NdisDprFreePacket(MyPacket); } return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0); } else { // // We are out of packets. Silently drop it. Alternatively we can deal with it: // - By keeping separate send and receive pools // - Dynamically allocate more pools as needed and free them when not needed // return(0); } } |
|
|