阅读:920回复:1
高手们帮小弟看看 Passthru 为何不能截包
我把 PAssthru 里的 NDIS_STATUS PtReceive( ) 函数改成了如下的形式, 我只想截获所有的 IP 数据报. 可是没有用!
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 ) /*++ Routine Description: LBFO - need to use primary for all receives Arguments: Return Value: --*/ { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET MyPacket, Packet; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; //-----Variables added declare int nPacketSize; PUCHAR pPacketContent; PUCHAR pBuf; UINT BufLength; MDL * pNext; UINT i; //-----------规则标志位(1表示过滤,0表示放行,你可以通过改这个数值来配置规则) UINT IP = 1; //IP数据报规则 UINT ICMP = 0; //ICMP数据报规则 UINT IGMP = 0; //IGMP数据报规则 UINT TCP = 0; //TCP数据报规则 UINT UDP = 0; //UDP数据报规则 //----end of declare if(!pAdapt->MiniportHandle) { Status = NDIS_STATUS_FAILURE; } else do { // // We should not be getting Receives on a Secondary, this is just specific to our LBFO driver // if(pAdapt->isSecondary) { DBGPRINT("PASSTHRU GETTING RECIEVES ON SECONDARY\n"); ASSERT(0); } // // If this was indicated by the miniport below as a packet, then get that packet pointer and indicate // it as a packet as well(with appropriate status). This way the OOB stuff is accessible to the // transport above us. // Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); if(Packet != NULL) { //--------------------------------------------------------- //把数据包内容从Packet拷贝到pPacketContent NdisQueryPacket( Packet,NULL,NULL,NULL,&nPacketSize); Status= NdisAllocateMemory( &pPacketContent, 2000, 0,HighestAcceptableMax); if (Status!=NDIS_STATUS_SUCCESS ) 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 (IP == 1) { if( pPacketContent[12] == 8 && pPacketContent[13] == 0 ) { DbgPrint("IP被拦截!\n"); NdisFreeMemory(pPacketContent, 2000, 0); return NDIS_STATUS_NOT_ACCEPTED; } } if (ICMP == 1) { if( pPacketContent[12] == 8 && pPacketContent[13] == 0 && pPacketContent[23] == 1 ) { DbgPrint("ICMP被拦截!\n"); NdisFreeMemory(pPacketContent, 2000, 0); return NDIS_STATUS_NOT_ACCEPTED; } } if (IGMP == 1) { if( pPacketContent[12] == 8 && pPacketContent[13] == 0 && pPacketContent[23] == 2 ) { DbgPrint("IGMP被拦截!\n"); NdisFreeMemory(pPacketContent, 2000, 0); return NDIS_STATUS_NOT_ACCEPTED; } } if (TCP == 1) { if( pPacketContent[12] == 8 && pPacketContent[13] == 0 && pPacketContent[23] == 6 ) { DbgPrint("TCP被拦截!\n"); NdisFreeMemory(pPacketContent, 2000, 0); return NDIS_STATUS_NOT_ACCEPTED; } } if (UDP == 1) { if( pPacketContent[12] == 8 && pPacketContent[13] == 0 && pPacketContent[23] == 17 ) { DbgPrint("UDP被拦截!\n"); NdisFreeMemory(pPacketContent, 2000, 0); return NDIS_STATUS_NOT_ACCEPTED; } } NdisFreeMemory(pPacketContent, 2000, 0); //规则判断结束 //--------------------------------------------------------- // Get a packet off the pool and indicate that up // NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { 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)); NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); // // Set Packet Flags // NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); // // Make sure the status is set to NDIS_STATUS_RESOURCES. // NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES); NdisDprFreePacket(MyPacket); break; } } // // Fall through if the miniport below us has either not indicated a packet or we could not // allocate one // 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); return Status; } |
|
最新喜欢:![]() |
沙发#
发布于:2004-12-13 12:31
Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
if(Packet != NULL) { } 对Packet == NULL的情况你也要处理!!!! |
|