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

📄 send.c

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

#include "prexsim.h"
#pragma hdrstop

NDIS_STATUS
MPSendOnePacket(
	IN	NDIS_HANDLE		MiniportAdapterContext,
	IN	PNDIS_PACKET	Packet,
	IN	UINT			Flags
)
{
	PADAPT			pAdapt = (PADAPT)MiniportAdapterContext;
	NDIS_STATUS		Status;
	PNDIS_PACKET	MyPacket;
	PRSVD			Rsvd;
	PVOID			MediaSpecificInfo		= NULL;
	ULONG			MediaSpecificInfoSize	= 0;

	if (IsIMDeviceStateOn (pAdapt) == FALSE)
		return NDIS_STATUS_FAILURE;

	NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle);

	if (Status == NDIS_STATUS_SUCCESS)
	{
		PNDIS_PACKET_EXTENSION	Old, New;

		Rsvd = (PRSVD)(MyPacket->ProtocolReserved);

		Rsvd->OriginalPkt = Packet;
		MyPacket->Private.Flags = Flags;

		MyPacket->Private.Head = Packet->Private.Head;
		MyPacket->Private.Tail = Packet->Private.Tail;
		NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);

		NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket),
					   NDIS_OOB_DATA_FROM_PACKET(Packet),
					   sizeof(NDIS_PACKET_OOB_DATA));

		NdisIMCopySendPerPacketInfo(MyPacket, Packet);
		
		NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(
			Packet,	&MediaSpecificInfo,	&MediaSpecificInfoSize);

		if (MediaSpecificInfo || MediaSpecificInfoSize)
		{
			NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(
				MyPacket, MediaSpecificInfo, MediaSpecificInfoSize);
		}

		NdisSend(&Status, pAdapt->BindingHandle, MyPacket);
		//Rsvd->IsPrivate=1;
		if (Status != NDIS_STATUS_PENDING)
		{
			NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
			//NdisFreePacket(MyPacket);

			//PrintPacket(Packet);
		}
	}

	return(Status);
}

NDIS_STATUS
MPSend(
	IN	NDIS_HANDLE		MiniportAdapterContext,
	IN	PNDIS_PACKET	Packet,
	IN	UINT			Flags
)
{
	PADAPT			pAdapt = (PADAPT)MiniportAdapterContext;
	NDIS_STATUS		Status;

	//DBGPRINT("==>Passthru Miniport MPSend\n");
	ASSERT (pAdapt->pSecondaryAdapt);

	pAdapt = pAdapt->pSecondaryAdapt;

	Status = MPSendOnePacket(pAdapt, Packet, Flags);

	return(Status);
}

VOID
MPSendPackets(
	IN	NDIS_HANDLE				MiniportAdapterContext,
	IN	PPNDIS_PACKET			PacketArray,
	IN	UINT					NumberOfPackets
)
{
	PADAPT			pAdapt = (PADAPT)MiniportAdapterContext;
	NDIS_STATUS		Status;
	UINT			i;

	pAdapt = pAdapt->pSecondaryAdapt;

	for (i = 0; i < NumberOfPackets; i++)
	{
		PNDIS_PACKET	Packet;
		Packet = PacketArray[i];
		Status = MPSendOnePacket(pAdapt, Packet, NdisGetPacketFlags(Packet));
		if (Status != NDIS_STATUS_PENDING)
		{
			NdisMSendComplete(
				pAdapt->pPrimaryAdapt->MiniportHandle, Packet, Status);
		}
	}
}

NDIS_STATUS
MPTransferData(
	OUT PNDIS_PACKET			Packet,
	OUT PUINT					BytesTransferred,
	IN	NDIS_HANDLE				MiniportAdapterContext,
	IN	NDIS_HANDLE				MiniportReceiveContext,
	IN	UINT					ByteOffset,
	IN	UINT					BytesToTransfer
)
{
	PADAPT		pAdapt = (PADAPT)MiniportAdapterContext;
	NDIS_STATUS	Status;

	//DBGPRINT("==>Passthru Miniport MPTransferData\n");
	
	if (IsIMDeviceStateOn(pAdapt) == FALSE)
	{
		return NDIS_STATUS_FAILURE;
	}

	pAdapt = pAdapt->pPrimaryAdapt;

	NdisTransferData(&Status,
					 pAdapt->BindingHandle,
					 MiniportReceiveContext,
					 ByteOffset,
					 BytesToTransfer,
					 Packet,
					 BytesTransferred);

	if(Status == NDIS_STATUS_SUCCESS)
	{
		//PrintPacket(Packet);
		//DbgPrint("    BytesTransferred: %u\n", *BytesTransferred);
	}

	return(Status);
}

VOID
PtSendComplete(
	IN	NDIS_HANDLE			ProtocolBindingContext,
	IN  PNDIS_PACKET		Packet,
	IN  NDIS_STATUS			Status
)
{
	PADAPT			pAdapt =(PADAPT)ProtocolBindingContext;
	PNDIS_PACKET	        Pkt;
	PRSVD			Rsvd;
 	PNDIS_BUFFER pPacketBuffer;
  	PUCHAR pPacketContent;
  	UINT BufLength;

	DBGPRINT("==> Passthru Protocol PtSendComplete\n");
	
	//PrintPacket(Packet);


pAdapt = pAdapt->pPrimaryAdapt;
Rsvd =(PRSVD)(Packet->ProtocolReserved);
Pkt = Rsvd->OriginalPkt; 
pPacketBuffer = (PNDIS_BUFFER)Rsvd->pMyBuffer;
pPacketContent = (PUCHAR)Rsvd->pMyContent;
	DBGPRINT("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
DbgPrint("Rsvd->IsPrivate: %u\n", Rsvd->IsPrivate);
	DBGPRINT("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");


if (!Rsvd->IsPrivate)
{
NdisIMCopySendCompletePerPacketInfo (Pkt, Packet);
NdisDprFreePacket(Packet);
NdisMSendComplete(pAdapt->MiniportHandle, Pkt,Status);
DBGPRINT("<== Passthru Protocol PtSendComplete\n");
}
else
{
NdisUnchainBufferAtFront(Packet,&pPacketBuffer);
NdisQueryBufferSafe(pPacketBuffer,&pPacketContent,&BufLength,32);
NdisFreeBuffer(pPacketBuffer);
if(pPacketContent != NULL)
NdisFreeMemory(pPacketContent,BufLength,0);
NdisDprFreePacket(Packet);

}

}

VOID
PtTransferDataComplete(
	IN  NDIS_HANDLE			ProtocolBindingContext,
	IN  PNDIS_PACKET		Packet,
	IN  NDIS_STATUS			Status,
	IN  UINT				BytesTransferred
)
{
	PADAPT pAdapt = (PADAPT)ProtocolBindingContext;
	pAdapt = pAdapt->pPrimaryAdapt;

	//DBGPRINT("<== Passthru Protocol PtTransferDataComplete\n");

	//PrintPacket(Packet);

	if(pAdapt->MiniportHandle)
	{
		  NdisMTransferDataComplete(
			  pAdapt->MiniportHandle, Packet, Status, BytesTransferred);
	}
	//DBGPRINT("<== Passthru Protocol PtTransferDataComplete\n");
}

⌨️ 快捷键说明

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