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

📄 recv.c

📁 ndis 中间层截获后转发的例子,通过修改IP 地址和MAC地址转发.
💻 C
字号:
/*——————————————————————————————————————
	文件:recv.c
	工程:xpassthru
	概述:演示NDIS中间驱动程序输出封包结构信息
	版权所有(c) 2001-2002 X 工作室
	http://www.xfilt.com
	xstudio@xfilt.com
*/

#include "prexsim.h"
#include "send.h"
#pragma hdrstop

NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1); 




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;
	NDIS_STATUS		Status = NDIS_STATUS_SUCCESS;

	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)
		{
			 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);

			
				NdisDprFreePacket(MyPacket);
	    		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);

	return Status;
}

VOID
PtReceiveComplete(
	IN	NDIS_HANDLE		ProtocolBindingContext
)
{
	PADAPT		pAdapt =(PADAPT)ProtocolBindingContext;

	if(pAdapt->isSecondary)
	{
		  DBGPRINT("PASSTHRU GETTING RECEIVES ON SECONDARY\n");
		  ASSERT(0);
	}

	if((pAdapt->MiniportHandle != NULL) && pAdapt->IndicateRcvComplete)
	{
		switch(pAdapt->Medium)
		{
		  case NdisMedium802_3:
			NdisMEthIndicateReceiveComplete(pAdapt->MiniportHandle);
			break;

		  case NdisMedium802_5:
			NdisMTrIndicateReceiveComplete(pAdapt->MiniportHandle);
			break;

		  case NdisMediumFddi:
			NdisMFddiIndicateReceiveComplete(pAdapt->MiniportHandle);
			break;

		  default:
			ASSERT(0);
			break;
		}
	}
	pAdapt->IndicateRcvComplete = FALSE;

}

INT
PtReceivePacket(
	IN	NDIS_HANDLE			ProtocolBindingContext,
	IN	PNDIS_PACKET		Packet
	)
{
	PADAPT			pAdapt =(PADAPT)ProtocolBindingContext;
	NDIS_STATUS		Status;
	PNDIS_PACKET	MyPacket;
	PRSVD			Resvd;
	PUCHAR       pPacketContent;
    PUCHAR       pBuf;
    UINT         BufLength;
    MDL          * pNext;
    UINT         i,j;
    BOOLEAN      transflag = FALSE;
	NDIS_STATUS		Status2;
	NDIS_STATUS		Status3;
	NDIS_STATUS		Status4;
    PNDIS_BUFFER  MyBuffer;

 

   if(!pAdapt->MiniportHandle)	return 0;

	if(pAdapt->isSecondary)
	{
		   ASSERT(0);
	}

	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;

		NDIS_SET_ORIGINAL_PACKET(
			MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet));

		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));

        Status2= NdisAllocateMemory( &pPacketContent, 2000, 0,HighestAcceptableAddress);
        if (Status2!=NDIS_STATUS_SUCCESS )     return Status;
        NdisZeroMemory (pPacketContent, 2000);
        NdisQueryBuffer(Packet->Private.Head, &pBuf, &BufLength);
        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;
        }

 		DBGPRINT("#############################  IP  Packet  #########################\n");
 
		DbgPrint("Header\n");
		DbgPrint("Sou IP \n");
		DbgPrint("%u",pPacketContent[26]);
		DbgPrint("%u",pPacketContent[27]);
		DbgPrint("%u",pPacketContent[28]);
		DbgPrint("%u",pPacketContent[29]);
		DbgPrint("\n");
		DbgPrint("Sou MAC \n");
		DbgPrint("%x",pPacketContent[6]);
		DbgPrint("%x",pPacketContent[7]);
		DbgPrint("%x",pPacketContent[8]);
		DbgPrint("%x",pPacketContent[9]);
		DbgPrint("%x",pPacketContent[10]);
		DbgPrint("%x",pPacketContent[11]);
	    pAdapt = pAdapt->pSecondaryAdapt;


		if(pPacketContent[26] == 192 &&  pPacketContent[27] == 168 &&pPacketContent[28] == 1 &&  pPacketContent[29] == 1)
		{
			pPacketContent[0]=0;
    		pPacketContent[1]=25;
			pPacketContent[2]=224;
		    pPacketContent[3]=124;
		    pPacketContent[4]=39;
	    	pPacketContent[5]=92;
			
			pPacketContent[6]=0;
    		pPacketContent[7]=25;
			pPacketContent[8]=224;
		    pPacketContent[9]=125;
		    pPacketContent[10]=71;
	    	pPacketContent[11]=52;
		
    		pPacketContent[26]=192;
			pPacketContent[27]=168;
		    pPacketContent[28]=1;
		    pPacketContent[29]=2;

	    	pPacketContent[30]=192;
	    	pPacketContent[31]=168;
			pPacketContent[32]=1;
		    pPacketContent[33]=1;
	
			NdisAllocateBuffer(&Status3,&MyBuffer,pAdapt->SendPacketPoolHandle,pPacketContent,i);

	        if (Status3==NDIS_STATUS_SUCCESS ) 
            {
				NdisChainBufferAtFront(MyPacket, MyBuffer);
				Resvd =(PRSVD)(MyPacket->ProtocolReserved);
                Resvd->OriginalPkt = MyPacket;
				NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);
                NdisReturnPackets(&Packet, 1);
             	MyPacket->Private.Head->Next=NULL;
				MyPacket->Private.Tail=NULL;
				Resvd->IsPrivate = 1;
				Resvd->pMyBuffer=&MyBuffer;
				Resvd->	pMyContent=&pPacketContent;
				NdisSend(&Status4,pAdapt->BindingHandle,MyPacket);	
				if(Status4!=NDIS_STATUS_PENDING)
				{
					NdisUnchainBufferAtFront(MyPacket,&MyBuffer);
					NdisQueryBufferSafe(MyBuffer,&pPacketContent,&BufLength,32);
					if(pPacketContent != NULL)
					NdisFreeMemory(pPacketContent,BufLength,0);
					NdisFreeBuffer(MyBuffer);
					NdisDprFreePacket(MyPacket);	
				
				 }			
				return 0;		
			}
		
		}
		else
			NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);


		NdisFreeMemory(pPacketContent,BufLength,0);

    	if(Status == NDIS_STATUS_RESOURCES)
		{
			NdisDprFreePacket(MyPacket);
		}

		return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0);
	}
	else
	{
		return(0);
	}
}

VOID
MPReturnPacket(
	IN	NDIS_HANDLE		MiniportAdapterContext,
	IN	PNDIS_PACKET	Packet
)
{
	PADAPT			pAdapt = (PADAPT)MiniportAdapterContext;
	PNDIS_PACKET	MyPacket;
	PRSVD			Resvd;



	Resvd = (PRSVD)(Packet->MiniportReserved);
	MyPacket = Resvd->OriginalPkt;

	NdisFreePacket(Packet);
	NdisReturnPackets(&MyPacket, 1);
}


⌨️ 快捷键说明

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