📄 myfilter.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 + -