xtaddqqug
驱动牛犊
驱动牛犊
  • 注册日期2002-06-14
  • 最后登录2008-11-29
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望6点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1261回复:1

抓包问题(asmsys请进)

楼主#
更多 发布于:2004-05-31 20:50
asmsys您好,很久没向您问候了!
我用PASSTHRU抓包时遇到了这样一个问题。
就是用NDIS中发必须的函数:
ProtocolReceive(
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;
PNDIS_BUFFER    CurrentBuffer;
PVOID VirtualAddress;
UINT CurrentLength;
UINT  PhysicalBufferCount;
UINT  BufferCount;
UINT  TotalPacketLength;
UINT i;
DBGPRINT(\"==> Passthru Protocol PtReceive\\n\");
if(!pAdapt->MiniportHandle)
{
Status = NDIS_STATUS_FAILURE;
DBGPRINT(\"pAdapt->MiniportHandle=NULL\\n\");
}
else do
{
if(pAdapt->isSecondary)
{
//DBGPRINT(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\");
ASSERT(0);
}

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

if(Packet == NULL)
{
DbgPrint(\"Recive Packet = NULL\");
}
else
{
DbgPrint(\"The Receive BufferCount is %d\",BufferCount);
while(CurrentBuffer)
{
NdisQueryBuffer(CurrentBuffer,&VirtualAddress,&CurrentLength);
/*DBGPRINT(\"<==The Packet length:==\");*/
DbgPrint(\"<==The  Receive Packet length=%d==\",CurrentLength);
DBGPRINT(\"<==The Receive Packet Content:==\");

for(i=0;i<CurrentLength;i++)
{
DbgPrint(\"%2.2X \",((UCHAR *)VirtualAddress));
if(i%16==15)
{
DbgPrint(\"\\n\");
DbgPrint(\"<==The Receive Packet Content:==\");
}
}
NdisGetNextBuffer(CurrentBuffer,&CurrentBuffer);
}


}
pAdapt->IndicateRcvComplete = TRUE;
switch(pAdapt->Medium)
{
 case NdisMedium802_3:
NdisMEthIndicateReceive(pAdapt->MiniportHandle,
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);

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

return Status;
}
调试时看不到抓到的数据。不知代码是否有问题。但用可选的函数 :
ProtocolReceivePacket(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet
)
{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
NDIS_STATUS Status;
PRSVD Resvd;
PNDIS_BUFFER    CurrentBuffer;
PVOID VirtualAddress;
UINT CurrentLength;
UINT  PhysicalBufferCount;
UINT  BufferCount;
UINT  TotalPacketLength;
UINT i;
//DBGPRINT(\"==> Passthru Protocol PtReceivePacket\\n\");

if(!pAdapt->MiniportHandle) return 0;

if(pAdapt->isSecondary)
{
 //DBGPRINT(\"PASSTHRU GETTING RECEIVES ON SECONDARY\\n\");
 ASSERT(0);
}
NdisQueryPacket(Packet,&PhysicalBufferCount,&BufferCount,&CurrentBuffer,&TotalPacketLength);
DbgPrint(\"The Receive BufferCount is %d\",BufferCount);
while(CurrentBuffer)
{
NdisQueryBuffer(CurrentBuffer,&VirtualAddress,&CurrentLength);
/*DBGPRINT(\"<==The Packet length:==\");*/
DbgPrint(\"<==The  Receive Packet length=%d==\",CurrentLength);
DBGPRINT(\"<==The Receive Packet Content:==\");

for(i=0;i<CurrentLength;i++)
{
DbgPrint(\"%2.2X \",((UCHAR *)VirtualAddress));
if(i%16==15)
{
DbgPrint(\"\\n\");
DBGPRINT(\"<==The Receive Packet Content:==\");
}
}
NdisGetNextBuffer(CurrentBuffer,&CurrentBuffer);
}


}
却可以,您告诉我为什么吗?

asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-01 09:55
首先,ProtocolReceivePacket是必须的函数,不是可选的。MiniportSendPacket才是可选的。这个要搞清楚。
新网卡用PtReceivePacket,老式的RTL8029等用PtReceive.就这么简单。
从本质上讲,PtReceive被调用有两种情况:
1、当下层的miniport调用NdisMXxxIndicate的时候,NDIS总是调用ProtocolReceive函数。
2、这时候底层的miniport有可能资源不足,为了能够让上层驱动程序迅速放弃对数据包控制权,它在每一个数据包的带外数据块中设置status属性为NDIS_STATUS_SOURCE,这样就迫使NDIS转而调用ProtocolReceive函数,强迫IMD拷贝每一个数据包。
当情况2发生时,Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);就不返回空。
游客

返回顶部