阅读:1918回复:6
NdisMEthIndicateReceive出错(40分)
为什么我调用NdisMEthIndicateReceive之后,用抓包工具看不到送上来的包呢,测试软件也接受不到送上来的数据包。
真搞不明白,求救 |
|
沙发#
发布于:2004-06-04 20:51
一般来说,(呵呵,至少在我这是这样)sniffer工作在NDIS中间驱动程序的下面。也就是说进来的包先经过你的驱动,再经过sniffer,如果你对包的处理不当,在经过你驱动的时候就被打下来了,sniffer怎能嗅得到?更不用说那些工作在用户层的工具了。
|
|
板凳#
发布于: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] |
|
地板#
发布于:2004-06-07 09:26
PacketSize有时会大于LookAheadBufferSize,有时会小于LookAheadBufferSize,你处理的太绝对了。
当PacketSize有时会大于LookAheadBufferSize时,你必须取得剩余的数据然后才能向上传数据。 [编辑 - 6/7/04 by asmsys] [编辑 - 6/7/04 by asmsys] |
|
地下室#
发布于: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,这是我的理解,不知道对否? 还有,我的包的转发问题还没有解决。我又开了一帖子,有时间能过去看看吗?谢谢了 |
|
5楼#
发布于:2004-06-07 11:47
给我感觉你的NdisMEthIndicateReceive参数有问题,试试这个
NdisMEthIndicateReceive( pAdapter->MiniportHandle, MacReceiveContext, VirtualAddress , HeaderBufferSize, (PUCHAR)VirtualAddress+HeaderBufferSize, LookAheadBufferSize, BytesAllocated-HeaderBufferSize); |
|
6楼#
发布于:2004-06-07 18:39
asmsys,你说的这个packetsize=以太网全长,我有点不明白。 当LookAheadBufferSize>packetsize时, 表示所有的数据都在LookAheadBuffer里, 否则仅仅是一部分数据, 另外一部分数据(packetsize- LookAheadBufferSize)没有Indicate上来, 需要调用NdisTransferData来获取.比较早的NIC驱动程序, 都是用后面那种方式, 这时用NdisMEthIndicateReceive来Indicate数据(Packet). 不然只要调用NdisMIndicateReceivePacket就可以了. |
|