Songzh
驱动牛犊
驱动牛犊
  • 注册日期2001-12-29
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1304回复:2

对passthru做的修改,帮忙看看

楼主#
更多 发布于:2002-04-11 08:25
我把passthru中的PtReceive和PtTransferDataComplete做了一些改动,安装后所有的网络连接都不能用了,请帮忙看看这些破代码有什么问题,谢谢!!!
VOID
PtTransferDataComplete(
IN  NDIS_HANDLEProtocolBindingContext,
IN  PNDIS_PACKETPacket,
IN  NDIS_STATUSStatus,
IN  UINTBytesTransferred
)
/*++

Routine Description:
Same as the Send above, all sends need to be completed on the Primary\'s MiniportHandle

Arguments:

Return values:

--*/
{
PADAPT  pAdapt =(PADAPT)ProtocolBindingContext;
PRSVD     Resvd;
PNDIS_PACKET     MyPacket;
UINT             bufLength;
UINT             bytesTransfered = 0;

NDIS_STATUS status = NDIS_STATUS_SUCCESS;

DbgPrint(\"==>PtTransferDataComplete(...)\\n\");

// Returning the Send on the Primary, will point to itself if there is no LBFO
pAdapt = pAdapt->pPrimaryAdapt;

if(pAdapt->MiniportHandle)
{
NDIS_SET_PACKET_STATUS(Packet, NDIS_STATUS_RESOURCES);
NDIS_SET_PACKET_HEADER_SIZE(Packet, 14);

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

if(NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING)
{
NdisDprFreePacket(Packet);
}
}

DbgPrint(\"<==PtTransferDataComplete(...)\\n\");
}


NDIS_STATUS
PtReceive(
IN  NDIS_HANDLEProtocolBindingContext,
IN  NDIS_HANDLEMacReceiveContext,
IN  PVOIDHeaderBuffer,
IN  UINTHeaderBufferSize,
IN  PVOIDLookAheadBuffer,
IN  UINTLookAheadBufferSize,
IN  UINTPacketSize
)
/*++

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

Arguments:


Return values:

--*/
{
PADAPTpAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_PACKETMyPacket, Packet;
NDIS_STATUSStatus = NDIS_STATUS_SUCCESS;
//******************************************************
UINT                     PacketLen, OffsetSize, BytesTransferred;
PRSVD                    Resvd;
NDIS_PHYSICAL_ADDRESS    HighestAcceptableAddress;
PUCHAR                   pPacketContent;
PNDIS_BUFFER             PacketBuffer, pBakBuffer, OffsetBuffer;
   //******************************************************
DbgPrint(\"==>PtReceive()\\n\");

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

//***************************************************************************************
       HighestAcceptableAddress.LowPart = -1;
HighestAcceptableAddress.HighPart = -1;

if(PacketSize <= LookAheadBufferSize)
{
DbgPrint(\"PacketSize <= LookAheadBufferSize\\n\");

Status = NdisAllocateMemory(&pPacketContent, 2000, 0, HighestAcceptableAddress);

if (Status != NDIS_STATUS_SUCCESS )
{
DbgPrint(\"ptreceive :ndisallocatememory failed\\n\");
return NDIS_STATUS_NOT_ACCEPTED;
}

if(pPacketContent == NULL)
{
DbgPrint(\"prreceive:pPacketContent == NULL\\n\");
return NDIS_STATUS_NOT_ACCEPTED;
}

RtlZeroMemory(pPacketContent, 2000);
RtlCopyMemory(pPacketContent,HeaderBuffer,HeaderBufferSize);
RtlCopyMemory(pPacketContent+HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize);

PacketLen = PacketSize+HeaderBufferSize;

NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle);
if(Status != NDIS_STATUS_SUCCESS)
{
DbgPrint(\"NdisDprAllocatePacket failed!\\n\");
return NDIS_STATUS_NOT_ACCEPTED;
}

if(Status == NDIS_STATUS_SUCCESS)
{
NdisAllocateBuffer(&Status, &PacketBuffer, pAdapt->RecvBufferPoolHandle, pPacketContent,PacketLen);
NdisChainBufferAtFront(MyPacket, PacketBuffer);

NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize);

NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);

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

if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING)
{
NdisFreeBuffer(PacketBuffer);
NdisFreeMemory(pPacketContent,2000,0);
NdisDprFreePacket(MyPacket);
}

return NDIS_STATUS_SUCCESS;
}
}
else
{
Status = NdisAllocateMemory(&pPacketContent, 2000, 0, HighestAcceptableAddress);
if (Status != NDIS_STATUS_SUCCESS)
{
DbgPrint(\"ptreceive :ndisallocatememory failed\\n\");
return NDIS_STATUS_NOT_ACCEPTED;
}
if(pPacketContent == NULL)
{
DbgPrint(\"prreceive:pPacketContent == NULL\\n\");
return NDIS_STATUS_NOT_ACCEPTED;
}

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

NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketSize);
NdisChainBufferAtFront(MyPacket, PacketBuffer);

NdisTransferData(&Status,
pAdapt->BindingHandle,
MacReceiveContext,
0,          
PacketSize,
MyPacket,
&BytesTransferred);

if ( Status != NDIS_STATUS_PENDING )
{

NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize);

NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);

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

if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING)
{
NdisFreeBuffer(PacketBuffer);
NdisFreeMemory(pPacketContent,2000,0);
NdisDprFreePacket(MyPacket);
}

return NDIS_STATUS_SUCCESS;

}
}

} while(FALSE);

return Status;
}

最新喜欢:

moqingsongmoqing...
mister
驱动牛犊
驱动牛犊
  • 注册日期2001-11-25
  • 最后登录2013-02-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望26点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-11 08:58
NdisTransferData只是传递在LookaheadBuffer中没有出现的数据内容,不是传递这个包。
且NdisTransferData函数只会将数据传递到Packet的第一个Buffer,即使它所传的数据不是开始的数据。
Songzh
驱动牛犊
驱动牛犊
  • 注册日期2001-12-29
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-12 11:19
多谢!!!
游客

返回顶部