dk_xiaofei
驱动牛犊
驱动牛犊
  • 注册日期2003-07-09
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1322回复:2

那位大侠帮我看看我的PtReceive 为什么老是蓝屏

楼主#
更多 发布于:2004-05-23 13:47
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;

// [2004年5月21日9时15分]
//PNDIS_PACKET        pMyPacket;
BOOLEAN             Remaining;

ULONG               MACAddrComp,                  // ja, 17.08.2003.
ulEncPayload,
ulUnencPayload;

#define             szPayloadCopy ETH_MAX_PACKET_SIZE
char                PayloadCopy[szPayloadCopy];
pEthHdr             pETH;
PUCHAR              pCurr,
pEnd,
pUnencPayload = NULL;

if(!pAdapt->MiniportHandle)
{
return NDIS_STATUS_FAILURE;
}
else
{
if(pAdapt->isSecondary)
{
DBGPRINT(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\");
ASSERT(0);
}

Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);

if(Packet != NULL)
{
DbgPrint(\"==> Passthru Protocol PtReceive RePacket...\\n\");


// [2004年5月21日9时16分]
// ja, 17.08.2003.

GetPktPayload(Packet,                            // Copy payload
PayloadCopy,                        //   to area.
szPayloadCopy,                      // Amount of space in area.
&ulEncPayload                       // Return number of bytes in packet.
);

pETH = (pEthHdr)PayloadCopy;


switch(NDIS_GET_PACKET_PROTOCOL_TYPE(Packet))
{
case NDIS_PROTOCOL_ID_DEFAULT:

DbgPrint((\"Receive DEFAULT packet\\n\"));


Status =                                             // Allocate nonpaged storage for new, unencapsulated payload.
NdisAllocateMemoryWithTag(&pUnencPayload,
ulEncPayload,
TAG
);

if (NDIS_STATUS_SUCCESS!=Status)
{
DbgPrint(\"PtReceive():  Failed to allocate memory for payload, status = 0x%08x\\n\", Status);

ASSERT(0);
return(0);

}
memcpy(pUnencPayload,                              // Copy original payload to area for new payload.
PayloadCopy,
ulEncPayload
);

break;
case NDIS_PROTOCOL_ID_TCP_IP :
{

DbgPrint(\"Receive TCP/IP packet\\n\");

Status = PtBuildOrigPkt(                     // Get original, unencapsulated payload.
PayloadCopy,
&pUnencPayload,
&ulUnencPayload
);

if (NDIS_STATUS_SUCCESS!=Status)             // A problem?
{
DbgPrint(\"PtReceive():  Status from PtBuildOrigPkt() = 0x%08x\\n\", Status);
ASSERT(0);
}
if (NULL==pUnencPayload)                          // Don\'t have unencapsulated payload?
{

#ifdef NDIS51
//
// Check if we can reuse the same packet for indicating up.
// See also: PtReceive().
//
(VOID)NdisIMGetCurrentPacketStack(pPacket, &Remaining);
if (Remaining)
{
//
// We can reuse \"Packet\". Indicate it up and be done with it.
//
Status = NDIS_GET_PACKET_STATUS(pPacket);
NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &pPacket, 1);
return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0);
}
#endif // NDIS51

}


}
break;
case NDIS_PROTOCOL_ID_IPX :

DbgPrint(\"Receive IPX packet\\n\");
// pUnencPayload=PayloadCopy;
// ulUnencPayload=ulEncPayload;

break;
case NDIS_PROTOCOL_ID_NBF :

DbgPrint(\"Receive NBF packet\\n\");
// pUnencPayload=PayloadCopy;
// ulUnencPayload=ulEncPayload;

break;
default:

DbgPrint(\"Receive UNKNOWN packet\\n\");
// 如果是没有明确指出要处理的包,就不处理。[2004年5月18日9时05分]
// pUnencPayload=PayloadCopy;
// ulUnencPayload=ulEncPayload;

break;
}


// [2004年5月21日9时18分]
// NdisAllocatePacket( &Status,&MyPacket,pAdapt->RecvPacketPoolHandle);

NdisDprAllocatePacket(&Status,&MyPacket, pAdapt->RecvPacketPoolHandle);

if(Status == NDIS_STATUS_SUCCESS)
{
PNDIS_BUFFER pNewNdisBfr;
PRSVD Resvd;

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

MyPacket->Private.Head = Packet->Private.Head;
MyPacket->Private.Tail = Packet->Private.Tail;

if (NULL!=pUnencPayload)                      // Have unencapsulated payload?
{

NdisAllocateBuffer( &Status,                // Build new buffer descriptor.
&pNewNdisBfr,
pAdapt->RecvPacketPoolHandle,
pUnencPayload,
ulUnencPayload
);

if (NDIS_STATUS_SUCCESS!=Status)
{
DbgPrint(\"PtReceive() failed to get a buffer, status = 0x%08x\\n\", Status);
ASSERT(0);

// Do something!
}

NdisChainBufferAtFront( MyPacket,          // Chain new buffer descriptor to new packet.
pNewNdisBfr
);

}
else
{
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,NDIS_GET_PACKET_HEADER_SIZE(Packet));

NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet);

//NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);

Status = NDIS_GET_PACKET_STATUS(Packet);

NDIS_SET_PACKET_STATUS(MyPacket, Status);

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

//ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES)
if (Status == NDIS_STATUS_RESOURCES)
{
if (NULL!=pUnencPayload)                  // Have unencapsulated payload?
{
NdisFreeBuffer(pNewNdisBfr);           // Recycle buffer descriptor.                              

//就是这里要蓝屏
NdisFreeMemory(pUnencPayload,          // Recycle memory.
ulUnencPayload,
0
);

pUnencPayload = NULL;
}

//
// Our ReturnPackets handler will not be called for this packet.
// We should reclaim it right here.
//
NdisDprFreePacket(MyPacket);
}

return((Status != NDIS_STATUS_RESOURCES) ? 1 : 0);
//PrintPacket(MyPacket);

//NdisDprFreePacket(MyPacket);
    //DBGPRINT(\"<== Passthru Protocol PtReceive RePacket Success...\\n\");
}
else
{
if (NULL!=pUnencPayload)                      // Have unencapsulated payload?
NdisFreeMemory(pUnencPayload,               // Recycle memory.
ulUnencPayload,
0
);

//
// We are out of packets. Silently drop it.
//
return(0);
}
}

}

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

return Status;

}
OnebyOnePlease
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2010-03-19
  • 粉丝0
  • 关注0
  • 积分99分
  • 威望31点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-24 22:43
把ptRecivedPacket 也修该和ptRecive一样试试。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-25 08:56
只有case NDIS_PROTOCOL_ID_DEFAULT:时pUnencPayload才被分配,而
NdisFreeMemory(pUnencPayload,。。。却总被执行。释放一块不存在的内存会有什么结果呢。
游客

返回顶部