阅读:1637回复:5
为什么我的代码能发现TCP、UDP包而发现不了ICMP啊,帮我看看代码吧,弄了好久也没出来,
我用PING命令测试,怎么也不输出ICMP包,代码是在帖子上拷的,没改动什么啊
NDIS_STATUS PtReceive( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize ) { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET MyPacket, Packet; PNDIS_BUFFER OriginalBuffer; UINT PacketLength; PUCHAR pPacketContent,DataContent; NDIS_STATUS ntStatus,Status = NDIS_STATUS_SUCCESS; DBGPRINT(\"==> Passthru Protocol PtReceive\\n\"); DbgPrint(\" CurrentAdapterHandle: %u\\n\", ProtocolBindingContext); DbgPrint(\" MacReceiveHandle: %u\\n\", MacReceiveContext); DbgPrint(\" HeaderBufferPointer: %u\\n\", HeaderBuffer); DbgPrint(\" HeaderBufferSize: %u\\n\", HeaderBufferSize); DbgPrint(\" LookAheadBufferPointer: %u\\n\", LookAheadBuffer); DbgPrint(\" LookAheadBufferSize: %u\\n\", LookAheadBufferSize); DbgPrint(\" PacketSize: %u\\n\", PacketSize); ntStatus = NdisAllocateMemory(&pPacketContent,2000,0,HighestAcceptableMax); if(ntStatus != NDIS_STATUS_SUCCESS) { return ntStatus; } NdisZeroMemory(pPacketContent,2000); NdisMoveMemory( pPacketContent, HeaderBuffer, HeaderBufferSize ); NdisMoveMemory( pPacketContent+HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize ); if(((char *)pPacketContent)[12] == 8 &&((char *)pPacketContent)[13] == 0 && ((char *)pPacketContent)[23] == 1) { DbgPrint(\"ICMP!\\n\"); NdisFreeMemory(pPacketContent, 2000, 0); return NDIS_STATUS_NOT_ACCEPTED; } else if(((char *)pPacketContent)[12] == 8 && ((char *)pPacketContent)[13] == 0 && ((char *)pPacketContent)[23] == 2) { DbgPrint(\"IGMP!\\n\"); NdisFreeMemory(pPacketContent, 2000, 0); return NDIS_STATUS_NOT_ACCEPTED; } else if(((char *)pPacketContent)[12] == 8 && ((char *)pPacketContent)[13] == 0 && ((char *)pPacketContent)[23] == 6) { DbgPrint(\"TCP!\\n\"); NdisFreeMemory(pPacketContent, 2000, 0); return NDIS_STATUS_NOT_ACCEPTED; } else if (((char *)pPacketContent)[12] == 8 && ((char *)pPacketContent)[13] == 0 && ((char *)pPacketContent)[23] == 17) { DbgPrint(\"UDP!\\n\"); NdisFreeMemory(pPacketContent, 2000, 0); return NDIS_STATUS_NOT_ACCEPTED; } NdisFreeMemory(pPacketContent, 2000, 0); PacketLength=HeaderBufferSize+PacketSize; NdisAllocateMemoryWithTag(&DataContent, PacketLength, TAG); if(DataContent != NULL) { NdisAllocateBuffer(&Status, &OriginalBuffer, pAdapt->RecvPacketPoolHandle, DataContent, PacketLength); if(Status == NDIS_STATUS_SUCCESS) { NdisMoveMappedMemory(DataContent, HeaderBuffer, HeaderBufferSize); NdisAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { if(LookAheadBufferSize == PacketSize) { NdisMoveMappedMemory(DataContent + HeaderBufferSize, LookAheadBuffer, PacketSize); NdisChainBufferAtFront(MyPacket, OriginalBuffer); } } } } PrintPacket(MyPacket); NdisDprFreePacket(MyPacket); if(!pAdapt->MiniportHandle) { Status = NDIS_STATUS_FAILURE; } else do { if(pAdapt->isSecondary) { DBGPRINT(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\"); ASSERT(0); } Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); if(Packet != NULL) { DBGPRINT(\"==> Passthru Protocol PtReceive RePacket...\\n\"); NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; NDIS_SET_ORIGINAL_PACKET( MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES); PrintPacket(MyPacket); NdisDprFreePacket(MyPacket); DBGPRINT(\"<== Passthru Protocol PtReceive RePacket Success...\\n\"); break; } } pAdapt->IndicateRcvComplete = TRUE; switch(pAdapt->Medium) { case NdisMedium802_3: NdisMEthIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; case NdisMedium802_5: NdisMTrIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; case NdisMediumFddi: NdisMFddiIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; default: ASSERT(0); break; } } while(FALSE); DBGPRINT(\"<== Passthru Protocol PtReceive\\n\"); return Status; } |
|
最新喜欢:![]() |
沙发#
发布于:2005-05-31 15:28
会不会是监控icmp的标记被打开?
|
|
|
板凳#
发布于:2005-05-31 16:02
不懂,什么意思啊?
|
|
地板#
发布于:2005-06-01 10:36
基本上是没有把显示ICMP包的标志置位。如果你用DebugView应该能看到已经显示分析出IGMP!包了。
|
|
地下室#
发布于:2005-06-01 13:50
我没用标识,更应该能发现ICMP包啊,我用DbgView跟踪的时候TCP和UDP的包被截获都有提示输出,可是一直都没有ICMP和IGMP。
我机器装的是诺顿的防火墙,我已经关了, 可是我PING自己的时候,显示PING成功了,但DbgView中仍然没有ICMP包的信息, 到底是程序的问题?还是我的机器上还有隐藏的防火墙没关啊? |
|
5楼#
发布于:2005-06-01 19:54
你对PtReceivePacket是怎么处理的?能确认没有走PtReceivePacket吗?
|
|