KungFu
驱动大牛
驱动大牛
  • 注册日期2001-09-27
  • 最后登录2008-04-08
  • 粉丝0
  • 关注0
  • 积分221分
  • 威望24点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:4315回复:26

为什么得到的packet为空?

楼主#
更多 发布于:2002-03-03 14:06
在imd中,用NdisGetReceivedPacket得到的packet为null,但是,我可以正常上网。我用softice监视了很长时间,得到的全是null。此问题,有人提出过。但是没有合适的答案。

[编辑 -  3/3/02 作者: KungFu]
我不写驱动好多年
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-23 16:08
老大,问题解决了吗?
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-14 15:48
我要等高人的指点!!!
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-03-14 09:38
?
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-13 15:31
诸位大虾,你们为什么不伸出你们的救援之手呀?
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
5楼#
发布于: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分
6楼#
发布于:2002-03-12 16:39
请问xemexzj,huyg,在PtTransferDataComplete例程里面
pAdapt = pAdapt->pPrimaryAdapt;
pPrimaryAdapt是怎么得到的?在北京吗?我请你吃饭!!!!
xemexzj
驱动牛犊
驱动牛犊
  • 注册日期2001-11-07
  • 最后登录2006-03-15
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于: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
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-03-11 12:03
to: ysy
对于Packet==NULL我就是没有解决呀!否则也不用敬仰别人了!
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-03-11 11:05
老胡呀,诸位能决问题的大虾呀,你看看这个问题怎么解决...
代码就是上面老胡铁出来的那部分:
PtTransferDataComplete(...)
{
       ...
       Packet->Private.Tail=NULL;
       NDIS_SET_PACKET_HEADER_SIZE(Packet,14);
       NdisMIndicateReceivePacket(
                    pAdapt->MiniportHandle ,
                    &Packet,
                    1);
       ....
}
当执行NdisMIndicateReceivePacket时候,出现PageFault,你说该怎么办?
NdisMIndicateReceivePacket是不是就是执行((PNDIS_MINIPORT_BLOCK)(_H))->PacketIndicateHandler它呢?
xemexzj
驱动牛犊
驱动牛犊
  • 注册日期2001-11-07
  • 最后登录2006-03-15
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-03-07 14:56
请问版主,NdisMIndicateReceivePacket(...)中的Packet只能带一个buffer吗?
xeme
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-03-06 20:36
老大,不要拿兄弟们开涮好不好?如果我精于此道的话,我也就不问了!!唉,惨呀,这个如肉强食的世界!!!:(
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2002-03-06 19:06
非常简单:在产品说明书中注明:为保证本产品性能,请使用D-Link, 3COM等100M/10M自适应网卡。(请避免使用Realtek等品牌10M老式网卡)


这真是太有创意了,我简直受不了了。还有很多56k的moden
也用ndisxxxindicatepacket,那怎么办?
不再回忆从前,我已经生活在幸福当中。
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-03-06 16:18
非常简单:在产品说明书中注明:为保证本产品性能,请使用D-Link, 3COM等100M/10M自适应网卡。(请避免使用Realtek等品牌10M老式网卡)
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-03-06 10:14
blue老大,您说的是什么意思?是您也碰到了这问题吗?既然您已经解决了,能帮兄弟一把吗?谢谢!
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-03-05 16:07
Huyg: 我对你的敬仰有如江水,连绵不绝;又有如...
去年为解决这个问题,花了我一个月时间,但还是...,只好换卡。
受益非浅!!!
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-03-05 13:22
我用的是xp ddk的passthru,在2k上编译通过。
这是ptreceive里的一段代码,是huyg斑竹给的:
ptreceive(...)
{
...
pAdapt->IndicateRcvComplete = TRUE;
switch (pAdapt->Medium)
{
 case NdisMedium802_3:
 case NdisMediumWan:
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(\"prreceive: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);
break;
...
}

下面也是huyg斑竹给的,是pttransfercomplet,其中我注释掉了一部分。
VOID
PtTransferDataComplete(
IN  NDIS_HANDLE ProtocolBindingContext,
IN  PNDIS_PACKET Packet,
IN  NDIS_STATUS Status,
IN  UINT BytesTransferred
)
/*++

Routine Description:

Entry point called by NDIS to indicate completion of a call by us
to NdisTransferData.

See notes under SendComplete.

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
{
//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));

MPReturnPacket((NDIS_HANDLE)pAdapt,Packet);
return;
//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);
NdisMIndicateReceivePacket(pAdapt->MiniportHandle ,&Packet,1);
if(NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING)
{
MPReturnPacket((NDIS_HANDLE)pAdapt,Packet);
}
}
}

一旦加载这个驱动,page fault。还请hu大虾看看是怎么回事?谢谢!
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
17楼#
发布于:2002-03-04 18:16
的确如此,您上面贴出的code是放在ndisXXXindicatepacket后面呢还是前面?
这些新分配的资源怎样free呢?应该是在PtTransferDataComplete里吧?
其实也不是戴高帽,古语说达者为师!


忘掉那行ndisXXXindicatepacket吧。很简单,删掉它,以及那个
switch,因为我们不再需要它了。我们要对所有的medium做通用
处理,只需要用ndisindicatepacket。整个函数的结构如下:
if (ndisgetpacket!=null)
{
//第一种情况
ndisindicatepacket
}
else if (PacketSize <= LookAheadBufferSize)
{
//第二种情况

switch(medium)
{
case 802.3:
setpacketheadsize(14);
case fddi:
}
ndisindicatepacket
}
else
{
//第三种情况
case 802.3:
setpacketheadsize(14);
case fddi:

ndistransferdata();
if ( Status != NDIS_STATUS_PENDING )
{
PtTransferDataComplete( (NDIS_HANDLE)pAdapt, MyPacket, Status, BytesTransferred );
}

}

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
{
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);
NdisMIndicateReceivePacket(pAdapt->MiniportHandle ,&Packet,1);
if(NDIS_GET_PACKET_STATUS(Packet) != NDIS_STATUS_PENDING)
{
MPReturnPacket((NDIS_HANDLE)pAdapt,Packet);
}
}
}
}

不再回忆从前,我已经生活在幸福当中。
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-03-04 17:33
MPTransferData与在ptreceive里面调用NdisTransferData有关系吗?
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-03-04 17:28
huyg别见笑,这是我在PtTransferDataComplete里面做的工作。但是问题出在哪里呢?

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

Routine Description:

Entry point called by NDIS to indicate completion of a call by us
to NdisTransferData.

See notes under SendComplete.

Arguments:

Return Value:

--*/
{
PADAPT  pAdapt =(PADAPT)ProtocolBindingContext;

DBGPRINT((\"Transfer complete\\n\"));

// if(pAdapt->MiniportHandle)
// {
// NdisMTransferDataComplete(pAdapt->MiniportHandle,
//  Packet,
//  Status,
//  BytesTransferred);
// }
do{
   PNDIS_PACKET            MyPacket, MyPacket2;
   PUCHAR                  pPacketContent, pBakBuffer;
   UINT                    BytesTransferred;
   PNDIS_BUFFER            PacketBuffer, OffsetBuffer;
   ULONG BufferLength, TotalLength;
   PRSVD Resvd;
   
   MyPacket = Packet;
Resvd =(PRSVD)(MyPacket->MiniportReserved);
MyPacket2 = (PNDIS_PACKET)Resvd->OriginalPkt;

        NdisGetFirstBufferFromPacket(
            MyPacket2,
            &OffsetBuffer,
            (PVOID *)&pBakBuffer,
            &BufferLength,
            &TotalLength);

if(pAdapt->MiniportHandle)
{
NdisMTransferDataComplete(pAdapt->MiniportHandle,
 MyPacket2,
 Status,
 BufferLength);
}
//        NdisFreePacket(MyPacket2);

//        NdisFreeBuffer(OffsetBuffer);

//        NdisFreeMemory(
//         pBakBuffer,
//         0,
//         0
//         );

        NdisGetFirstBufferFromPacket(
            MyPacket,
            &PacketBuffer,
            (PVOID *)&pPacketContent,
            &BufferLength,
            &TotalLength);

        NdisFreePacket(MyPacket);

        NdisFreeBuffer(PacketBuffer);

        NdisFreeMemory(
         pPacketContent,
         0,
         0
         );
//pAdapt->RecvPacketPoolHandle
    }while(0);
// PtTransferDataCompleteFreeMydata(
// ProtocolBindingContext,
// Packet,              
// Status,              
// BytesTransferred      
// );
}
上一页
游客

返回顶部