wirelessboy
驱动牛犊
驱动牛犊
  • 注册日期2002-04-21
  • 最后登录2003-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1260回复:0

欧想在passthru中实现数据包的重构,请指教!

楼主#
更多 发布于:2002-05-07 10:13
下面是一段源代码,我想要添加的东东想写在
#if MODIFY

#endif
之间,不知道该如何下手,请各位指点一二

//bow

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
)
/*++

Routine Description:
LBFO - need to use primary for all receives

Arguments:


Return Value:

--*/
{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_PACKET MyPacket, Packet;
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;

UINT BufferCount;
UINT BufferLength;
UINT i,j;
PNDIS_BUFFER CurrentBuffer,NextBuffer,BufferVA;

#if DBGOUT
DbgPrint(\"=> PtReceive is called ...\\n\");
#endif

if(!pAdapt->MiniportHandle)
{
Status = NDIS_STATUS_FAILURE;
}
else do
{
//
// We should not be getting Receives on a Secondary, this is just specific to our  LBFO driver
//

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

//
// 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)
{
//
//DbgPrint(\"==> @PtReceive: Packet is not NULL\\n\");
//

//
// Get a packet off the pool and indicate that up
//
NdisDprAllocatePacket(&Status,
 &MyPacket,
 pAdapt->RecvPacketPoolHandle);

if(Status == NDIS_STATUS_SUCCESS)
{
//
//DbgPrint(\"==> @PtReceive: Statuse is NDIS_STATUS_SUCCESS\\n\");
//

 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);
 NdisSetPacketFlags(MyPacket,  NdisGetPacketFlags(Packet));

 //
 // Make sure the status is set to NDIS_STATUS_RESOURCES.
 //
 NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);

#if MPACKETDISPLAY
//
// Display the information of the packet
//
DbgPrint(\"\\n======PACKET INFORMATION@PtReceive Before Relocated========\\n\");

//
// Get the number of the buffer
//
NdisQueryPacket(MyPacket, NULL, &BufferCount, &CurrentBuffer, NULL);

//
// Display the BufferCount
//
DbgPrint(\"\\t* BufferCount is %d\\n\",BufferCount);

if(BufferCount == 0)
{
DbgPrint(\"==>REPORT@PtReceive: BufferCount is Zero\\n\");
}
else do
{
for(i = 0; i < BufferCount; i ++)
{
//
// Display No. i Buffer
//
DbgPrint(\"\\n\\t* i  =  %d\\n\",i);

NdisQueryBuffer(CurrentBuffer, &BufferVA, &BufferLength);

for(j = 0; j < BufferLength; j ++)
{
DbgPrint(\"%2X \",((PUCHAR)(BufferVA))[j]);
if(j && ((j + 1) % 16 == 0))
DbgPrint(\"\\n\");
}
DbgPrint(\"\\n\");

NdisGetNextBuffer(CurrentBuffer, &NextBuffer);
if(NextBuffer == NULL)
{
if(i < (BufferCount - 1))
DbgPrint(\"==>Error Report@PtReceive: NextBuffer is Null\\n\");
break;
}

CurrentBuffer = NextBuffer;
}
DbgPrint(\"\\n\");
} while(FALSE);
#endif

#if MODIFY
//
// Todo: ...
//

#endif

#if PACKETDISPLAY
//
// Display the information of the packet
//
DbgPrint(\"\\n========PACKET INFORMATION@PtReceive Relocated=========\\n\");

//
// Get the number of the buffer
//
NdisQueryPacket(MyPacket, NULL, &BufferCount, &CurrentBuffer, NULL);

//
// Display the BufferCount
//
DbgPrint(\"\\t* BufferCount is %d\\n\",BufferCount);

if(BufferCount == 0)
{
DbgPrint(\"==>REPORT@PtReceive: BufferCount is Zero\\n\");
}
else do
{
for(i = 0; i < BufferCount; i ++)
{
//
// Display No. i Buffer
//
DbgPrint(\"\\n\\t* i  =  %d\\n\",i);

NdisQueryBuffer(CurrentBuffer, &BufferVA, &BufferLength);

for(j = 0; j < BufferLength; j ++)
{
DbgPrint(\"%2X \",((PUCHAR)(BufferVA))[j]);
if(j && ((j + 1) % 16 == 0))
DbgPrint(\"\\n\");
}
DbgPrint(\"\\n\");

NdisGetNextBuffer(CurrentBuffer, &NextBuffer);
if(NextBuffer == NULL)
{
if(i < (BufferCount - 1))
DbgPrint(\"==>Error Report@PtReceive: NextBuffer is Null\\n\");
break;
}

CurrentBuffer = NextBuffer;
}
DbgPrint(\"\\n\");
} while(FALSE);
#endif

 NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);

 ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES);
 
 NdisDprFreePacket(MyPacket);
 
 break;
}

DbgPrint(\"==> @PtReceive: Statuse is not NDIS_STATUS_SUCCESS\\n\");

}

//
// Fall through if the miniport below us has either not indicated a packet or we could not
// allocate one
//
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);
游客

返回顶部