⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myfilter.c

📁 利用C++工具进行编程,NDIS的PASSTHRU层的驱动程序,是非常实用的程序.
💻 C
字号:
//MyFilter.c
#include"precomp.h"

/*****************Function Declaration(Internal)***************/


/*External Function*/
//Called in MtSend().
//Handle the packet Sended by the filter IP flag.
//If filtering success,return 0.
//or you judge the IP packet is not you want,return 1.
int SendFilter(
	IN	PNDIS_PACKET			Packet
	)
{
	
	return 1;
}

/*External Function*/
//Handle PtReceive().
//Handle the packet received by the filter IP flag.
NDIS_STATUS
PtReceiveFilter(
	IN  NDIS_HANDLE			ProtocolBindingContext,
	IN  NDIS_HANDLE			MacReceiveContext,
	IN  PVOID				HeaderBuffer,
	IN  UINT				HeaderBufferSize,
	IN  PVOID				LookAheadBuffer,
	IN  UINT				LookAheadBufferSize,
	IN  UINT				PacketSize
	)
{
	int iTempIncludeFlag,iTempExcludeFlag;
	int iTempCopyFlag;

	U32 uTempEthernetHeaderLength;
	U32 uTempIpPacketHeaderLength;
		
	PIpPacketHeader pTempIpPacketHeader;
	PEthernetHeader pTempEthernetHeader;

	PADAPT			pAdapt =(PADAPT)ProtocolBindingContext;
	PNDIS_PACKET	MyPacket, Packet;
	NDIS_STATUS		Status = NDIS_STATUS_SUCCESS;

	if(!pAdapt->MiniportHandle)
	{
		Status = NDIS_STATUS_FAILURE;
	}else 
	{
/*

		//LookAheadBufferSize>=PacketSize.
		//		Can filter now.
		//LookAheadBufferSize<PacketSize.
		//		should filter in PtTransferDataComplete().
		if(LookAheadBufferSize>=PacketSize)
		{
			//Judge whether has IP to Filter.
			if(iFilterFlag)
			{
				uTempEthernetHeaderLength=(U32)HeaderBufferSize;
				pTempEthernetHeader=(PEthernetHeader)HeaderBuffer;
				
				if(uTempEthernetHeaderLength==14)
				{
					if( (pTempEthernetHeader->type)==8 )
					{//Ethernet packet.
						
						//Note:	The program only handle the ethernet packet ! ! !
						
						//Unused.
						uTempIpPacketHeaderLength=(U32)LookAheadBufferSize;
						
						pTempIpPacketHeader=(PIpPacketHeader)LookAheadBuffer;
						
						//First you should check the Include list.
						iTempIncludeFlag=JudgeEntryInclude(
							&( pTempEthernetHeader->srcAddress ),
							&( pTempEthernetHeader->type ),
							&( pTempIpPacketHeader->srcAddress ),
							&( pTempIpPacketHeader->protocolType ),
							&( pFilterEntry.RecIncludeQueue ),
							&iTempCopyFlag
							);
						
						if( iTempIncludeFlag )
							goto IndicatePacket;
						
						//Now you should check the Exclude list.
						iTempExcludeFlag=JudgeEntryInclude(
							&( pTempEthernetHeader->srcAddress ),
							&( pTempEthernetHeader->type ),
							&( pTempIpPacketHeader->srcAddress ),
							&( pTempIpPacketHeader->protocolType ),
							&( pFilterEntry.RecExcludeQueue ),
							&iTempCopyFlag
							);
				*/		
/*						if( iTempExcludeFlag )
						{
							if(iTempCopyFlag)
							{
								//Copy the packet.
								CopyPacketByBuffer(
										LookAheadBuffer,
										LookAheadBufferSize
									);
															
								goto IndicatePacket;
							}
							
							return STATUS_SUCCESS;
							
						}else
							goto IndicatePacket;
					}
				}
			
			}
		}
			
*/		
	}
			
	return Status;
}

		// 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)
		{
			 //
			 // 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;
			 }
		}
//Indicate the packet to other.
			 
			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;
			}
		}else
		{

		}
	}
//	} while(FALSE);

	*/

/*		Debug Infomation.
  
			DbgPrint("The Version is %d\n",pTempIpPacketHeader->version);
					DbgPrint("The Length of Header is %d\n",pTempIpPacketHeader->headerLength);
					DbgPrint("The server type is %d\n",pTempIpPacketHeader->protocolType);
					DbgPrint("The Packet 's Length is %d\n",pTempIpPacketHeader->totalLength);
					
					DbgPrint("The Src address is %d.%d.%d.%d\n",
						pTempIpPacketHeader->srcAddress.address.U8Address[0],
						pTempIpPacketHeader->srcAddress.address.U8Address[1],
						pTempIpPacketHeader->srcAddress.address.U8Address[2],
						pTempIpPacketHeader->srcAddress.address.U8Address[3]);
					
					DbgPrint("The Dest address is %d.%d.%d.%d\n",
						pTempIpPacketHeader->destAddress.address.U8Address[0],
						pTempIpPacketHeader->destAddress.address.U8Address[1],
						pTempIpPacketHeader->destAddress.address.U8Address[2],
						pTempIpPacketHeader->destAddress.address.U8Address[3]);
					
					//Filter the IP.
					if((pTempIpPacketHeader->srcAddress.address.U32Address)
						== (theFilterAddress.address.U32Address))
					{
						DbgPrint("Delete the received packet");
						
						return 0;
				 }
				
	*/


	/*
	int iTempIncludeFlag,iTempExcludeFlag;

	U32 uTempIpPacketHeaderLength;
		
	PIpPacketHeader pTempIpPacketHeader;
	
//Judge whether has IP to Filter.
	if(iFilterFlag)
	{
		uTempIpPacketHeaderLength=(U32)LookAheadBufferSize;
		
		pTempIpPacketHeader=(PIpPacketHeader)LookAheadBuffer;
		
		//First you should check the Include list.
		iTempIncludeFlag=JudgeEntryInclude(
				NULL,
				NULL,
				&( pTempIpPacketHeader->srcAddress ),
				&( pTempIpPacketHeader->protocolType ),
				&( pFilterEntry.SendIncludeQueue )
			);
								
		//Now you should check the Exclude list.
		iTempExcludeFlag=JudgeEntryInclude(
				NULL,
				NULL,
				&( pTempIpPacketHeader->srcAddress ),
				&( pTempIpPacketHeader->protocolType ),
				&( pFilterEntry.SendExcludeQueue )
			);
	}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -