程序代码:
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 Packet,MyPacket,LookAheadPacket,LaterPacket;
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PUCHAR pPacketContent,pLookAheadContent,pLaterContent;
PNDIS_BUFFER pPacketBuffer,pLookAheadBuffer,pLaterBuffer;
NDIS_PHYSICAL_ADDRESS HighestAcceptableMax;
UINT OffsetSize,PacketLen,BytesTransferred;
PRECV_RSVD Rsvd=NULL;
HighestAcceptableMax.LowPart = -1;
HighestAcceptableMax.HighPart = -1;
if (!pAdapt->MiniportHandle)
{
Status = NDIS_STATUS_FAILURE;
}
else do
{
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);
NdisDprFreePacket(MyPacket);
break;
}
}
///////////////////////收包截获A///////////////////////////////////////////////////
else if (LookAheadBufferSize>=PacketSize)
{
DBGPRINT (("1 PtReceive PacketSize=%d,LookAheadBufferSize=%d\n",PacketSize,LookAheadBufferSize));
Status=NdisAllocateMemory(&pPacketContent,BUFFER_SIZE,0,HighestAcceptableMax);
if(Status!=NDIS_STATUS_SUCCESS)
{
DBGPRINT(("PTReceive:NdisAllocateMemory pPacketContent Failed\n"));
break;
}
if(pPacketContent==NULL)
{
DBGPRINT(("PTReceive:pPacketContent==NULL\n"));
return(NDIS_STATUS_NOT_ACCEPTED);
}
NdisZeroMemory(pPacketContent,BUFFER_SIZE);
NdisMoveMemory(pPacketContent,HeaderBuffer,HeaderBufferSize);
NdisMoveMemory(pPacketContent+HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize);
PacketLen=PacketSize+HeaderBufferSize;//接收包长度
DBGPRINT(("+++++++++++MypacketContent In PtReceive 1+++++++++++++++++++"));
MyFixRecv(pPacketContent,PacketLen); ///////////我对包的处理(乾坤大挪移,哈),
NdisDprAllocatePacket(&Status,&MyPacket,pAdapt->RecvPacketPoolHandle);
if(Status!=NDIS_STATUS_SUCCESS)
{
NdisFreeMemory(pPacketContent,BUFFER_SIZE,0);
break;
}
//分配buffer
NdisAllocateBuffer(&Status,&pPacketBuffer,pAdapt->RcvBufferPoolHandle,pPacketContent,PacketLen);
if (Status!=NDIS_STATUS_SUCCESS)
{
NdisFreeMemory(pPacketContent,BUFFER_SIZE,0);
NdisDprFreePacket(MyPacket);
break;
}
//对分配的包作处理
NdisChainBufferAtFront(MyPacket,pPacketBuffer);
MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;
Rsvd=(PRECV_RSVD)(MyPacket->MiniportReserved);
Rsvd->OriginalPkt=NULL;
NDIS_SET_PACKET_HEADER_SIZE(MyPacket,HeaderBufferSize);
//提交包,如状态为PENDING,则调用MPReturnPacket
NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyPacket,1);
if(NDIS_GET_PACKET_STATUS(MyPacket)!=NDIS_STATUS_PENDING)
{
DBGPRINT(("In PtReceive NDIS_GET_PACKET_STATUS(MyPacket)!=NDIS_STATUS_PENDING Free Memory\n"));
NdisFreeBuffer(pPacketBuffer);
NdisFreeMemory(pPacketContent,BUFFER_SIZE,0);
NdisDprFreePacket(MyPacket);
}
break;
}
else
{
DBGPRINT (("2 PtReceive PacketSize=%d,LookAheadBufferSize=%d\n",PacketSize,LookAheadBufferSize));
////////////////////////////组包接收LookAhead数据A//////////////////////////////////
OffsetSize=HeaderBufferSize+LookAheadBufferSize;
Status=NdisAllocateMemory(&pLookAheadContent,BUFFER_SIZE,0,HighestAcceptableMax);
if(Status!=NDIS_STATUS_SUCCESS)
{
DBGPRINT(("PtReceive:NdisAllocateMemory pLookAheadContent Failed.\n"));
break;
}
if(pLookAheadContent==NULL)
{
DBGPRINT(("PTReceive:pLookAheadContent==NULL\n"));
return(NDIS_STATUS_NOT_ACCEPTED);
}
NdisZeroMemory(pLookAheadContent,BUFFER_SIZE);
NdisMoveMemory(pLookAheadContent,HeaderBuffer,HeaderBufferSize);
NdisMoveMemory(pLookAheadContent+HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize);
NdisAllocateBuffer(&Status,&pLookAheadBuffer,pAdapt->RcvBufferPoolHandle,pLookAheadContent,OffsetSize);
if (Status!=NDIS_STATUS_SUCCESS)
{
DBGPRINT(("PtReceive:NdisAllocateBuffer pPacketBuffer Failed.\n"));
NdisFreeMemory(pLookAheadContent,BUFFER_SIZE,0);
break;
}
NdisDprAllocatePacket(&Status,&LookAheadPacket,pAdapt->RecvPacketPoolHandle);
if (Status!=NDIS_STATUS_SUCCESS)
{
DBGPRINT(("PtReceive:NdisDprAllocatePacket LookAheadPacket Failed.\n"));
NdisFreeMemory(pLookAheadContent,BUFFER_SIZE,0);
NdisFreeBuffer(pLookAheadBuffer);
break;
}
NdisChainBufferAtFront(LookAheadPacket,pLookAheadBuffer);
LookAheadPacket->Private.Head->Next=NULL;
LookAheadPacket->Private.Tail=NULL;
////////////////////////////组包接收后续数据A//////////////////////////////////
//分配Memory,用于接收后续数据
Status=NdisAllocateMemory(&pLaterContent,BUFFER_SIZE,0,HighestAcceptableMax);
if(Status!=NDIS_STATUS_SUCCESS)
{
DBGPRINT(("PtReceive:NdisAllocateMemory pLaterContent Failed.\n"));
NdisFreeMemory(pLookAheadContent,BUFFER_SIZE,0);
NdisFreeBuffer(pLookAheadBuffer);
NdisDprFreePacket(LookAheadPacket);
break;
}
if(pLaterContent==NULL)
{
DBGPRINT(("PTReceive:pLaterContent==NULL\n"));
NdisFreeMemory(pLookAheadContent,BUFFER_SIZE,0);
NdisFreeBuffer(pLookAheadBuffer);
NdisDprFreePacket(LookAheadPacket);
return(NDIS_STATUS_NOT_ACCEPTED);
}
NdisZeroMemory(pLaterContent,BUFFER_SIZE);
//分配pLaterBuffer
NdisAllocateBuffer(&Status,&pLaterBuffer,pAdapt->RcvBufferPoolHandle,pLaterContent,PacketSize-LookAheadBufferSize);
if (Status!=NDIS_STATUS_SUCCESS)
{
NdisFreeMemory(pLookAheadContent,BUFFER_SIZE,0);
NdisFreeBuffer(pLookAheadBuffer);
NdisDprFreePacket(LookAheadPacket);
NdisFreeMemory(pLaterContent,BUFFER_SIZE,0);
break;
}
//分配LaterPacket
NdisDprAllocatePacket(&Status,&LaterPacket,pAdapt->RecvPacketPoolHandle);
if (Status!=NDIS_STATUS_SUCCESS)
{
NdisFreeMemory(pLookAheadContent,BUFFER_SIZE,0);
NdisFreeBuffer(pLookAheadBuffer);
NdisDprFreePacket(LookAheadPacket);
NdisFreeMemory(pLaterContent,BUFFER_SIZE,0);
NdisFreeBuffer(pLaterBuffer);
break;
}
NdisChainBufferAtFront(LaterPacket,pLaterBuffer);
LaterPacket->Private.Head->Next=NULL;
LaterPacket->Private.Tail=NULL;
NDIS_SET_PACKET_HEADER_SIZE(LaterPacket,HeaderBufferSize);
////////////////////////////组包接收后续数据V//////////////////////////////////
//将先接到的数据包连接到后收到的数据包上
Rsvd=(PRECV_RSVD)(LaterPacket->MiniportReserved);
Rsvd->OriginalPkt=(PNDIS_PACKET)LookAheadPacket;
//接收后续数据
NdisTransferData(&Status,pAdapt->BindingHandle,MacReceiveContext,LookAheadBufferSize,PacketSize-LookAheadBufferSize,LaterPacket,&BytesTransferred);
if(Status!=NDIS_STATUS_PENDING)
{
DBGPRINT(("NdisTransferData != NDIS_STATUS_PENDING"));
PtTransferDataComplete((NDIS_HANDLE)pAdapt,LaterPacket,Status,BytesTransferred);
}
break;
}
///////////////////////收包截获V///////////////////////////////////////////////////
pAdapt->IndicateRcvComplete = TRUE;
switch (pAdapt->Medium)
{
case NdisMedium802_3:
case NdisMediumWan:
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(FALSE);
break;
}
} while(FALSE);
return Status;
}
[
本帖最后由 东海一鱼 于 2009-8-18 08:11 编辑 ]