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