阅读:2161回复:5
NdisSend发送包之后IP校验和变为0x0000问题,及驱动卸载时挂起问题,请高手赐教
我在MPSend中对Packet内容进行修改,数据修改后自己重新组包,在NdisSend之前查看包的数据(IP校验和,tcp校验和)都正确,包发送完成后,在PtSendComplete再查看,IP校验和为0x0000,其他数据均未改变;使用抓包工具抓包,显示ip校验和也是0x00,抓包工具提示的正确IP校验和同我调用NdisSend发送之前计算的是一致,证明我的IP校验和没有计算错误;
麻烦高手帮忙分析分析原因。谢谢 |
|
沙发#
发布于:2007-10-05 15:33
是否使用了硬件校验核?如果使用了硬件校验,则在网卡驱动时会重新计算,那么这时候就是0。所以要设置号数据报校验位。
|
|
|
板凳#
发布于:2007-10-08 16:41
“设置好数据报校验位”,我是刚刚接触NDIS驱动开发,大侠能说详细点吗?谢谢;
另外有个问题,就是我在MPSend中修改数据包并发送后,如果发送成功调用NdisMSendComplete,如果发送暂缓,在PtSendComplete中处理,并且也调用了NdisMSendComplete;但卸载驱动时还会在调用NdisIMCancelInitializeDeviceInstance函数时挂起,不能卸载; 查了很多资料都说时因为没有调用NdisMSendComplete引起了,可是我已经调用了,请大侠指点! |
|
地板#
发布于:2007-10-11 23:34
1.如果是在Ndis中间层做NdisSend,需要注意OriginalPacket是Miniport格式还是Protocol格式
2.NdisSend为数据包描述符(中间层驱动程序提交的)返回NDIS_STATUS_SUCCESS状态标志后,不是将包描述符返回给ProtocolSendComplete函数,就是将中间层驱动程序分配的数据包返回给MiniportReturnPacket函数 3.尽量不要采用"分配了包描述符和链接的缓冲区"方式处理包,应采用更加科学的"重用数据包"(重新初始化并重用其所分配的包描述符、重用任何中间层驱动程序分配的链接缓冲区描述符和缓冲区) 4.OOB信息,OOB结构大致如下: typedef struct _ NDIS_PACKET_OOB_DATA{ union{ ULONGLONG TimeToSend; ULONGLONG TimeSend; }; ULONGLONG TimeReceived; UINT HeaderSize; UINT SizeMediaSpecificInfo; PVOID MediaSpecificInformation; NDIS_STATUS Status; } NDIS_PACKET_OOB_DATA, * PNDIS_PACKET_OOB_DATA 5.DDK文档一定要读,要相信科学 |
|
地下室#
发布于:2007-10-13 11:20
Re:NdisSend发送包之后IP校验和变为0x0000问题,及驱动卸载时挂起问题,请高
驱动卸载时挂起问题已经解决,是由于PtSendComplete中释放资源代码有一处bug,资源没有完全释放导致的。硬件校验和问题还望高手指点,在发送和接收时应该如何处理?应该注意些什么问题? |
|
5楼#
发布于:2007-11-08 19:19
如果使用了硬件校验,如何对数据报的校验位处理,把它设置位零?
另外我们能否根据原始数据报的校验位为零来判断使用了硬件校验呢 |
|