xemexzj
驱动牛犊
驱动牛犊
  • 注册日期2001-11-07
  • 最后登录2006-03-15
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2002-03-11 16:30
to: ysy
对于Packet==NULL我就是没有解决呀!否则也不用敬仰别人了!



case NdisMedium802_3:
MyPacket = NULL;
do{
NdisDprAllocatePacket( &Status, &MyPacket, pAdapt->RecvPacketPoolHandle );
if( Status != NDIS_STATUS_SUCCESS ) break;
phyAddr.QuadPart = -1;

Status = NdisAllocateMemory( &pData,
HeaderBufferSize + PacketSize,
0, phyAddr );

if( Status != NDIS_STATUS_SUCCESS ) break;

NdisMoveMappedMemory( pData,
HeaderBuffer,
HeaderBufferSize );

NdisAllocateBuffer(&Status,
&pHeadBuffer,
pAdapt->hRcvBufferPoolHandle,
pData,
HeaderBufferSize );
if( Status != NDIS_STATUS_SUCCESS )break;
pHeadBuffer->Next = NULL;

((PRSVD)(MyPacket->MiniportReserved))->pHeadBuffer = pHeadBuffer;
((PRSVD)(MyPacket->MiniportReserved))->OriginalPkt = NULL;
NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize );
MyPacket->Private.Head = NULL;
MyPacket->Private.Tail = NULL;

if( PacketSize > LookAheadBufferSize )
{
nTransfer = PacketSize;
NdisAllocateBuffer( &Status,
&pDataBuffer,
pAdapt->hRcvBufferPoolHandle,
((PUCHAR)pData) + HeaderBufferSize,
nTransfer );
pDataBuffer->Next = NULL;

if( Status != NDIS_STATUS_SUCCESS ) break;

NdisChainBufferAtFront( MyPacket, pDataBuffer );
NdisTransferData( &Status,
pAdapt->BindingHandle,
MacReceiveContext,
0,
nTransfer,
MyPacket,
&nBytesTransfered );

}
else{
NdisMoveMemory( (CHAR *)pData + HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize );

NdisAllocateBuffer( &Status,
&pDataBuffer,
pAdapt->hRcvBufferPoolHandle,
(PUCHAR)pData + HeaderBufferSize,
LookAheadBufferSize );
if( Status != NDIS_STATUS_SUCCESS ) break;
NdisChainBufferAtFront( MyPacket, pDataBuffer );
}
}while(FALSE);

if( Status == NDIS_STATUS_SUCCESS )
{
//NdisChainBufferAtFront( MyPacket, pHeadBuffer );
//NDIS_SET_PACKET_STATUS( MyPacket, NDIS_STATUS_RESOURCES );
//NdisMIndicateReceivePacket(pAdapt->MiniportHandle,  &MyPacket, 1 );
PtTransferDataComplete( pAdapt, MyPacket, Status, HeaderBufferSize + PacketSize );
break;
}

if( Status != NDIS_STATUS_SUCCESS && Status != NDIS_STATUS_PENDING );
{
if( MyPacket ) NdisDprFreePacket(MyPacket);
if( pHeadBuffer ) NdisFreeBuffer( pHeadBuffer );
if( pDataBuffer ) NdisFreeBuffer( pDataBuffer );
if( pData ) NdisFreeMemory( pData, HeaderBufferSize + PacketSize, 0 );
}
break;

VOID
PtTransferDataComplete(
IN  NDIS_HANDLE ProtocolBindingContext,
IN  PNDIS_PACKET Packet,
IN  NDIS_STATUS Status,
IN  UINT BytesTransferred
)
{
PADAPT  pAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_BUFFER  pBuffer=0, pNextBuffer=0;
UINT  nBufferLen, nTotalLen = 0;
PVOID  pVirtualAddr = 0;

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

if(pAdapt->MiniportHandle)
{
NdisQueryPacket(Packet,
NULL,
NULL,
&pBuffer,
NULL);

while( pBuffer )
{
NdisQueryBuffer( pBuffer, NULL, &nBufferLen );
nTotalLen += nBufferLen;
NdisGetNextBuffer( pBuffer, &pNextBuffer );
NdisFreeBuffer( pBuffer );
pBuffer = pNextBuffer;
}

pBuffer = ((PRSVD)(Packet->MiniportReserved))->pHeadBuffer;
NdisQueryBuffer( pBuffer, &pVirtualAddr, &nBufferLen );
nTotalLen += nBufferLen;
NdisAdjustBufferLength( pBuffer, nTotalLen );

Packet->Private.Head = NULL;
Packet->Private.Tail = NULL;
pBuffer->Next = NULL;
NdisChainBufferAtFront( Packet, pBuffer );

NdisMIndicateReceivePacket( pAdapt->MiniportHandle, &Packet, 1 );
if( NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING )
{
MPReturnPacket((NDIS_HANDLE)pAdapt,Packet);
}
}
}
xeme
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2002-03-12 16:39
请问xemexzj,huyg,在PtTransferDataComplete例程里面
pAdapt = pAdapt->pPrimaryAdapt;
pPrimaryAdapt是怎么得到的?在北京吗?我请你吃饭!!!!
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2002-03-12 17:56
大侠们,再不指点两手,我都快给憋死了.xemexzj的代码我也试过,huyg的代码我也试过,都是不行!你们的代码在你们的机器上工作都正常吗?
pPrimaryAdapt问题解决了,你用的是2k上的sample.我用的是xp上的.现在我也用2k上的了.
我把代码贴出来,请帮忙分析一下.谢谢!
注释掉的是xemexzj和微软的源吗,别的是HUYG和微软的.

.........      
NdisAllocateBufferPool(
         Status,
         &pAdapt->RecvBufferPoolHandle,
          MAX_RECV_PACKET_POOL_SIZE);
..........
do{
//PADAPT pOpenContext;
PNDIS_PACKET            MyPacket, MyPacket2;
PUCHAR                  pPacketContent, pBakBuffer;
UINT                    BytesTransferred;
PNDIS_BUFFER            PacketBuffer, OffsetBuffer;
PRSVD Resvd;
ULONG PacketLen, OffsetSize;
NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;

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

//pOpenContext = (PADAPT)ProtocolBindingContext;
//NUIO_STRUCT_ASSERT(pOpenContext, oc);
//pRcvPacket = NULL;
//pRcvData = NULL;
Status = NDIS_STATUS_SUCCESS;

if(PacketSize <= LookAheadBufferSize) {
DbgPrint(\"pAdapt->Medium = %d\\n\", pAdapt->Medium);
NdisMEthIndicateReceive(pAdapt->MiniportHandle,
MacReceiveContext,
HeaderBuffer,
HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize,
PacketSize);
break;
}

//
// fall here, the PacketSize > LookAhdeadBufferSize
//
Status = NdisAllocateMemory(
&pPacketContent,
2000,
0,
HighestAcceptableAddress);

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

if(pPacketContent == NULL)
{
DbgPrint(\"ptreceive:pPacketContent == NULL\\n\");
Status = NDIS_STATUS_NOT_ACCEPTED;
break;
}

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


NdisAllocateMemory(
&pBakBuffer,
2000,
0,
HighestAcceptableAddress);
if(Status != NDIS_STATUS_SUCCESS)
{
DbgPrint(\"ptreceive:allcate bak buffer failed\\n\");
Status = NDIS_STATUS_NOT_ACCEPTED;
break;
}

NdisMoveMemory(
pBakBuffer,
HeaderBuffer,
HeaderBufferSize
);
NdisMoveMemory(
pBakBuffer+HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize
);
PacketLen = HeaderBufferSize + PacketSize;
NdisAllocateBuffer(
&Status,
&PacketBuffer,
pAdapt->RecvBufferPoolHandle,
pPacketContent,
PacketSize-LookAheadBufferSize
);
NdisChainBufferAtFront(
MyPacket,
PacketBuffer
);
MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;

OffsetSize = HeaderBufferSize + LookAheadBufferSize;

NdisDprAllocatePacket(
&Status,
&MyPacket2,
pAdapt->RecvPacketPoolHandle
);
NdisAllocateBuffer(
&Status,
&OffsetBuffer,
pAdapt->RecvBufferPoolHandle ,
pBakBuffer,
OffsetSize
);
NdisChainBufferAtFront(
MyPacket2,
OffsetBuffer
);

Resvd =(PRSVD)(MyPacket->MiniportReserved);
Resvd->OriginalPkt = (PNDIS_PACKET)MyPacket2;

NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize );

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

if ( Status != NDIS_STATUS_PENDING )
{
PtTransferDataComplete(
(NDIS_HANDLE)pAdapt,
MyPacket,
Status,
BytesTransferred
);
}
}while(0);
/* MyPacket = NULL;
do{
NdisDprAllocatePacket( &Status, &MyPacket, pAdapt->RecvPacketPoolHandle );
if( Status != NDIS_STATUS_SUCCESS ) break;
phyAddr.QuadPart = -1;

Status = NdisAllocateMemory( &pData,
HeaderBufferSize + PacketSize,
0, phyAddr );

if( Status != NDIS_STATUS_SUCCESS ) break;

NdisMoveMappedMemory(
pData,
HeaderBuffer,
HeaderBufferSize );

NdisAllocateBuffer(
&Status,
&pHeadBuffer,
//pAdapt->hRcvBufferPoolHandle,
pAdapt->RecvBufferPoolHandle,
pData,
HeaderBufferSize );
if( Status != NDIS_STATUS_SUCCESS )break;
pHeadBuffer->Next = NULL;

((PRSVD)(MyPacket->MiniportReserved))->pHeadBuffer = pHeadBuffer;
((PRSVD)(MyPacket->MiniportReserved))->OriginalPkt = NULL;
NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize );
MyPacket->Private.Head = NULL;
MyPacket->Private.Tail = NULL;

if( PacketSize > LookAheadBufferSize )
{
nTransfer = PacketSize;
NdisAllocateBuffer( &Status,
&pDataBuffer,
//pAdapt->hRcvBufferPoolHandle,
pAdapt->RecvBufferPoolHandle,
//((PUCHAR)pData) + HeaderBufferSize,
(PVOID)(pData + HeaderBufferSize),
nTransfer );
pDataBuffer->Next = NULL;

if( Status != NDIS_STATUS_SUCCESS ) break;

NdisChainBufferAtFront( MyPacket, pDataBuffer );
NdisTransferData( &Status,
pAdapt->BindingHandle,
MacReceiveContext,
0,
nTransfer,
MyPacket,
&nBytesTransfered );

}
else{
NdisMoveMemory( (CHAR *)pData + HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize );

NdisAllocateBuffer( &Status,
&pDataBuffer,
//pAdapt->hRcvBufferPoolHandle,
pAdapt->RecvBufferPoolHandle,
(PUCHAR)pData + HeaderBufferSize,
LookAheadBufferSize );
if( Status != NDIS_STATUS_SUCCESS ) break;
NdisChainBufferAtFront( MyPacket, pDataBuffer );
}
}while(FALSE);

if( Status == NDIS_STATUS_SUCCESS )
{
//NdisChainBufferAtFront( MyPacket, pHeadBuffer );
//NDIS_SET_PACKET_STATUS( MyPacket, NDIS_STATUS_RESOURCES );
//NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1 );
PtTransferDataComplete( pAdapt, MyPacket, Status, HeaderBufferSize + PacketSize );
break;
}

if( Status != NDIS_STATUS_SUCCESS && Status != NDIS_STATUS_PENDING );
{
if( MyPacket ) NdisDprFreePacket(MyPacket);
if( pHeadBuffer ) NdisFreeBuffer( pHeadBuffer );
if( pDataBuffer ) NdisFreeBuffer( pDataBuffer );
if( pData ) NdisFreeMemory( pData, HeaderBufferSize + PacketSize, 0 );
}
break;
*/
/* NdisMEthIndicateReceive(pAdapt->MiniportHandle,
MacReceiveContext,
HeaderBuffer,
HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize,
PacketSize);
*/


VOID
PtTransferDataComplete(
IN  NDIS_HANDLE ProtocolBindingContext,
IN  PNDIS_PACKET Packet,
IN  NDIS_STATUS Status,
IN  UINT BytesTransferred
)
/*++

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

Arguments:

Return Value:

--*/
{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
PUCHAR pPacketContent;
PRSVD Resvd;
UINT OffsetSize;
UINT result;
UINT PacketLen;
PNDIS_BUFFER PacketBuffer;
PNDIS_PACKET OffsetPacket;
PNDIS_BUFFER OffsetBuffer;
PUCHAR pBakContent;
UINT bufLength;

NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;

NDIS_STATUS status = NDIS_STATUS_SUCCESS;

DBGPRINT((\"in PtTransferDataComplete\\n\"));

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

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

Resvd = (PRSVD)(Packet->MiniportReserved);
OffsetPacket = (PNDIS_PACKET)Resvd->OriginalPkt;




if(pAdapt->MiniportHandle)
{
if (OffsetPacket==NULL)
{
NdisMTransferDataComplete(pAdapt->MiniportHandle,
Packet,
Status,
BytesTransferred);
}
else
{
PNDIS_MINIPORT_BLOCK h = (PNDIS_MINIPORT_BLOCK)pAdapt->MiniportHandle;//->PacketIndicateHandler;
UINT HdrSize = NDIS_GET_PACKET_HEADER_SIZE(Packet);
DbgBreakPoint();
status = NdisAllocateMemory(
&pPacketContent,
2000,
0,
HighestAcceptableAddress);

CopyPacket2Buf(OffsetPacket,pPacketContent,&OffsetSize);
CopyPacket2Buf(Packet,pPacketContent+OffsetSize,&PacketLen);//packetlen == bytestransferred

PacketLen+=OffsetSize;
// 手动释放offsetpacket
NdisUnchainBufferAtFront( OffsetPacket,&OffsetBuffer );
NdisQueryBufferSafe(OffsetBuffer,&pBakContent,&bufLength, 32 );
NdisFreeBuffer(OffsetBuffer);
NdisFreeMemory(pBakContent,2000,0);
NdisFreePacket(OffsetPacket);

memset(Packet->MiniportReserved,0,sizeof(Packet->MiniportReserved));

//result = RecvProcess(pAdapt,pPacketContent,&PacketLen);
//if( result == PACKET_REFUSE )
//{
// MPReturnPacket((NDIS_HANDLE)pAdapt,Packet);
// DbgPrint(\"recvprocess return packet_refuse\\n\");
// return;
//}
NdisUnchainBufferAtFront( Packet,&PacketBuffer );
NdisQueryBufferSafe(PacketBuffer,&pBakContent,&bufLength,32);
NdisFreeBuffer(PacketBuffer);
NdisFreeMemory(pBakContent,2000,0);
NdisAllocateBuffer(&status,&PacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketLen);
NdisChainBufferAtFront(Packet,PacketBuffer);
Packet->Private.Head->Next =NULL;
Packet->Private.Tail=NULL;
//NDIS_SET_PACKET_HEADER_SIZE(Packet,14);
NDIS_SET_PACKET_HEADER_SIZE(Packet,15);
NdisMIndicateReceivePacket(pAdapt->MiniportHandle ,&Packet,1);
if(NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING)
{
MPReturnPacket((NDIS_HANDLE)pAdapt,Packet);
}
}
}
/* PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_BUFFER pBuffer=0, pNextBuffer=0;
UINT nBufferLen, nTotalLen = 0;
PVOID pVirtualAddr = 0;

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

if(pAdapt->MiniportHandle)
{
NdisQueryPacket(
Packet,
NULL,
NULL,
&pBuffer,
NULL);

while( pBuffer )
{
NdisQueryBuffer( pBuffer, NULL, &nBufferLen );
nTotalLen += nBufferLen;
NdisGetNextBuffer( pBuffer, &pNextBuffer );
NdisFreeBuffer( pBuffer );
pBuffer = pNextBuffer;
}

pBuffer = ((PRSVD)(Packet->MiniportReserved))->pHeadBuffer;
NdisQueryBuffer( pBuffer, &pVirtualAddr, &nBufferLen );
nTotalLen += nBufferLen;
NdisAdjustBufferLength( pBuffer, nTotalLen );

Packet->Private.Head = NULL;
Packet->Private.Tail = NULL;
pBuffer->Next = NULL;
NdisChainBufferAtFront( Packet, pBuffer );

NdisMIndicateReceivePacket( pAdapt->MiniportHandle, &Packet, 1 );
if( NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING )
{
MPReturnPacket((NDIS_HANDLE)pAdapt,Packet);
}
}
*/
/*
PADAPT  pAdapt =(PADAPT)ProtocolBindingContext;

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

if(pAdapt->MiniportHandle)
{
 NdisMTransferDataComplete(pAdapt->MiniportHandle,
Packet,
Status,
BytesTransferred);
}
*/
}
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2002-03-13 15:31
诸位大虾,你们为什么不伸出你们的救援之手呀?
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2002-03-14 09:38
?
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2002-03-14 15:48
我要等高人的指点!!!
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2004-04-23 16:08
老大,问题解决了吗?
上一页 下一页
游客

返回顶部