阅读:2007回复:4
请问怎么在MPTransferData和PtTransferDataComplete里替换成自己的包?
大家都知道,在passthru里收包过滤的地方有四个:PtReceive、PtReceivePacket、MPTransferData、PtTransferDataComplete
我想在收包的时候实现用另外一个自己组的包替换掉原来的包。PtReceive、PtReceivePacket例子里新的NDIS_PACKET都构造好了,自己填buffer就行了,然后再处理一下释放函数PtSendComplete和MPReturnPacket就行了。比较简单。 但是MPTransferData、PtTransferDataComplete应该如何替换包呢?需不需要向上面一样处理什么释放函数? |
|
沙发#
发布于:2012-12-18 11:37
中间层驱动要么触发PtReceivePacket,要么触发PtReceive。触发PtReceived的时候,中间层会继续向网卡驱动获取数据,网卡驱动提交后续数据,会触发MPTransferData,提交完了,会触发PtTransferDataComplete。
PtReceive里面无法获取到一个完整的packet,导致后面两个函数触发的机会非常少。以前我一个驱动,在后两个处理函数中有个bug,在项目中运行了很久都没出问题,后来有一款无线网卡,做了特殊设置,碰上无线信号不好,才走到后面两个函数,蓝屏了。 严重推荐《寒江独钓》,网络上也有很多相关博客。 |
|
板凳#
发布于:2012-12-18 16:41
帮忙顶..等待高手
|
|
地板#
发布于:2012-12-30 15:56
直接设置成失败就OK
|
|
|
地下室#
发布于:2013-03-03 13:01
好吧。。确实我从调试信息里从没见过MPTransferData、PtTransferDataComplete的调用,不过还是很想知道应该怎么修改buffer,怎么释放MyPacket
另外LS说的,只有MPTransferData有状态返回值,可以设置成失败,但是PtTransferDataComplete返回值是void,又该如何处理呢? 现在我是MPTransferData返回NDIS_STATUS_FAILURE,PtTransferDataComplete就直接return了,连最后的NdisMTransferDataComplete都不要了,这样做可以吗? NDIS_STATUS MPTransferData( OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred, IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE MiniportReceiveContext, IN UINT ByteOffset, IN UINT BytesToTransfer ) VOID PtTransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred ) |
|