dkingfirst
驱动牛犊
驱动牛犊
  • 注册日期2003-12-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1601回复:8

求救!在PtReceiveComplete中调用NdisMIndicateReceivePacket发生页面错误

楼主#
更多 发布于:2003-12-22 23:03
在中间层驱动中,按照ddk文档的说法我在PtRecive(我的网卡调用的是这个函数)中拷贝数据组装新的packet,在PtReceiveComplete中调用NdisMIndicateReceivePacket向上indicate时发生页面错误,
NdisMIndicateReceivePacket在 Deserialized 的调用者可以运行在
IRQL <= DISPATCH_LEVEL 吗,我的PtReceiveComplete函数运行在dispatch level 。在PtReceiveComplete可以调用,indicate函数吗,为什么会有页面错误呢,恳请大拿指点一二,,,, :mad: :mad:
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-23 00:24
PTRECEIVECOMPLETE不是用来向上传包的,它用来通知上层NIC再次就绪可用。
你在PTRECEIVE里面就向上面INDICATE啊,为什么要放到PTRECEIVE里面?如果你要INDICATE上去的包要用NDISTRANSFERDATA自己传完再在PTTRANSFERDATACOMPLETE里面INDICATE。
根据地的兄弟们,团结就是力量
dkingfirst
驱动牛犊
驱动牛犊
  • 注册日期2003-12-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-23 11:31
先谢谢了,还有一点不明白,DDK文档上说在PtReceive中不要对包数据进行处理,只要拷贝下来在PtReceiveComplet中可以进行后续处理,我想在PtReceive函数中拷贝数据,然后修改数据的内容再传递给上层,如果在PtReceive中修改不是影响性能吗,我修改以后才能传递给上层。对于那些小数据报文没有调用transferdata函数。
如果我想修改后再传递给上层那么我应该在哪儿调用向上indicate的函数呢

[编辑 -  12/23/03 by  dkingfirst]
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-12-23 21:05
就在PTRECEIVE里面做,你准备如何处理,我看看行不
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-23 21:16
我有看了看,是说的这段?
A driver writer should minimize the amount of time spent in the ProtocolReceive function so that the protocol does not lose additional incoming packets, particularly from underlying drivers that call the filter-specific NdisM..IndicateReceive functions. ProtocolReceive must either reject an incoming packet or recognize the packet as of interest to its client(s) quickly. If it accepts the packet, ProtocolReceive must find a place to put packet data and copy the data quickly. Shortly after ProtocolReceive returns, when time constraints are not so severe, any underlying miniport that made one or more indications with NdisM..IndicateReceive will call the corresponding NdisM..IndicateReceiveComplete. The protocol driver\'s ProtocolReceiveComplete function then performs any necessary postprocessing for the original indication(s).

我想如果在这里面做INDICATE也不是不能试试,从理论上讲,只要下面INDICATE,上面就会认为是收到一个包,然后就会处理,关键是对这个操作格外小心,不要让系统在你INDICATE以后还会去做错误的动作,比如再去TRANSFERDATA,另外注意,INDICATE后上层会调用你注册的MINIPORTRETURN,在这里面你要释放你INDICATE上去的时候分配的资源
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-12-23 21:21
另外,注意你在PTRECEIV里面做INDICATE,上层可能不能同不返回,不要忘了PTRECEIVECOMPLETE的主要功能是用NdisM...IndicateReceiveComplete告诉上层NIC重就续,这个动作在INDICATE前做还是后做你要试试,我认为前比较好,试验结果告知:),谢谢
根据地的兄弟们,团结就是力量
dkingfirst
驱动牛犊
驱动牛犊
  • 注册日期2003-12-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-12-25 12:33
我在PrReceive中自己分配的内存和包描述呼,向上层用的是NdisIndicateRecievePacket函数,所以在PtReceiveComplet中是不要调用NdisMIndicateReceiveComplete函数(passthru例子就是这样的),我改成在PtReceive函数中向上Indicate 和向下 NdisSend都可以,MPReturnPacket 也释放了我的资源,
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-12-25 17:32
NdisMIndicateReceiveComplete这个应该是
NdisM....IndicateReceiveComplete吧?好像没有前面那个,这个应该是用于重开放NIC的源语,不是用于NdisMIndicateRecievePacket的异步结束操作,它的异步结束操作试MINIPORTRETURN,结果做出来了没有?
根据地的兄弟们,团结就是力量
dkingfirst
驱动牛犊
驱动牛犊
  • 注册日期2003-12-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-12-25 21:12
是的应该是NdisMXXXIndicatereceiveComplete,文档上说
ProtocolReceiveComplete performs postprocessing, such as notifying interested clients of processed data received from a remote node, after one or more calls to the driver\'s ProtocolReceive function
NDIS always calls ProtocolReceiveComplete after one or more calls to the driver\'s ProtocolReceive function, regardless of whether any particular packet(s) are accepted by bound protocols.
不知道为什么在这儿向上调用NdisMIndicatereceviePacket就会蓝屏,而在PtReceive就可以。softice单步到这儿就是无效指令,
游客

返回顶部