nicklezhang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-29
  • 最后登录2017-06-19
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望145点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1918回复:6

NdisMEthIndicateReceive出错(40分)

楼主#
更多 发布于:2004-06-04 16:11
为什么我调用NdisMEthIndicateReceive之后,用抓包工具看不到送上来的包呢,测试软件也接受不到送上来的数据包。
真搞不明白,求救
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-04 20:51
一般来说,(呵呵,至少在我这是这样)sniffer工作在NDIS中间驱动程序的下面。也就是说进来的包先经过你的驱动,再经过sniffer,如果你对包的处理不当,在经过你驱动的时候就被打下来了,sniffer怎能嗅得到?更不用说那些工作在用户层的工具了。
nicklezhang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-29
  • 最后登录2017-06-19
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望145点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-06-07 07:35
我知道是因为数据没有被成功送上去,但问题是错在哪里呢:
NdisMEthIndicateReceive(
          pAdapter->MiniportHandle,
          MacReceiveContext,
          VirtualAddress ,
          HeaderBufferSize,
         (PUCHAR)VirtualAddress+HeaderBufferSize,
         BytesAllocated-HeaderBufferSize,
         BytesAllocated-HeaderBufferSize);
packetsize也就是这里的BytesAllocated-HeaderBufferSize被我一次性全交上去了,packetsize=以太网帧全长-以太网头长度
然而,我的调用每次都不能把包交上去,为什么!?
其中我把所有的数据都拷到了VirtualAddress的地方,也就是说,对于packetsize>lookaheadbuffersize的情况,我都用NdisTransferData考完数据了,而且结果正确。现在我不用 NdisMEthIndicateReceive了,我重新打包然后用NdisReceivePacket,现在成功了。

[编辑 -  6/8/04 by  nicklezhang]
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-07 09:26
PacketSize有时会大于LookAheadBufferSize,有时会小于LookAheadBufferSize,你处理的太绝对了。
当PacketSize有时会大于LookAheadBufferSize时,你必须取得剩余的数据然后才能向上传数据。



[编辑 -  6/7/04 by  asmsys]

[编辑 -  6/7/04 by  asmsys]
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-07 10:03
asmsys,你说的这个packetsize=以太网全长,我有点不明白。
在Ptreceive中把HeaderBufferSize,LookAheadBufferSize,PacketSize。把这些都打印出来的时候发现,当LookAheadBufferSize<=128的时候,会有这样的结果(e.g):
==> Passthru Protocol PtReceive
CurrentAdapterHandle: 4290488952
MacReceiveHandle: 4290261000
HeaderBufferPointer: 4165953592
HeaderBufferSize: 14
LookAheadBufferPointer: 4165953606
LookAheadBufferSize: 54
PacketSize: 54

<== Passthru Protocol PtReceive
*** XPASSHTRU.SYS ***
<== Passthru Protocol PtReceiveComplete
这个比较小的包直接就接收了而没有经过TransferData。如果packetsize=全长的话,那packetsize是不是应该==14+54了?而不是PacketSize: 54,这是我的理解,不知道对否?

还有,我的包的转发问题还没有解决。我又开了一帖子,有时间能过去看看吗?谢谢了
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-07 11:47
给我感觉你的NdisMEthIndicateReceive参数有问题,试试这个
NdisMEthIndicateReceive(
pAdapter->MiniportHandle,
MacReceiveContext,
VirtualAddress ,
HeaderBufferSize,
(PUCHAR)VirtualAddress+HeaderBufferSize,
LookAheadBufferSize,
BytesAllocated-HeaderBufferSize);
LinX
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2007-07-05
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望10点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-07 18:39
asmsys,你说的这个packetsize=以太网全长,我有点不明白。
在Ptreceive中把HeaderBufferSize,LookAheadBufferSize,PacketSize。把这些都打印出来的时候发现,当LookAheadBufferSize<=128的时候,会有这样的结果(e.g):
==> Passthru Protocol PtReceive
CurrentAdapterHandle: 4290488952
MacReceiveHandle: 4290261000
HeaderBufferPointer: 4165953592
HeaderBufferSize: 14
LookAheadBufferPointer: 4165953606
LookAheadBufferSize: 54
PacketSize: 54

<== Passthru Protocol PtReceive
*** XPASSHTRU.SYS ***
<== Passthru Protocol PtReceiveComplete
这个比较小的包直接就接收了而没有经过TransferData。如果packetsize=全长的话,那packetsize是不是应该==14+54了?而不是PacketSize: 54,这是我的理解,不知道对否?

还有,我的包的转发问题还没有解决。我又开了一帖子,有时间能过去看看吗?谢谢了



当LookAheadBufferSize>packetsize时, 表示所有的数据都在LookAheadBuffer里, 否则仅仅是一部分数据, 另外一部分数据(packetsize- LookAheadBufferSize)没有Indicate上来, 需要调用NdisTransferData来获取.比较早的NIC驱动程序, 都是用后面那种方式, 这时用NdisMEthIndicateReceive来Indicate数据(Packet). 不然只要调用NdisMIndicateReceivePacket就可以了.
游客

返回顶部